Wikilivres
frwikibooks
https://fr.wikibooks.org/wiki/Accueil
MediaWiki 1.46.0-wmf.24
first-letter
Média
Spécial
Discussion
Utilisateur
Discussion utilisateur
Wikilivres
Discussion Wikilivres
Fichier
Discussion fichier
MediaWiki
Discussion MediaWiki
Modèle
Discussion modèle
Aide
Discussion aide
Catégorie
Discussion catégorie
Transwiki
Discussion Transwiki
Wikijunior
Discussion Wikijunior
TimedText
TimedText talk
Module
Discussion module
Event
Event talk
Philosophie
0
5270
764634
761905
2026-04-23T11:33:07Z
PandaMystique
119061
764634
wikitext
text/x-wiki
<div style="max-width: 980px; margin: 0 auto; font-family: -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; color: #2a2520;">
<!-- ══════════════════════════════════════════════
EN-TÊTE
══════════════════════════════════════════════ -->
<div style="background: #17151f; border-radius: 8px 8px 0 0; padding: 36px 44px 28px; text-align: center;">
<div style="font-size: 0.78em; letter-spacing: 0.5em; text-transform: uppercase; color: #d4a84e; margin-bottom: 14px; font-weight: 500;">✦ Portail Wikilivres ✦</div>
<div style="font-size: 3.6em; font-weight: 300; color: #f4efe4; letter-spacing: 0.25em; line-height: 1;">PHILOSOPHIE</div>
<table style="width: 100%; border-collapse: collapse; margin: 14px 0 12px;">
<tr>
<td style="border-bottom: 1px solid #d4a84e; width: 43%;"></td>
<td style="text-align: center; padding: 0 14px; color: #d4a84e; font-size: 0.8em; white-space: nowrap; width: 14%;">✦</td>
<td style="border-bottom: 1px solid #d4a84e; width: 43%;"></td>
</tr>
</table>
<div style="font-size: 0.98em; color: #b8b0d0; letter-spacing: 0.02em;">L'amour de la sagesse, de l'Antiquité à nos jours</div>
</div>
<!-- Bande chromatique -->
<div style="height: 5px; background: linear-gradient(90deg, #7a4232 0%, #c4a052 22%, #3a5948 45%, #3e4f6c 68%, #7a4232 100%); margin-bottom: 10px;"></div>
<!-- ══════════════════════════════════════════════
ÉPIGRAPHE
══════════════════════════════════════════════ -->
<div style="background: #f6f2ea; border: 1px solid #e8ddd0; border-radius: 6px; padding: 16px 22px 14px; margin-bottom: 8px;">
<table style="width: 100%; border-collapse: collapse;">
<tr>
<td style="width: 58px; vertical-align: top; text-align: center; padding-right: 14px; padding-top: 6px;">
<div style="font-size: 5em; line-height: 0.82; color: #b8923e; font-family: Georgia, 'Times New Roman', serif; font-weight: normal;">M</div>
</td>
<td style="vertical-align: top;">
<div style="font-size: 1em; color: #2e2620; line-height: 1.7;">ême jeune, on ne doit pas hésiter à philosopher. Ni, même au seuil de la vieillesse, se fatiguer de l'exercice philosophique. Il n'est jamais trop tôt, qui que l'on soit, ni trop tard pour l'assainissement de l'âme.</div>
<div style="margin-top: 10px; font-size: 0.84em; color: #5a4e3a; letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600;">Épicure · [[Commentaire philosophique/Lettre à Ménécée|Lettre à Ménécée]]</div>
</td>
</tr>
</table>
</div>
{{PhiloRecherche}}
<!-- ══════════════════════════════════════════════
EXPLORER
══════════════════════════════════════════════ -->
<table style="width: 100%; border-collapse: collapse; margin: 10px 0 6px;"><tr><td style="white-space: nowrap; padding-right: 10px; font-size: 0.82em; font-weight: 700; letter-spacing: 0.3em; text-transform: uppercase; color: #4e4232; vertical-align: middle; width: 1%;">Explorer</td><td style="vertical-align: middle;"><div style="height: 1px; background: #b8ae9c; font-size: 0; line-height: 0; margin: 0; padding: 0;"> </div></td></tr></table>
<table style="width: 100%; border-collapse: separate; border-spacing: 10px 0;">
<tr>
<!-- Disciplines -->
<td style="width: 33.33%; vertical-align: top; background: #bcd3bc; border-radius: 6px; border-top: 3px solid #1f4a2e; padding: 16px 18px;">
<div style="font-size: 1em; font-weight: 700; color: #14321c; margin-bottom: 8px; line-height: 1.3;">
<span style="color: #1f4a2e; margin-right: 5px;">◇</span>[[:Catégorie:Discipline philosophique|Les disciplines]]
</div>
<div style="font-size: 0.9em; color: #1e1a12; line-height: 1.65; margin-bottom: 10px;">
Les branches de la pensée : métaphysique, épistémologie, éthique, logique, esthétique, philosophie politique.
</div>
<div style="height: 1px; background: #8eb08e; margin-bottom: 10px;"></div>
<div style="font-size: 0.9em; color: #14321c; line-height: 1.9;">
→ [[Philosophie/Théorie de la connaissance|Théorie de la connaissance]]<br/>
→ [[:Catégorie:Philosophie de l'esprit|Philosophie de l'esprit]]
</div>
</td>
<!-- Œuvres commentées -->
<td style="width: 33.33%; vertical-align: top; background: #d9bc9c; border-radius: 6px; border-top: 3px solid #6a2e1e; padding: 16px 18px;">
<div style="font-size: 1em; font-weight: 700; color: #3f160a; margin-bottom: 10px; line-height: 1.3;">
<span style="color: #6a2e1e; margin-right: 5px;">❧</span>[[Philosophie/Histoire de la philosophie|Œuvres commentées]]
</div>
<div style="font-size: 0.9em; color: #1e1a12; line-height: 1.9;">
→ [[Commentaire philosophique/Lettre à Ménécée|Lettre à Ménécée]] <span style="color: #5a3e28; font-size: 0.82em; letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600;">Épicure</span><br/>
→ [[Méditations métaphysiques|Méditations métaphysiques]] <span style="color: #5a3e28; font-size: 0.82em; letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600;">Descartes</span><br/>
→ [[Commentaire de l'Éthique|Éthique]] <span style="color: #5a3e28; font-size: 0.82em; letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600;">Spinoza</span><br/>
→ [[Philosophie/Commentaire du passage à propos de l'Homme esclave du divertissement|Le divertissement]] <span style="color: #5a3e28; font-size: 0.82em; letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600;">Pascal</span>
</div>
<div style="height: 1px; background: #b0906e; margin: 10px 0 8px;"></div>
<div style="font-size: 0.86em; color: #6a2e1e; font-weight: 500;">[[Philosophie/Histoire de la philosophie|Tous les commentaires →]]</div>
</td>
<!-- Philosophes -->
<td style="width: 33.33%; vertical-align: top; background: #aebad6; border-radius: 6px; border-top: 3px solid #233558; padding: 16px 18px;">
<div style="font-size: 1em; font-weight: 700; color: #141e32; margin-bottom: 10px; line-height: 1.3;">
<span style="color: #233558; margin-right: 5px;">☉</span>[[:Catégorie:Philosophe|Philosophes]]
</div>
<div style="font-size: 0.9em; color: #1e1a12; line-height: 1.9;">
→ [[Philosophie/Thalès de Milet|Thalès de Milet]] <span style="color: #2f3e5a; font-size: 0.86em;">v. 625 av. J.-C.</span><br/>
→ [[Dictionnaire de philosophie/Anaxagore|Anaxagore]] <span style="color: #2f3e5a; font-size: 0.86em;">v. 500 av. J.-C.</span><br/>
→ [[Pour lire Platon|Platon]] <span style="color: #2f3e5a; font-size: 0.86em;">428 av. J.-C.</span><br/>
→ [[Philosophie/Nietzsche|Nietzsche]] <span style="color: #2f3e5a; font-size: 0.86em;">1844</span>
</div>
<div style="height: 1px; background: #7a8aae; margin: 10px 0 8px;"></div>
<div style="font-size: 0.86em; color: #233558; font-weight: 500;">[[:Catégorie:Philosophe|Tous les philosophes →]]</div>
</td>
</tr>
</table>
<!-- ══════════════════════════════════════════════
APPRENDRE
══════════════════════════════════════════════ -->
<table style="width: 100%; border-collapse: collapse; margin: 10px 0 6px;"><tr><td style="white-space: nowrap; padding-right: 10px; font-size: 0.82em; font-weight: 700; letter-spacing: 0.3em; text-transform: uppercase; color: #4e4232; vertical-align: middle; width: 1%;">Apprendre</td><td style="vertical-align: middle;"><div style="height: 1px; background: #b8ae9c; font-size: 0; line-height: 0; margin: 0; padding: 0;"> </div></td></tr></table>
<table style="width: 100%; border-collapse: separate; border-spacing: 10px 0;">
<tr>
<td style="width: 50%; vertical-align: top; background: #e2d4b0; border-left: 3px solid #b8923e; border-radius: 0 5px 5px 0; padding: 14px 18px;">
<div style="font-size: 0.74em; font-weight: 700; letter-spacing: 0.3em; text-transform: uppercase; color: #5a4820; margin-bottom: 9px;">Manuels</div>
<div style="font-size: 0.94em; color: #251e10; line-height: 1.95;">
→ [[Manuel de terminale de philosophie|Manuel de terminale]]<br/>
→ [[Philosophie/Une brève introduction|Une brève introduction à la philosophie]]
</div>
</td>
<td style="width: 50%; vertical-align: top; background: #e2d4b0; border-left: 3px solid #b8923e; border-radius: 0 5px 5px 0; padding: 14px 18px;">
<div style="font-size: 0.74em; font-weight: 700; letter-spacing: 0.3em; text-transform: uppercase; color: #5a4820; margin-bottom: 9px;">Vocabulaires</div>
<div style="font-size: 0.94em; color: #251e10; line-height: 1.95;">
→ [[Pour lire Platon/Vocabulaire|Platon]]<br/>
→ [[Philosophie/Vocabulaire/David Hume|David Hume]] · [[Philosophie/Vocabulaire/Kant|Kant]]
</div>
</td>
</tr>
</table>
<!-- ══════════════════════════════════════════════
DICTIONNAIRE
══════════════════════════════════════════════ -->
<table style="width: 100%; border-collapse: collapse; margin: 10px 0 6px;"><tr><td style="white-space: nowrap; padding-right: 10px; font-size: 0.82em; font-weight: 700; letter-spacing: 0.3em; text-transform: uppercase; color: #4e4232; vertical-align: middle; width: 1%;">Dictionnaire</td><td style="vertical-align: middle;"><div style="height: 1px; background: #b8ae9c; font-size: 0; line-height: 0; margin: 0; padding: 0;"> </div></td></tr></table>
<div style="background: #17151f; border-radius: 8px; padding: 20px 26px;">
<table style="width: 100%; border-collapse: collapse;">
<tr>
<td style="vertical-align: middle; padding-right: 26px; border-right: 1px solid #352e48; white-space: nowrap; width: 200px;">
<div style="font-size: 1em; color: #f4efe4; margin-bottom: 4px; line-height: 1.3; font-weight: 500;">[[Dictionnaire de philosophie|Dictionnaire de philosophie]]</div>
<div style="font-size: 0.84em; color: #c8bca8; margin-bottom: 10px;">Concepts, termes et notions</div>
<div style="width: 28px; height: 2px; background: #d4a84e;"></div>
</td>
<td style="vertical-align: middle; padding-left: 26px;">
<div style="font-size: 1.16em; color: #e4c888; letter-spacing: 0.08em; font-family: Georgia, 'Times New Roman', serif; line-height: 1.3; margin-bottom: 11px;">
[[Dictionnaire de philosophie/A|A]]  
[[Dictionnaire de philosophie/B|B]]  
[[Dictionnaire de philosophie/C|C]]  
[[Dictionnaire de philosophie/D|D]]  
[[Dictionnaire de philosophie/E|E]]  
[[Dictionnaire de philosophie/F|F]]  
[[Dictionnaire de philosophie/G|G]]  
[[Dictionnaire de philosophie/H|H]]  
[[Dictionnaire de philosophie/I|I]]  
[[Dictionnaire de philosophie/J|J]]  
[[Dictionnaire de philosophie/K|K]]  
[[Dictionnaire de philosophie/L|L]]  
[[Dictionnaire de philosophie/M|M]]
</div>
<div style="font-size: 1.16em; color: #e4c888; letter-spacing: 0.08em; font-family: Georgia, 'Times New Roman', serif; line-height: 1.3;">
[[Dictionnaire de philosophie/N|N]]  
[[Dictionnaire de philosophie/O|O]]  
[[Dictionnaire de philosophie/P|P]]  
[[Dictionnaire de philosophie/Q|Q]]  
[[Dictionnaire de philosophie/R|R]]  
[[Dictionnaire de philosophie/S|S]]  
[[Dictionnaire de philosophie/T|T]]  
[[Dictionnaire de philosophie/U|U]]  
[[Dictionnaire de philosophie/V|V]]  
[[Dictionnaire de philosophie/W|W]]  
[[Dictionnaire de philosophie/X|X]]  
[[Dictionnaire de philosophie/Y|Y]]  
[[Dictionnaire de philosophie/Z|Z]]
</div>
</td>
</tr>
</table>
</div>
<!-- ══════════════════════════════════════════════
PIED DE PAGE
══════════════════════════════════════════════ -->
<div style="margin-top: 18px; padding: 10px 24px 8px; text-align: center; border-top: 1px solid #e8ddd0;">
<div style="font-size: 0.74em; letter-spacing: 0.35em; text-transform: uppercase; color: #5a4e3a; margin-bottom: 6px; font-weight: 600;">Autres projets Wikimedia</div>
<div style="font-size: 0.92em; color: #3a3028;">
[[w:Philosophie|Wikipédia]] · [[wikt:philosophie|Wiktionnaire]] · [[v:Philosophie|Wikiversité]] · [[s:Portail:Philosophie|Wikisource]]
</div>
<div style="margin-top: 6px; font-size: 0.82em; color: #8a7a60; letter-spacing: 0.4em;">✦</div>
</div>
</div>
[[Catégorie:Philosophie|*]]
ivg7qy35xewv9wjhzydatg9srllmmps
Pour lire Platon/Guide des dialogues/Ion
0
29697
764593
764266
2026-04-23T01:00:32Z
JackBot
14683
Formatage, [[Spécial:Pages non catégorisées]]
764593
wikitext
text/x-wiki
== Introduction générale ==
=== Statut et datation du dialogue ===
{{wikisource|Ion (Platon)|Ion}}
L{{'}}''Ion'' est l'un des plus brefs dialogues du corpus platonicien, une douzaine de pages Stephanus (530a-542b) pour une conversation dont la durée fictive n'excède pas la demi-heure entre Socrate et le rapsode Ion d'Éphèse. Cette brièveté, jointe au caractère apparemment simpliste d'Ion comme interlocuteur, a longtemps nourri un soupçon d'inauthenticité ou de légèreté. Goethe voyait dans le dialogue « ''nichts als eine Persiflage'' » (« rien qu'une parodie »), et plusieurs philologues, Wilamowitz en tête, ont douté qu'il fût de Platon, avant que Wilamowitz lui-même, vers la fin de sa carrière, ne revienne partiellement sur son jugement. L'authenticité est aujourd'hui largement admise, sans être absolument consensuelle.
La datation reste débattue. Traditionnellement rangé parmi les dialogues de jeunesse, voire parmi les premiers écrits platoniciens,, l{{'}}''Ion'' a été rapproché par Albert Rijksbaron de la période où Platon rédigeait la ''République'' et le ''Phèdre'', sur la base d'un vocabulaire technique et de procédures argumentatives communs à ces œuvres. Cette thèse n'est pas universellement acceptée : plusieurs commentateurs maintiennent une date plus précoce, et les critères stylométriques sont ici peu concluants, comme le rappelle Aguirre.
La date dramatique fictive se laisse conjecturer à partir d'indices internes : Ion revient d'Épidaure, où il vient de remporter les concours rapsodiques des fêtes d'Asclépios, et attend les Grandes Panathénées à Athènes. La conversation se placerait donc vraisemblablement, mais sans certitude, dans la période précédant ces Panathénées, dont la journée principale tombait le 28 Hécatombéon. Rijksbaron note d'ailleurs que, si l'on accepte cette reconstruction, Ion aurait passé plusieurs semaines désœuvré à Athènes, ce qui n'est pas sans poser question.
=== Les deux personnages ===
Socrate apparaît ici tel qu'on le connaît : ironique, réservé, méthodique, se disant ''idiôtês'' (profane, 532d9) face aux « sages ». Il refuse d'emblée la qualification de ''sophos'' qu'Ion lui attribue (532d) et la renvoie, non sans malice, aux rapsodes, acteurs et poètes eux-mêmes.
Ion d'Éphèse est un rapsode présenté comme célèbre, mais son historicité reste incertaine : aucune source indépendante ne le mentionne, et il est possible qu'il s'agisse d'un personnage fictif. Le portrait qu'en donne le dialogue correspond en tout cas, dans ses grandes lignes, au type social du rapsode professionnel tel qu'on peut le reconstituer pour l'époque classique : tournée de concours, prestations en tenue somptueuse avec couronne d'or, rémunération substantielle, prétention à être non seulement récitant mais ''hermêneus'' (interprète) de la pensée du poète, et ambition de se poser en éducateur au titre de spécialiste d'Homère. Il ne faut toutefois pas confondre le temps dramatique du dialogue, le temps de Platon écrivant, et les pratiques attestées de la rhapsodie : le texte est un portrait littéraire, construit pour les besoins de l'argument, avant d'être un document historique sur les rhapsodes.
Par ce personnage, Platon vise un ensemble : l'héritier de l'aède, qui a renoncé à la cithare mais garde le ''rhabdos'' (bâton), et qui porte la culture épique dans les festivals publics. Cette figure condense, aux yeux de Platon, le système éducatif traditionnel fondé sur la mémorisation et l'interprétation des poèmes homériques.
=== Structure générale et enjeu ===
Le dialogue s'articule en trois grandes sections organisées autour d'un noyau central :
* Partie I (530a-533c) : dialogue dialectique qui met en question la possibilité, pour Ion, de posséder une ''technê'' rhapsodique au sens strict, puisqu'il prétend n'être expert que d'Homère alors que la poésie, ''si'' elle est une ''technê'', constitue un tout.
* Partie II (533c-536d) : long développement de Socrate où la notion de ''technê'' est remplacée par celle d{{'}}''enthousiasmos'', une puissance divine (''theia dynamis'') qui fait du poète et du rapsode les maillons d'une chaîne magnétique partant de la Muse.
* Partie III (536d-541e) : retour à l'examen de la ''technê'' par l'analyse de passages homériques concrets, aboutissant au dilemme final.
* Épilogue (541e-542b) : alternative entre deux statuts qu'Ion peut revendiquer, injuste (s'il possède une ''technê'' qu'il refuse de montrer) ou divin (s'il n'en a pas).
La question du sens global du dialogue reste discutée. Une lecture forte, répandue chez les commentateurs modernes (Rijksbaron, Aguirre, von der Walde notamment), y voit un geste de disqualification de la poésie traditionnelle comme savoir et comme modèle éducatif du citoyen grec. Dans cette perspective, l{{'}}''Ion'' préparerait déjà les thèses du livre X de la ''République''. Une autre lecture, défendue notamment par Penelope Murray et reprise, avec des nuances, par Grace Ledbetter ou Suzanne Stern-Gillet, insiste davantage sur l'instabilité du texte : Socrate mobiliserait la doctrine de l'inspiration sans nécessairement l'endosser de façon simple, et le dialogue serait plus suggestif que conclusif. Le commentaire qui suit privilégie, par commodité d'exposition, la première ligne, tout en signalant, aux moments décisifs, les points où l'autre lecture peut légitimement se faire entendre.
== I. Le prologue (530a-531a) : la mise en place ==
=== 530a-b : les salutations et le contexte ===
Le dialogue s'ouvre sur une formule de salutation étonnamment solennelle : « Τὸν Ἴωνα χαίρειν », le nom propre à l'accusatif, précédé de l'article, suivi du verbe à l'infinitif. Ce n'est pas l'habituel « ὦ Ἴων » que Socrate utilise avec ses proches ; c'est une formule de déférence, presque protocolaire, qui présente Ion comme un personnage illustre. On peut y entendre, rétrospectivement, une charge ironique : la suite confirme que Socrate ne partage pas, en réalité, l'estime que suggère ce salut.
Les salutations révèlent que les deux hommes se connaissent déjà : Socrate sait qu'Ion est Éphésien, connaît son activité et le motif de son séjour à Athènes. L'échange initial, avec son ''hêmin'' (« nous ») qui feint la camaraderie, crée une connivence qui se dissipera à mesure que Socrate reprendra ses distances.
Ion vient de remporter « les premiers prix » à Épidaure, lors des concours rapsodiques associés aux fêtes d'Asclépios, et espère vaincre également aux Panathénées athéniennes, les deux plus importants festivals rapsodiques du monde grec. Cette double mention établit le prestige d'Ion ; elle peut aussi, plus discrètement, poser la question de la valeur réelle d'une couronne remportée dans de telles compétitions. La vie itinérante du rapsode, toujours en voyage d'un concours à l'autre, est un trait qui le rapproche du mode de vie des sophistes, et contraste avec l'enracinement athénien de Socrate (qui n'a quitté Athènes que pour trois campagnes militaires).
=== 530b-c : la double dimension du rapsode ===
Socrate enchaîne sur un éloge du rapsode qui pose, en réalité, les termes conceptuels de la discussion à venir. Trois motifs se détachent :
# L'apparence (''kekosmêsthai'') : le rapsode se présente dans une tenue somptueuse qui convient à son art. Cet aspect physique reviendra à plusieurs reprises (535d, 541c) et sera tourné en dérision.
# La fréquentation des poètes : le rapsode est nécessairement en contact avec les plus grands, « en particulier avec Homère, le meilleur et le plus divin (''theiotatos'') de tous ». Le qualificatif ''theiotatos'' appliqué à Homère est suggestif : il prépare la terminologie qui structurera la conclusion du dialogue, où « divin » sera opposé à « technicien ».
# L'exigence herméneutique : le rapsode ne doit pas seulement mémoriser les vers (''ta epê'') mais en saisir la pensée (''dianoia'') : « il ne serait pas un bon rapsode s'il ne comprenait pas ce que dit le poète » (530b-c). Cette phrase installe le cadre épistémique dans lequel Socrate va conduire l'examen : ''epê'' d'un côté, ''dianoia'' de l'autre, mots et pensée.
Le vocabulaire cognitif est dense : ''syniénai, gignôskein, epistasthai, phrontizein, krinein, eidenai'', toute une constellation qui amène insensiblement la rhapsodie sur le terrain du savoir.
Socrate introduit alors le concept-clef de la première partie : le rapsode est ''hermêneus'', interprète, médiateur, de la pensée du poète auprès des auditeurs (530c). Le terme va jouer un rôle double dans le dialogue :
* d'abord comme interprète au sens herméneutique (celui qui ''explique'' le texte) ;
* puis, dans la partie centrale, comme simple intermédiaire par lequel passe une parole qui ne lui appartient pas.
=== 530c-531a : Ion se vante ===
Ion, ravi, confirme et surenchérit. Il a, dit-il, mis tout son soin à comprendre la pensée d'Homère et « parle mieux que quiconque » à son sujet. Il se dit digne de recevoir la couronne d'or des Homérides. La vanité d'Ion apparaît dans sa forme la plus directe, mais pas caricaturale : c'est celle d'un professionnel persuadé de la valeur de son métier.
Socrate propose alors la première esquive : il réclame un entretien préalable à toute ''epideixis'' (exhibition publique), stratégie qu'il emploiera à plusieurs reprises pour empêcher Ion de se dérober dans la performance (531a, 536d, 538d).
Socrate pose alors la question qui va déclencher toute l'argumentation : « Es-tu expert seulement sur Homère, ou bien aussi sur Hésiode et Archiloque ? » Ion, dans ce que Sales et Menza ont appelé, respectivement, « le motif possibilisateur du dialogue » et la « proposition catalysante », répond fièrement : « Nullement, mais seulement sur Homère, car cela me suffit ».
Cette réponse est l'étincelle. Si Ion affirme être excellent sur Homère ''et seulement'' sur Homère, une question devient inévitable : comment cela est-il possible, dès lors qu'Homère parle des mêmes thèmes que les autres poètes ? La tension entre la prétention universelle de la compétence homérique et sa restriction à Homère seul va fournir le levier de toute la première réfutation.
== II. Première partie (531a-533c) : l'argument du ''tout'' ==
=== 531a-d : le problème des sujets communs ===
Socrate commence par une question apparemment innocente : Homère et Hésiode parlent-ils des mêmes choses ? Oui, répond Ion, sur beaucoup de sujets. Sur ces sujets communs, donc, Ion explique-t-il aussi bien Hésiode qu'Homère ? Oui, concède-t-il, au moins sur ce qu'ils disent de la même manière. Quant aux sujets où ils divergent, par exemple la mantique (où Homère et Hésiode disent « quelque chose »), c'est un devin qui jugera le mieux, non Ion.
Socrate déploie alors un premier mouvement décisif (531b-c). Si quelqu'un est devin au point de pouvoir expliquer ce que les poètes disent de la même manière, il doit aussi être capable d'expliquer ce qu'ils disent différemment. La compétence d'expert porterait donc sur la ''matière'' et non sur l'auteur. Un expert en mantique juge ''toute'' énonciation mantique, d'où qu'elle vienne ; il ne saurait être expert des énoncés divinatoires d'Homère seul et ignorant de ceux d'Hésiode.
Socrate élargit alors la gamme des sujets qu'Homère traite (531c-d) : la guerre, les relations humaines (entre bons et méchants, profanes et spécialistes), les rapports entre dieux et hommes, les événements célestes et infernaux, la généalogie des dieux et des héros. L'éventail est quasi encyclopédique, et c'est précisément cette prétention à l'universalité des contenus poétiques qui permet à Socrate de la retourner.
Les autres poètes n'ont-ils pas traité les mêmes sujets ? Ion concède qu'ils l'ont fait, mais « bien moins bien qu'Homère ». Cette concession est décisive : Ion admet implicitement qu'il existe un critère de qualité, donc une norme selon laquelle juger.
=== 531d-532b : le critère unique de jugement ===
Socrate introduit alors le principe fondamental : celui qui reconnaît qui parle ''bien'' sur un sujet reconnaît aussi qui parle ''mal''. Si plusieurs personnes parlent de nombres, celui qui reconnaîtra l'expert reconnaîtra aussi le médiocre, c'est l'arithméticien. Si plusieurs parlent d'aliments sains, c'est le médecin qui départagera. Un expert juge donc à la fois le bon et le mauvais dans son domaine.
Application (532b) : puisqu'Ion dit qu'Homère et les autres poètes traitent des mêmes sujets, et puisque le bon juge reconnaît tant l'excellent que le moins bon, Ion, s'il est vraiment expert, devrait être « juge compétent » (''kritês hikanos'') de tous les poètes, non d'Homère seul.
Ion sent le piège, « il semblerait » (''éoiken ge''), répond-il, avec réticence, mais accepte la conclusion tout en maintenant son exclusivité homérique. La contradiction est désormais pleinement formulée : Ion prétend posséder une compétence à prétention universelle (il peut juger tout ce que dit Homère, qui parle de tout) tout en confessant une incompétence universelle sur les autres poètes qui parlent des mêmes choses.
=== 532c-533c : le principe de totalité de la ''technê'' ===
Socrate formule alors le principe méthodologique central : toute ''technê'' est un ''tout'' (''holon''). Il est remarquable qu'il introduise ici la ''technê'' poétique avec un prudent ''pou'' (« je suppose ») : « ποιητικὴ γάρ πού ἐστιν τὸ ὅλον » (532c7-8), « car il y a, je suppose, un art poétique comme un tout ». Ce ''pou'' n'est pas anodin. Rijksbaron, suivi par d'autres, estime que la ''technê'' poétique n'est introduite ici qu{{'}}''argumenti causa'', pour les besoins de la démonstration, sans que Platon lui reconnaisse d'existence effective. Cette lecture est cohérente avec l'ensemble du dialogue et elle est commune aujourd'hui, mais on peut aussi, plus prudemment, y voir une simple réserve rhétorique.
Socrate multiplie alors les exemples de ''technai'' réelles où le principe s'applique :
* La peinture (532e-533a) : existe-t-il quelqu'un d'expert sur Polygnote seul, capable d'expliquer ses réussites et ses échecs, mais qui reste « sans voix, endormi et sans rien à dire » devant les autres peintres ? Non, bien sûr.
* La sculpture (533b) : même démonstration avec Dédale de Métion, Épeios de Panopée, Théodore de Samos.
* La musique, flûte, cithare, chant à la cithare (533b-c) : même principe ; personne n'est expert d'Olympos ou de Thamyras seulement.
* La rhapsodie elle-même (533c) : personne n'est expert de Phémios (le rapsode ithacien de l{{'}}''Odyssée'') seul et incapable de juger Ion d'Éphèse.
Chaque exemple renvoie à des figures réelles, mythiques ou historiques, et évoque un domaine entier où le principe est évidemment valide. Socrate souligne qu'« il importe peu que l'on prenne ''telle ou telle'' ''technê'' comme illustration : la même méthode d'examen vaudra pour toutes les ''technai'' » (532d-e).
La conclusion de ce mouvement est la suivante : si la poésie était une ''technê'', son expert serait capable de juger tous les poètes également. Or Ion ne peut parler bien que d'Homère. Donc, ou bien la poésie n'est pas une ''technê'', ou bien Ion n'est pas un expert. En prenant la ''poiêtikê'' comme tout, Socrate tend à unir, dans un même objet d'analyse, composition (le poète) et interprétation (le rapsode). L'examen dialectique paraît englober toute la chaîne.
=== 533c : l'aveu d'Ion et la demande d'explication ===
Ion, rendu perplexe (« je ne peux te contredire sur ce point »), revient cependant à sa conviction : « Je suis conscient que sur Homère je parle mieux que quiconque… et tous les autres disent que je parle bien. Mais regarde ce que cela signifie ». Cette demande d'éclaircissement marque la transition vers la partie centrale.
Socrate n'insiste pas sur la réfutation dialectique. Il offre à Ion une forme de consolation, dont le statut est précisément l'un des points les plus débattus du dialogue : si l'on suit Rijksbaron ou Aguirre, c'est une consolation empoisonnée, une apparente promotion qui se révèle être, au fil du développement, une disqualification ; si l'on suit Murray ou Stern-Gillet, la doctrine que Socrate va développer peut être prise plus au sérieux qu'on ne le dit, ou à tout le moins comporter une ambivalence. La question mérite d'être posée dès ce seuil, car elle engage la lecture de toute la section centrale.
== III. Partie centrale (533c-536d) : l{{'}}''enthousiasmos'' et la chaîne magnétique ==
=== 533c-534e : la métaphore de la pierre magnétique ===
Socrate annonce : « Je vais te montrer de quoi il s'agit » (''erchomai ge soi apophanoumenos''). Ce qui permet à Ion de bien parler d'Homère ne serait pas une ''technê'' mais une « puissance divine » (''theia dynamis'', 533d3). Socrate développe alors l'une des métaphores les plus célèbres de l'œuvre platonicienne.
La pierre qu'Euripide appelait « Magnésienne » (fragment 571 Nauck, tiré de l{{'}}''Oineus'') et que la plupart appellent « Héraclée », la pierre aimantée, non seulement attire les anneaux de fer, mais leur transmet sa propre force d'attraction, si bien qu'ils peuvent à leur tour attirer d'autres anneaux, formant une chaîne. De même la Muse, directement (''autê'', « par elle-même », et non par quelque intermédiaire technique), rend les poètes ''entheoi'' (« inspirés », littéralement « qui ont le dieu en eux ») et, à travers ces inspirés, fait de toute une ligne d'autres personnes des ''enthousiazontes''.
Le passage est d'une grande densité sémantique. Les verbes ''artaô, anartaô, exartaô'' (« pendre, être suspendu ») disent la dépendance du poète à l'égard de la source divine. La syntaxe elle-même, comme le suggère Omert Schrier (cité par Rijksbaron), adopte un rythme qui imite presque iconiquement le frémissement corybantique. Il existe enfin une distinction sémantique fine, mais significative, entre ''entheoi'' (les poètes, qui ''ont'' le dieu en eux) et ''enthousiazontes'' (les rapsodes et spectateurs, que l'inspiration reçue par transmission met en mouvement).
La description, si on la prend à la lettre, rompt avec une part importante de la tradition poétique grecque. Comme le souligne von der Walde, les poètes archaïques, Homère, Hésiode, Pindare, ne se présentent pas, dans leurs propres textes, comme passifs et possédés. L'invocation aux Muses chez Homère (''Iliade'' II, 480-492) ou Hésiode (''Théogonie'' 104-115) n'implique pas, à première vue, extase ou perte de conscience. C'est Platon qui, dans l{{'}}''Ion'', les ''Lois'' (719c) et le ''Phèdre'', articule fortement l'image du poète à la figure du ''mainomenos'' (fou), du ''mantis'' en transe, de la Pythie sur son trépied. Le « ''palaios mythos'' » dont parlent les ''Lois'' est, selon plusieurs interprètes, plus une reconstruction platonicienne qu'une tradition ancienne attestable. Reste que d'autres sources archaïques (certains hymnes, certains fragments lyriques) peuvent être lues dans le sens d'une continuité partielle : le dossier n'est pas entièrement à sens unique.
=== 534a-b : poètes lyriques, corybantes, bacchantes ===
Socrate élargit l'analyse aux poètes lyriques (''melopoioi''). Ceux-ci ne composeraient pas leurs beaux vers quand ils sont ''emphrones'' (dans leur bon sens), mais seulement quand ils sont « entrés dans l'harmonie et dans le rythme ». Les comparaisons s'accumulent : les corybantes ne dansent pas quand ils sont dans leur bon sens, les bacchantes ne tirent du miel et du lait des fleuves que quand elles sont possédées.
Le jeu phonétique est savant : ''melopoioi'' (534a1, a6) résonne avec ''melê'' (chants, 534a2), ''meli'' (miel, 534a5) et ''melirryton'' (qui coule comme du miel, 534b1). Le tissage sonore renforce l'analogie et tend à dissoudre les frontières conceptuelles entre poètes, corybantes et bacchantes.
Socrate livre alors l'une des définitions les plus fameuses de l{{'}}''Ion'' : le poète est « chose légère, ailée et sacrée » (''kouphon… ptênon… hieron''), « incapable de composer avant d'être inspiré, hors de lui et qu'en lui il n'y ait plus de raison » (534b). La métaphore de l'abeille, commune dans la tradition poétique grecque (Pindare, Bacchylide, Callimaque, Euripide), est reprise : le poète butine les sources et les jardins des Muses, ce qui évoque simultanément la douceur du chant et la dépossession, ''kouphon'' peut aussi signifier « vide ». Les ailes et le vol rapprochent le poète du chamane. Toute cette imagerie oriente vers l'idée que l'activité poétique ne résulterait pas d'un savoir, mais d'un don divin exceptionnel et transitoire. Le verdict est posé en 534c1 et répété en 535a4 : c'est par ''theia moira'' (« allotissement divin ») que les poètes font ce qu'ils font, ''ou technêi'' (« non par art »).
On notera la quasi-équivalence, dans ce passage, des termes ''theia dynamis'' (533d3), ''theia moira'' (534c1, 535a4), ''katokochê'' (« possession », 533e7) et ''enthousiasmos'' (533e5, 535c2, 536b3). Platon accumule les expressions synonymes pour souligner le caractère non rationnel de l'activité poétique, ce qui ne préjuge pas encore de la valeur finale qu'il accorde à cette inspiration.
=== 534c-535a : les exemples confirmants ===
Socrate illustre alors son propos par trois considérations :
# Spécialisation des inspirations : chaque poète n'est capable de bien composer que dans le genre où la Muse l'a poussé, dithyrambes, encomiums, hyporchèmes, épopées, iambes. « Dans les autres genres, il est nul ». La diversité des talents poétiques trahirait ainsi leur origine divine : si c'était une ''technê'', un poète devrait pouvoir exceller en tous genres.
# Tynnichos de Chalcis (534d) : preuve la plus belle, dit Socrate. Ce poète par ailleurs médiocre (''phaulotatos poiêtês'') a composé un péan en l'honneur d'Apollon que tout le monde chante encore et qui est « presque la plus belle de toutes les chansons ». Il le disait lui-même : « une invention des Muses ». Le cas illustrerait que le dieu parle à travers les poètes, comme l'oracle, précisément pour que les hommes sachent que ces beaux poèmes ne sont pas humains (''ouk anthrôpina''), mais divins (''theia''), les poètes n'étant que des ''hermêneis tôn theôn'' (« interprètes des dieux »), chacun possédé par le dieu qui l'a pris. On observe ici que le terme ''hermêneus'' s'est déjà déplacé par rapport à l'usage initial (530c) : il ne désigne plus celui qui ''explique'' le texte, mais celui qui ''transmet passivement'' le message divin.
# L'unicité rhapsodique d'Ion : c'est pour cette raison que le dieu, par dessein, chanterait les plus beaux vers à travers le poète le plus médiocre, pour que nul n'attribue les œuvres divines à un talent proprement humain.
Ion, à ce point, avoue être « touché » par les paroles de Socrate (535a2). Il concède : « Les bons poètes nous transmettent par ''theia moira'' ces choses qui viennent des dieux ». Et quand Socrate lui demande si les rapsodes ne sont pas, eux aussi, les interprètes des poètes, Ion acquiesce. La formule qu'il accepte a un poids considérable : les rapsodes sont « ἑρμηνέων ἑρμηνῆς » (535a8), « des interprètes d'interprètes ». Selon la lecture qu'on retient, cette formule peut marquer soit l'effondrement de la position d'Ion (il ne serait plus qu'un maillon passif dans une chaîne d'ignorance transitoire), soit, de façon plus ambivalente, l'indication que l'activité rhapsodique trouve son sens ailleurs que dans la possession d'une ''technê'', sans être pour autant insignifiante. Penelope Murray, par exemple, tient que le passage central a une tonalité partiellement « élogieuse » (''eulogistic''), même s'il retire aux poètes la ''technê'' traditionnellement reconnue.
=== 535b-d : l'état mental du rapsode ===
Socrate pose alors la question : quand Ion récite Homère, Ulysse sautant sur le seuil, Achille s'élançant contre Hector, les lamentations d'Andromaque, d'Hécube, de Priam, est-il ''dans son bon sens'' (''emphrôn'') ou ''hors de lui'' (''exô heautou''), son âme s'imaginant dans les événements qu'il narre ?
Ion avoue sans détour : « Quand je récite quelque chose de pitoyable, mes yeux se remplissent de larmes ; quand c'est effrayant ou terrible, mes cheveux se dressent et mon cœur palpite ». Cette description recoupe ce que Gorgias avait décrit dans l{{'}}''Éloge d'Hélène'' (§9), et elle n'est pas très éloignée, dans la lettre, de ce qu'Aristote nommera plus tard ''catharsis'' par ''eleos'' et ''phobos'', même si Platon et Aristote évaluent ces mêmes phénomènes de manière diamétralement opposée.
Socrate pousse alors l'argument (535d) : peut-on être ''emphrôn'' quand, orné d'une étoffe bariolée et de couronnes d'or, on pleure pendant des sacrifices et des fêtes solennelles sans rien avoir perdu, ou qu'on a peur au milieu de ''vingt mille personnes'' (''dismyrioi'', chiffre peut-être hyperbolique) qui ne sont pas du tout hostiles ? La disproportion entre la situation objective (spectacle avec couronne d'or) et la réaction affective (larmes, tremblements) tend à montrer que le rapsode est ''ekphrôn'', hors de sa raison.
=== 535d-536d : le spectateur, dernier anneau ===
Socrate montre ensuite que l'état du rapsode se transmet aux spectateurs. Ion le confirme : « Je les vois, du haut de l'estrade, pleurant et me regardant terrifiés, stupéfaits de ce que j'énonce… Car il faut que je leur prête grande attention : s'ils pleurent, je rirai en touchant l'argent ; s'ils rient, c'est moi qui pleurerai pour l'argent perdu ». Le mercantilisme avoué d'Ion, qui rappelle l{{'}}''Hippias Majeur'' 282b-283b et constitue, aux yeux de Platon, un trait commun aux rapsodes et aux sophistes, n'arrange pas sa position. Surtout, Ion décrit l'effet de contagion affective qu'il produit.
Socrate peut alors donner sa forme finale à la métaphore (535e-536a) :
{| class="wikitable"
! Anneau !! Occupant
|-
| Premier anneau || Le poète (Homère)
|-
| Anneau intermédiaire || Le rapsode-acteur (Ion)
|-
| Dernier anneau || Le spectateur
|}
La divinité, à travers tous, « attire l'âme des hommes là où elle veut ». Chaque dieu suscite une chaîne propre : Orphée attire les uns, Musée les autres, Homère la plupart. Ion est possédé par Homère, ce qui expliquerait pourquoi il ne peut bien parler que de lui, et reste « sans voix » devant les autres poètes (536b-c). Même les corybantes ne sont sensibles qu'à la mélodie du dieu qui les possède.
La conclusion, en 536c-d, est nette : « Ce n'est pas par une ''technê'', mais par ''theia moira'' que tu es un formidable louangeur d'Homère ». Ion ne serait donc pas un technicien de la poésie. Que cela constitue, comme le pense la tradition interprétative majoritaire, une disqualification radicale, ou comme d'autres le soutiennent, une caractérisation plus ambivalente, c'est un point sur lequel on peut encore débattre.
== IV. Troisième partie (536d-541e) : retour à la ''technê'' par l'examen des passages ==
=== 536d-537a : le refus d'Ion et la transition ===
Ion, touché dans sa dignité professionnelle, refuse pourtant la description que Socrate fait de lui. Il ne peut croire qu'il est « hors de lui ou possédé ». Il invite Socrate à venir l'écouter en personne. Socrate esquive une fois encore l{{'}}''epideixis'' et propose une nouvelle question préalable, c'est la troisième partie qui s'ouvre.
La stratégie de cette partie est de reprendre l'hypothèse de la ''technê'' rhapsodique comme si elle était encore vraie, pour en examiner concrètement le contenu. Si Ion est expert de tout ce que dit Homère, sur quoi précisément est-il expert ? Socrate va parcourir une série de passages homériques en demandant, pour chacun, quelle ''technê'' particulière est compétente pour en juger.
=== 537a-c : le passage de l'aurige (Nestor à Antilocos) ===
Socrate se propose de citer un passage sur l'art de l'aurige, mais Ion l'interrompt pour le réciter lui-même : il s'agit d{{'}}''Iliade'' XXIII, 335-340, les conseils de Nestor à son fils Antilocos pour prendre le tournant dans la course funèbre en l'honneur de Patrocle. Question : qui jugera le mieux si Homère dit cela correctement, un médecin ou un aurige ? Ion concède : l'aurige, « parce qu'il possède cet art ».
Socrate formule alors le principe de spécialisation des ''technai'' (537c-d) : « À chaque art n'a-t-il pas été accordé par la divinité la fonction de connaître un objet déterminé ? Car ce que nous connaissons par l'art du pilote, nous ne le connaissons pas par celui du médecin ». Le principe s'applique à toutes les ''technai'' (''kata pasôn tôn technôn''). La différence entre les ''technai'' repose sur la différence des objets connus : à objets différents, ''technai'' distinctes ; à même objet, même ''technê'' (illustration : l'arithmétique, par laquelle Socrate et Ion savent tous deux qu'il y a cinq doigts à la main).
Corollaire (538a-b) : celui qui ne possède pas une ''technê'' n'est pas capable de juger ce qui est dit ou fait selon cette ''technê''. Par conséquent, pour le passage sur la course de chars, c'est l'aurige qui juge, non Ion. La distinction est cruciale : posséder la ''technê'' rhapsodique, si elle existe, n'est pas posséder la ''technê'' de l'aurige. Le rapsode est expert ''en tant que rapsode'', non en tant qu'aurige.
On peut signaler ici une objection connue, formulée notamment par Goethe : à la question de savoir si l'aurige ou le poète juge mieux ce que Nestor dit à Antilocos, on pourrait soutenir que le poète juge mieux, ''en tant que poète'', car l'aurige saurait seulement si Homère dit des choses techniquement exactes, tandis que le poète saurait si Homère les dit ''de manière convenable'' pour sa fiction. L'argument socratique suppose en réalité qu'il n'y a pas de critère proprement poétique distinct des critères techniques. Pour qui n'accorde pas cette prémisse, une partie de la démonstration perd de sa force.
=== 538b-d : le médecin, le pêcheur ===
Socrate enchaîne les exemples :
* Le médecin (538b-c) : le passage où Hécamède verse au blessé Machaon une boisson de vin pramnien avec du fromage de chèvre râpé (''Iliade'' XI, 639-640). Qui juge ? La médecine, pas la rhapsodie.
* Le pêcheur (538d) : le passage où un plomb descend dans l'eau « pour apporter malheur aux poissons voraces » (''Iliade'' XXIV, 80-82). Qui juge ? La pêche, pas la rhapsodie.
=== 538e-539d : le devin et l'élargissement de la liste ===
Socrate anticipe avec une ironie fine qu'Ion pourrait lui demander si la ''technê'' du devin fait aussi partie de celles capables de juger Homère. Oui, répond-il, et il cite deux exemples :
* La prophétie du devin Théoclymène, descendant de Mélampous, aux prétendants dans l{{'}}''Odyssée'' XX, 351-357 (« Malheureux ! Quel mal vous frappe ? ») ;
* L'augure du combat où un aigle porte un serpent vivant sur l'armée troyenne, en ''Iliade'' XII, 200 et suiv.
Le mouvement est révélateur : à mesure que Socrate parcourt la poésie homérique, il indique que ''chaque passage'' relève de la compétence d'une ''technê'' particulière ''autre que la rhapsodie''. Le rapsode n'est expert ni en conduite de char, ni en médecine, ni en pêche, ni en divination. Que reste-t-il, alors, à la ''technê'' rhapsodique ?
=== 539e-540b : la question inverse ===
Socrate retourne la question à Ion : puisque tu es plus expérimenté que moi en matière homérique, dis-moi toi-même quels sont les passages qui concernent spécifiquement le rapsode et sa ''technê'', ceux qu'il lui revient, à lui plus qu'à tout autre, d'examiner et de juger.
Ion répond avec grandiloquence : « Tous, Socrate ». Socrate pointe immédiatement la contradiction : l'ordre vient d'être établi qu'à ''technê'' distincte correspond objet distinct ; Ion a reconnu que la ''technê'' rhapsodique était distincte des autres ; donc elle ne peut pas connaître ''tous'' les objets. Ion se rétracte : « Tous sauf, peut-être, ces choses-là », c'est-à-dire, précise Socrate, « à peu près tout ce qui concerne les ''autres technai'' ».
Ion tente alors une formulation plus étroite (540b) : ce que le rapsode connaîtrait, ce serait « les choses qui conviennent à un homme, à une femme, à un esclave, à un libre, à un gouverné, à un gouvernant ». Mais Socrate démonte cette défense en série : ce qui convient de dire à un pilote dans la tempête, le pilote le sait mieux ; ce qui convient au malade, le médecin le sait mieux ; à l'esclave bouvier face à un bœuf enragé, le bouvier le sait mieux ; à la fileuse sur le travail de la laine, la fileuse le sait mieux…
=== 540d-541c : le repli sur le général (''stratêgos'') ===
Acculé, Ion joue alors une dernière carte : le rapsode connaîtrait ce qui convient de dire à un général qui harangue ses soldats. Socrate feint la surprise : « L'art du rapsode serait-il donc celui du général ? » Ion affirme qu'il connaîtrait effectivement ce qui convient à un général, et Socrate rétorque : « Alors tu es peut-être aussi doué pour la stratégie, Ion ». La question suit : quand tu distingues les bons chevaux, le fais-tu en tant que cavalier ou en tant que citharède ? En tant que cavalier. Mais, pour les affaires militaires, les connais-tu en tant que bon rapsode ou en tant que général ?
Ion s'égare : « Il me semble qu'il n'y a pas de différence ». Socrate resserre la prise : « Comment, pas de différence ? L'art du rapsode et celui du général sont-ils un seul art, ou bien deux ? », « Il me semble que c'est un seul art ». Socrate en tire alors la conclusion (541a) : tout bon rapsode est donc bon général, et inversement. Ion accepte la première implication mais refuse la seconde, il pense donc que le bon rapsode est nécessairement bon général, mais que le bon général n'est pas nécessairement bon rapsode.
Cette dissymétrie éclaire la structure de la croyance d'Ion : pour lui, le critère fondamental du savoir semble être l'habileté rhétorique et l'effet émotionnel sur l'auditoire. Puisque le général doit galvaniser ses hommes, et que le rapsode maîtrise cet art, le rapsode englobe le général, mais pas l'inverse. Ion confond alors la performance discursive avec la compétence pratique : le général sur le champ de bataille doit connaître les manœuvres, le terrain, l'ennemi, la logistique, et non seulement exhorter.
Socrate pousse l'argument à son terme (541b) : puisque Ion est le meilleur rapsode de Grèce, il serait donc aussi le meilleur général de Grèce. Pourquoi alors ne commande-t-il pas des armées ? Parce que, répond Ion à côté de la question, sa cité (Éphèse) est sous tutelle athénienne et n'a pas besoin de général, et ni les Athéniens ni les Lacédémoniens ne le choisiraient, pensant se suffire à eux-mêmes.
Socrate, ironique, renverse alors cet argument (541c-d) en citant des généraux ''étrangers'' que les Athéniens ont effectivement élus, Apollodore de Cyzique, Phanosthène d'Andros, Héraclide de Clazomènes. Éphèse n'est pas une cité inférieure, et les Éphésiens sont Athéniens par origine (cf. Strabon, XIV, 1 ; Pausanias, VII, 2, 5). Les Athéniens pourraient très bien élire Ion d'Éphèse s'il était vraiment un bon général.
Le choix du ''stratêgos'' comme ''technê'' ultime n'est pas indifférent : cette fonction est élective à Athènes (contrairement à la plupart des magistratures, tirées au sort), ce qui suppose que les citoyens identifient le savoir militaire comme un savoir ''réel'', vital pour la survie de la polis. Hors du théâtre où Ion manipule les émotions du public, la pratique politique concrète paraît reposer sur une distinction implicite entre savoir effectif et performance rhétorique. Goethe jugeait sévèrement la « méchanceté proprement aristophanesque » de ce passage ; d'autres commentateurs y voient au contraire l'un des arguments décisifs du dialogue, en ce qu'il oblige Ion à choisir entre un savoir sérieux et une simple pose.
=== 541e : la rupture du dialogue ===
Socrate rompt alors le dialogue avec le « ἀλλὰ γάρ », « mais en réalité ». Ce marqueur, comme le souligne Rijksbaron, est particulièrement abrupt : Socrate se prive lui-même de la possibilité de continuer à questionner Ion, pour passer au résumé conclusif. Le ton se raidit. L'emploi de l'indicatif conditionnel (''ei alêthê legeis'', « si tu dis la vérité ») marque un scepticisme manifeste.
== V. Épilogue (541e-542b) : le dilemme final ==
=== 541e-542a : l'accusation ===
Socrate formule directement son accusation. Ion est ''adikos'' (injuste) : il a promis une ''epideixis'' sur Homère (530d4-5), il a prétendu posséder une connaissance à prétention universelle, il a maintenu qu'il ''connaissait beaucoup de belles choses'' sur le poète, mais il n'a cessé d'esquiver la démonstration que Socrate lui réclamait. Comme Protée, le dieu marin de l{{'}}''Odyssée'' IV (capture par Ménélas aux vers 384-461), dont la capacité de métamorphose est proverbiale, et que Platon utilise dans l{{'}}''Euthydème'' 288b-c pour critiquer les sophistes, Ion prend mille formes, « va de haut en bas », jusqu'à se présenter comme général pour ne pas avoir à montrer en quoi il est « habile dans la sagesse homérique ».
L'analogie protéenne prend ici tout son sens. Protée change de forme pour échapper à qui voudrait lui arracher la vérité. Ion, de même, change d'identité professionnelle, rapsode, juge de ''technai'', conseiller de rôles sociaux, général, pour ne pas avoir à produire le contenu positif de sa ''technê''. On peut suivre Aguirre lorsqu'il voit dans cette figure l'image d'un savoir sans identité stable, dont la consistance n'excède pas le temps du spectacle.
=== 542a-b : l'alternative ===
Socrate pose alors la dichotomie finale, dans une construction conditionnelle rigoureuse :
* Si Ion possède une ''technê'' (''ei men… technikos ôn'') et ne l'a pas montrée, alors il ment et il est injuste (''adikos'') envers Socrate.
* Si Ion ne possède pas de ''technê'' (''ei de mê technikos ei'') mais est « possédé par Homère par ''theia moira'' » et dit sans savoir beaucoup de belles choses, alors il n'est pas injuste.
« Choisis donc ce que tu préfères qu'on te considère : homme injuste ou homme divin (''adikos anêr einai ê theios'') ».
La structure du dilemme est exemplaire de l'ironie socratique. Formellement, elle offre un choix. Mais les deux termes ne sont pas équivalents dans le lexique du dialogue :
* Être ''technikos'' supposerait que l'on possède un savoir authentique, or Ion vient de reconnaître, passage après passage, qu'il n'en a aucun clairement identifiable. Choisir cette branche supposerait d'admettre une certaine imposture.
* Être ''theios'' sonne flatteusement, mais c'est, dans le lexique platonicien tel qu'il s'est déployé dans l{{'}}''Ion'', proche d{{'}}''ekphrôn'' : possédé, sans savoir, simple canal. La noblesse apparente peut ainsi dissimuler, pour qui relit tout le dialogue, un statut de médiateur passif.
Ion tranche : « Il y a une grande différence, Socrate : il est bien plus beau d'être considéré divin ». Socrate conclut : « Eh bien, le plus beau est à ton actif : tu es, selon nous, un louangeur d'Homère parce que tu es divin et non technicien (''theios kai mê technikos'') ». Les derniers mots font écho aux premiers vrais mots de Socrate après le prologue (530b5-11) : l'inclusion est soignée, le dialogue a fait le tour de la question.
Le qualificatif « ''par' hêmin'' » (« auprès de nous », 542b3) que Socrate ajoute mérite attention. Il indique que cette reconnaissance est conditionnelle, relative au point de vue de Socrate et de son petit cercle. On peut, avec Penelope Murray, voir dans cette précision la marque d'une réserve ironique : l'idée qu'Ion soit inspiré serait, ''aux yeux de Socrate'', une hypothèse de travail plutôt qu'une conviction pleine. L{{'}}''ho Iôn'' solennel du début peut ainsi devenir ''theios Iôn'', mais dans un sens qui n'est pas nécessairement celui qu'Ion lui-même entend.
== VI. La portée philosophique du dialogue ==
=== 1. La dualité structurante : ''technê'' et ''enthousiasmos'' ===
L'architecture conceptuelle du dialogue repose sur l'opposition entre deux modèles du savoir :
* La ''technê'' est rationnelle, communicable, spécifique à un domaine d'objets, et implique la capacité de rendre raison de son savoir (''logon didonai''). Elle est le modèle du savoir véritable que Platon thématisera pleinement dans le ''Gorgias'' et la ''République''.
* L{{'}}''enthousiasmos'' (ou ''theia moira'', ou ''theia dynamis'') est non rationnel, opaque, transitoire, imprévisible, et ne se transmet pas par enseignement. Il produit des effets, parfois de beaux poèmes, mais ne constitue pas, dans les termes du dialogue, un savoir.
Cette opposition est structurante. Les parties I et III (réfutation par la ''technê'') encadrent le noyau central (description de l{{'}}''enthousiasmos''). En ne laissant à Ion, au bout du compte, que l{{'}}''enthousiasmos'', le dialogue tend à placer l'activité poétique en marge de ce qu'il nomme savoir rationnel.
Aristote contredira ce point de vue dans la ''Poétique'' (1460b14-15) : « la rectitude de la politique et celle de l'art poétique ne sont pas la même, ni celle d'un autre art et celle de l'art poétique ». Pour le Platon de l{{'}}''Ion'' au moins, en revanche, la poésie, tant qu'elle est rapportée à l{{'}}''enthousiasmos'', semble ne pas pouvoir fournir de fondement à la pédagogie du citoyen. Reste que ce jugement n'épuise pas nécessairement la pensée platonicienne sur la poésie : le ''Phèdre'' (245a) distingue plusieurs formes de ''mania'' et accorde à l'inspiration poétique une place positive, ce qui invite à lire l{{'}}''Ion'' moins comme un dernier mot que comme une pièce d'un ensemble plus mobile.
=== 2. L'enjeu éducatif et politique ===
Le dialogue ne se réduit pas à une querelle esthétique. L'enjeu porte sur le modèle d'éducation du citoyen grec. La culture grecque traditionnelle repose en partie sur la ''paideia'' homérique : on apprend à vivre en mémorisant, chantant, interprétant les poèmes épiques, considérés comme dépositaires du savoir éthique, politique, militaire, religieux. Les rapsodes, et surtout les poètes, prétendent être les pédagogues du peuple.
En déniant à la poésie le statut de ''technê'', le dialogue tend à contester aux poètes et rapsodes ce droit pédagogique. Si Homère ne possède aucun savoir véritable, ni en médecine, ni en stratégie, ni en gouvernement, ni en éducation, alors il ne peut guider le citoyen vers l'excellence morale. Ce thème sera repris et systématisé dans la ''République'' X, 599b-e, où Socrate demande à Homère : « Quelle guerre se rappelle-t-on qu'il ait bien conduite ? Quelle cité a-t-il fondée ? Quelle loi a-t-il donnée ? » Aucune. L{{'}}''Ion'' peut donc être lu, de ce point de vue, comme une anticipation de la critique plus large développée dans la ''République''.
La métaphore de la chaîne magnétique peut, sous cet angle, être lue comme portant un diagnostic politique. L'unité qu'elle décrit serait précaire : elle naît dans le moment du spectacle, s'évanouit à sa fin ; elle homogénéise les différences individuelles et sociales ; elle repose sur la connexion des émotions ; elle suspend, pour un temps, l'autonomie rationnelle. À cette unité que l'on peut appeler liturgique, Platon oppose, non dans l{{'}}''Ion'' lui-même, mais dans l'ensemble de son œuvre, une unité plus durable, celle qu'assure selon lui l'examen philosophique. Il faut se garder, pour autant, de faire dire au seul ''Ion'' ce qui n'apparaît clairement que dans la ''République''.
=== 3. La figure du rapsode comme intermédiaire compromis ===
Le choix de faire dialoguer Socrate avec un rapsode plutôt qu'avec un poète n'est pas anodin. Le rapsode cumule deux fonctions problématiques :
* il est récitant, avec une dimension émotionnelle et collective ;
* il est interprète (exégète), avec une prétention à éclairer le texte.
Cette double fonction permet à Platon d'étendre la critique : en visant le rapsode, il atteint à la fois la performance publique de la poésie et la prétention interprétative (notamment les interprétations allégoriques évoquées en 530c-d, celles de Métrodore de Lampsaque, Stésimbrote de Thasos, Glaucon). Dans une culture largement orale, poète et rapsode constituent deux moments inséparables du même processus poétique, ce que la métaphore de la chaîne magnétique représente par les anneaux successifs.
Le rapsode apparaît par ailleurs comme un parent des sophistes : vie itinérante, exhibitions rémunérées (''epideixis''), culte de la performance oratoire, relation mercenaire au public. Dans l{{'}}''Hippias Mineur'' et l{{'}}''Hippias Majeur'', Platon tisse explicitement cette connexion.
=== 4. L{{'}}''hermêneus'' et la question de la médiation ===
La notion d{{'}}''hermêneus'' mérite attention. Au début du dialogue (530c), le rapsode est ''hermêneus'' au sens d{{'}}interprète qui explique, commente, éclaire la pensée du poète. Dans la partie centrale (534e, 535a), le terme se déplace : les rapsodes deviennent ''hermêneis hermêneôn'', « interprètes d'interprètes », c'est-à-dire simples intermédiaires d'un message dont ni eux ni les poètes ne sont les auteurs. La médiation herméneutique active tend à se transformer en transmission passive. Ce glissement du même mot trace, à lui seul, une bonne partie de la trajectoire argumentative du dialogue.
Il soulève, accessoirement, une question générale : peut-on comprendre un texte dont on ne partage pas le savoir, dont on n'est pas soi-même l'auteur ? Le Socrate de l{{'}}''Ion'' semble répondre que l'interprétation authentique suppose la possession d'une ''technê'' sur le contenu interprété. D'autres dialogues, et d'autres traditions interprétatives, donneront des réponses différentes.
=== 5. La dimension comique et l'ironie ===
L{{'}}''Ion'' a aussi une dimension comique assumée. Aguirre rapproche Ion du type de l{{'}}''alazôn'' (le fanfaron qui se donne pour plus qu'il n'est) et Socrate de l{{'}}''eirôn'' (celui qui se diminue) de la comédie ancienne. L'opposition est adoucie par Platon : Ion n'est pas un rustre grotesque, il est affable et sincèrement intéressé par la conversation ; Socrate n'est ni sarcastique ni humiliant, et reste dans le registre de son ironie habituelle. Le comique naît des décalages, la solennité du salut initial, la vanité d'Ion, l'absurde du raisonnement sur la stratégie, la grandiloquence du « Tous, Socrate ! » face à la demande de préciser une compétence. Cette tonalité comique n'est pas étrangère à la gravité philosophique : elle en est souvent, chez Platon, un vecteur.
=== 6. Poésie, vérité, mensonge ===
L{{'}}''Ion'' effleure enfin la question, qui sera pleinement thématisée dans la ''République'' II (376c-383c), du rapport entre poésie et vérité. Si le poète inspiré ne sait pas ce qu'il dit, il ne peut être tenu pour garant de la vérité de son discours. La poésie peut être belle sans être vraie au sens fort que Platon accorde à ce mot. Elle produit des effets sur l'âme, des ''pathê'' collectifs, mais ne fait pas nécessairement connaître. C'est sur cette base que la ''République'' II accusera Homère et Hésiode d'avoir propagé de fausses représentations des dieux et de nourrir l'ignorance chez leurs auditeurs. L{{'}}''Ion'', plus modestement, prépare ce terrain sans encore le labourer.
== Conclusion ==
L{{'}}''Ion'', malgré sa brièveté, accomplit plusieurs choses à la fois. En une demi-heure de conversation simulée, Platon :
# expose le statut ambigu de la rhapsodie, pratique culturelle centrale dans l'éducation grecque traditionnelle ;
# élabore l'opposition, qui sera durablement féconde, entre ''technê'' rationnelle et transmissible, d'une part, et ''enthousiasmos'' non rationnel et imprévisible, d'autre part ;
# formule l'une des métaphores les plus durables de la poétique occidentale, la chaîne magnétique de l'inspiration,, que Longin, puis les Romantiques, reprendront ;
# anticipe, sur un mode plus restreint, la critique que le livre X de la ''République'' développera contre la poésie mimétique ;
# met en place un schéma socratique typique, où la réfutation dialectique se double d'une fausse concession qui enferme l'interlocuteur dans une alternative contrainte.
À la fin, Ion choisit d'être « divin ». Selon la lecture majoritaire, il y perd beaucoup : la ''technê'' que l'examen lui a contestée, et une part de la parole autonome que la théorie de l'inspiration lui dénie. Selon une lecture plus retenue, il gagne une place, mineure mais non nulle, dans une économie divine de la parole ; reste à savoir quel prix Platon lui-même attache à cette place. Dans les deux cas, ce qui semble clair, c'est que la parole pleinement responsable tend à se déplacer, dans le dialogue, vers la figure du philosophe.
Ce bref texte, longtemps jugé mineur, apparaît à l'examen comme une pièce articulée du dispositif platonicien, une préparation conceptuelle à la « querelle ancienne » (''palaia diaphora'', ''République'' X, 607b) entre philosophie et poésie, dont il pose les premiers termes sans encore les systématiser.
== Plan récapitulatif des grandes articulations ==
{| class="wikitable"
|-
! Passage !! Contenu
|-
| 530a-531a || Prologue : rencontre, salutations, présentation de la rhapsodie, question sur l'exclusivité homérique
|-
| 531a-533c || Première partie : argument du ''tout'', la ''technê'' comme unité de jugement ; exemples (arithmétique, médecine, peinture, sculpture, musique, rhapsodie)
|-
| 533c-534e || Partie centrale I : la pierre magnétique ; les poètes ''entheoi'' ; comparaison avec les corybantes et les bacchantes ; Tynnichos de Chalcis
|-
| 534e-536d || Partie centrale II : les trois anneaux (poète, rapsode, spectateur) ; l'émotion rhapsodique ; conclusion sur la ''theia moira''
|-
| 536d-538d || Troisième partie I : principe de spécialisation des ''technai'' ; analyse des passages (aurige, médecin, pêcheur)
|-
| 538d-540b || Troisième partie II : le devin ; retour à Ion et sa prétention universelle ; repli sur « ce qui convient à chacun »
|-
| 540b-541c || Troisième partie III : l'art du général ; raisonnement par l'absurde ; les généraux étrangers
|-
| 541c-542b || Épilogue : rupture du dialogue ; analogie protéenne ; dilemme final ; choix d'Ion
|}
== Bibliographie ==
=== Éditions, traductions et commentaires ===
* Aguirre Santos, Javier, ''Platón. Platón y la poesía : Ion'', Madrid, Plaza y Valdés (coll. « Clásicos europeos »), 2013.
* Allen, Reginald E. (trad.), ''Plato: Ion, Hippias Minor, Laches, Protagoras'', New Haven / London, Yale University Press, 1996.
* Canto, Monique (trad., introd. et notes), ''Platon, Ion'', Paris, Flammarion (GF), 2{{e}} éd. 2001 (1{{re}} éd. 1989).
* Capuccino, Carlotta, ''Filosofi e rapsodi. Testo, traduzione e commento dello Ione platonico'', Bologna, CLUEB, 2005.
* Heitsch, Ernst (trad. et comm.), ''Platon, Ion oder Über die Ilias'' (''Platon Werke'', Band VII.3), Göttingen, Vandenhoeck & Ruprecht, 1997.
* Méridier, Louis (éd., trad., notice), ''Platon. Œuvres complètes'', t. V, 1{{re}} partie : ''Ion, Ménexène, Euthydème'', Paris, Les Belles Lettres (Collection des Universités de France), 1931 (nombreuses rééditions).
* Murray, Penelope, ''Plato on Poetry. Ion ; Republic 376e-398b ; Republic 595-608b'', Cambridge, Cambridge University Press, 1996.
* Pradeau, Jean-François (trad., introd. et notes), ''Platon, Ion'', Paris, Ellipses, 2001.
* Rijksbaron, Albert (éd.), ''Plato. Ion, or: On the Iliad'', Amsterdam Studies in Classical Philology 14, Leiden / Boston, Brill, 2007.
* Saunders, Trevor J. (trad.), ''Plato, Early Socratic Dialogues'', London, Penguin, 2{{e}} éd. 2005.
* von der Walde, Giselle, ''Poesía y mentira : la crítica de Platón a las poéticas de Homero, Hesíodo y Píndaro en el Ion y en República 2'', Bogotá, Universidad de los Andes, 2010.
* Woodruff, Paul (trad.), ''Plato. Two Comic Dialogues : Ion and Hippias Major'', Indianapolis, Hackett, 1983.
=== Études critiques ===
* Bremer, John, ''Plato's Ion. Philosophy as Performance'', North Richland Hills (Texas), Bibal Press, 2005.
* Brandwood, Leonard, ''The Chronology of Plato's Dialogues'', Cambridge, Cambridge University Press, 1990.
* Diès, Auguste, ''Autour de Platon'', Paris, Beauchesne, 1927.
* Finkelberg, Margalit, ''The Birth of Literary Fiction in Ancient Greece'', Oxford, Clarendon Press, 1998.
* Flashar, Hellmut, ''Der Dialog Ion als Zeugnis platonischer Philosophie'', Berlin, Akademie-Verlag, 1958.
* Ford, Andrew, ''The Origins of Criticism. Literary Culture and Poetic Theory in Classical Greece'', Princeton, Princeton University Press, 2002.
* Heitsch, Ernst, « Die Argumentationsstruktur im Ion », ''Rheinisches Museum für Philologie'' 133, 1990, p. 243-259.
* Janaway, Christopher, ''Images of Excellence. Plato's Critique of the Arts'', Oxford, Clarendon Press, 1995.
* Kahn, Charles H., ''Plato and the Socratic Dialogue. The Philosophical Use of a Literary Form'', Cambridge, Cambridge University Press, 1996.
* Ledbetter, Grace M., ''Poetics Before Plato. Interpretation and Authority in Early Greek Theories of Poetry'', Princeton, Princeton University Press, 2003.
* Levin, Susan B., ''The Ancient Quarrel Between Philosophy and Poetry Revisited. Plato and the Greek Literary Tradition'', Oxford, Oxford University Press, 2001.
* Lowenstam, Steven, « Is Literary Criticism an Illegitimate Discipline ? A Fallacious Argument in Plato's Ion », ''Ramus'' 22, 1993, p. 19-32.
* Moore, John D., « The Dating of Plato's Ion », ''Greek, Roman and Byzantine Studies'' 15, 1974, p. 421-440.
* Morris, Thomas F., « Plato's Ion on What Poetry Is About », ''Ancient Philosophy'' 13, 1993, p. 265-272.
* Murray, Penelope, « Poetic Inspiration in Early Greece », ''Journal of Hellenic Studies'' 101, 1981, p. 87-100.
* Murray, Penelope, « Inspiration and Mimesis in Plato », in A. Barker & M. Warner (éd.), ''The Language of the Cave'', Edmonton, Academic Printing and Publishing, 1992, p. 27-46.
* Nightingale, Andrea W., ''Genres in Dialogue. Plato and the Construct of Philosophy'', Cambridge, Cambridge University Press, 1995.
* Stern-Gillet, Suzanne, « On (Mis)interpreting Plato's Ion », ''Philosophy'' 79, 2004, p. 169-192.
* Tigerstedt, Eugène N., ''Plato's Idea of Poetical Inspiration'', Helsinki, ''Commentationes Humanarum Litterarum'' 44, Societas Scientiarum Fennica, 1969.
* Tigerstedt, Eugène N., « Furor Poeticus : Poetic Inspiration in Greek Literature Before Democritus and Plato », ''Journal of the History of Ideas'' 31, 1970, p. 163-178.
* Verdenius, Willem Jacob, « L'Ion de Platon », ''Mnemosyne'' 11, 1943, p. 233-262.
* Vicaire, Paul, ''Platon : critique littéraire'', Paris, Klincksieck, 1960.
* Westermann, Hartmut, ''Die Intention des Dichters und die Zwecke der Interpreten. Zur Theorie und Praxis der Dichterauslegung in den platonischen Dialogen'', Berlin / New York, De Gruyter, 2002.
* Wilamowitz-Moellendorff, Ulrich von, ''Platon'', Band 2 : ''Beilagen und Textkritik'', Berlin, Weidmann, 1919.
{{AutoCat}}
3vyc4wt7x86mxuwph9rph12vttxxai1
Pour lire Platon
0
29731
764608
764011
2026-04-23T05:31:41Z
PandaMystique
119061
/* /Premiers pas/ */
764608
wikitext
text/x-wiki
== Introduction ==
{{version imprimable}}
Ce livre propose de fournir au lecteur les connaissances nécessaires à la compréhension des œuvres de Platon. Il s'adresse aux débutants (par exemple, des élèves de terminale, mais également tous ceux qui souhaitent acquérir une culture générale ou découvrir ce philosophe sans avoir de culture philosophique particulière) et aux lecteurs intermédiaires ou avancés, c'est-à-dire à des lecteurs qui ont lu quelques dialogues parmi les moins difficiles et qui sont éventuellement familiers de quelques-unes des notions principales de Platon.
Ce livre ne s'adresse pas aux spécialistes de Platon qui ne trouveront ici rien qu'ils ne connaissent déjà par la fréquentation assidue des dialogues et des commentateurs.
== Table des matières ==
=== '''[[/Premiers pas/]]''' ===
* [[Pour lire Platon/Premiers pas#Qui est Platon ?|1 Qui est Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit ?|2 Pourquoi Platon a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Qu’a-t-il écrit ?|3 Qu’a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Dans quel ordre Platon a-t-il écrit ses dialogues ?|4 Dans quel ordre Platon a-t-il écrit ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit des dialogues et pas des traités ?|5 Pourquoi Platon a-t-il écrit des dialogues et pas des traités ?]]
* [[Pour lire Platon/Premiers pas#Qui sont les personnages des dialogues de Platon ?|6 Qui sont les personnages des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?|7 Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#De quoi Platon parle-t-il dans ses dialogues ?|8 De quoi Platon parle-t-il dans ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Les dialogues de Platon forment-ils un système philosophique ?|9 Les dialogues de Platon forment-ils un système philosophique ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi lire un auteur qui est mort il y a 24 siècles ?|10 Pourquoi lire un auteur qui est mort il y a 24 siècles ?]]
=== '''[[/Conseils pour la lecture|Conseils pour la lecture]]''' ===
*<small>Quelques conseils élémentaires avant de se lancer</small>
* [[Pour lire Platon/Conseils pour la lecture#Quelles traductions choisir ?|1 Quelles traductions choisir ?]]
* [[Pour lire Platon/Conseils pour la lecture#Faut-il apprendre le grec pour bien comprendre Platon ?|2 Faut-il apprendre le grec pour bien comprendre Platon ?]]
* [[Pour lire Platon/Conseils pour la lecture#Par quels dialogues commencer ?|3 Par quels dialogues commencer ?]]
* [[Pour lire Platon/Conseils pour la lecture#Comment tirer profit de la lecture des dialogues ?|4 Comment tirer profit de la lecture des dialogues ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels outils utiliser au cours de la lecture ?|5 Quels outils utiliser au cours de la lecture ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels livres lire sur Platon ?|6 Quels livres lire sur Platon ?]]
=== [[Pour lire Platon/Introduction par les dialogues|Introduction par les dialogues]] ===
=== [[Pour lire Platon/Introduction par les mythes|Introduction par les mythes]] ===
=== Lecture des dialogues ===
* [[Pour lire Platon/Guide des dialogues/Introduction|Introduction]]
* [[Pour lire Platon/Guide des dialogues|Guide des dialogues]]
=== [[Pour lire Platon/Vocabulaire|Vocabulaire]] ===
[[Catégorie:Histoire de la philosophie]][[Catégorie:Philosophe]]
{{AutoCat}}
__NOTOC__
bsmfycoy5y08t8iyqnjcwmiy3v58yhp
764609
764608
2026-04-23T05:32:23Z
PandaMystique
119061
/* /Premiers pas/ */
764609
wikitext
text/x-wiki
== Introduction ==
{{version imprimable}}
Ce livre propose de fournir au lecteur les connaissances nécessaires à la compréhension des œuvres de Platon. Il s'adresse aux débutants (par exemple, des élèves de terminale, mais également tous ceux qui souhaitent acquérir une culture générale ou découvrir ce philosophe sans avoir de culture philosophique particulière) et aux lecteurs intermédiaires ou avancés, c'est-à-dire à des lecteurs qui ont lu quelques dialogues parmi les moins difficiles et qui sont éventuellement familiers de quelques-unes des notions principales de Platon.
Ce livre ne s'adresse pas aux spécialistes de Platon qui ne trouveront ici rien qu'ils ne connaissent déjà par la fréquentation assidue des dialogues et des commentateurs.
== Table des matières ==
=== '''[[/Premiers pas/]]''' ===
* [[Pour lire Platon/Premiers pas#Qui est Platon ?|1 Qui est Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit ?|2 Pourquoi Platon a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Qu’a-t-il écrit ?|3 Qu’a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Dans quel ordre Platon a-t-il écrit ses dialogues ?|4 Dans quel ordre Platon a-t-il écrit ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit des dialogues et non des traités ?|5 Pourquoi Platon a-t-il écrit des dialogues et non des traités ?]]
* [[Pour lire Platon/Premiers pas#Qui sont les personnages des dialogues de Platon ?|6 Qui sont les personnages des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?|7 Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#De quoi Platon parle-t-il dans ses dialogues ?|8 De quoi Platon parle-t-il dans ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Les dialogues de Platon forment-ils un système philosophique ?|9 Les dialogues de Platon forment-ils un système philosophique ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi lire un auteur qui est mort il y a 24 siècles ?|10 Pourquoi lire un auteur qui est mort il y a 24 siècles ?]]
=== '''[[/Conseils pour la lecture|Conseils pour la lecture]]''' ===
*<small>Quelques conseils élémentaires avant de se lancer</small>
* [[Pour lire Platon/Conseils pour la lecture#Quelles traductions choisir ?|1 Quelles traductions choisir ?]]
* [[Pour lire Platon/Conseils pour la lecture#Faut-il apprendre le grec pour bien comprendre Platon ?|2 Faut-il apprendre le grec pour bien comprendre Platon ?]]
* [[Pour lire Platon/Conseils pour la lecture#Par quels dialogues commencer ?|3 Par quels dialogues commencer ?]]
* [[Pour lire Platon/Conseils pour la lecture#Comment tirer profit de la lecture des dialogues ?|4 Comment tirer profit de la lecture des dialogues ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels outils utiliser au cours de la lecture ?|5 Quels outils utiliser au cours de la lecture ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels livres lire sur Platon ?|6 Quels livres lire sur Platon ?]]
=== [[Pour lire Platon/Introduction par les dialogues|Introduction par les dialogues]] ===
=== [[Pour lire Platon/Introduction par les mythes|Introduction par les mythes]] ===
=== Lecture des dialogues ===
* [[Pour lire Platon/Guide des dialogues/Introduction|Introduction]]
* [[Pour lire Platon/Guide des dialogues|Guide des dialogues]]
=== [[Pour lire Platon/Vocabulaire|Vocabulaire]] ===
[[Catégorie:Histoire de la philosophie]][[Catégorie:Philosophe]]
{{AutoCat}}
__NOTOC__
np9v0lei03vcvgg9llduinpo6nsclb7
764610
764609
2026-04-23T05:33:17Z
PandaMystique
119061
/* /Premiers pas/ */
764610
wikitext
text/x-wiki
== Introduction ==
{{version imprimable}}
Ce livre propose de fournir au lecteur les connaissances nécessaires à la compréhension des œuvres de Platon. Il s'adresse aux débutants (par exemple, des élèves de terminale, mais également tous ceux qui souhaitent acquérir une culture générale ou découvrir ce philosophe sans avoir de culture philosophique particulière) et aux lecteurs intermédiaires ou avancés, c'est-à-dire à des lecteurs qui ont lu quelques dialogues parmi les moins difficiles et qui sont éventuellement familiers de quelques-unes des notions principales de Platon.
Ce livre ne s'adresse pas aux spécialistes de Platon qui ne trouveront ici rien qu'ils ne connaissent déjà par la fréquentation assidue des dialogues et des commentateurs.
== Table des matières ==
=== '''[[/Premiers pas/]]''' ===
* [[Pour lire Platon/Premiers pas#Qui est Platon ?|1 Qui est Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit ?|2 Pourquoi Platon a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Qu’a-t-il écrit ?|3 Qu’a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Dans quel ordre Platon a-t-il écrit ses dialogues ?|4 Dans quel ordre Platon a-t-il écrit ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit des dialogues et non des traités ?|5 Pourquoi Platon a-t-il écrit des dialogues et non des traités ?]]
* [[Pour lire Platon/Premiers pas#Qui sont les personnages des dialogues de Platon ?|6 Qui sont les personnages des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?|7 Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#De quoi Platon parle-t-il dans ses dialogues ?|8 De quoi Platon parle-t-il dans ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Les dialogues de Platon forment-ils un système philosophique ?|9 Les dialogues de Platon forment-ils un système philosophique ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi lire un auteur mort il y a vingt-quatre siècles ?|10 Pourquoi lire un auteur mort il y a vingt-quatre siècles ?]]
=== '''[[/Conseils pour la lecture|Conseils pour la lecture]]''' ===
*<small>Quelques conseils élémentaires avant de se lancer</small>
* [[Pour lire Platon/Conseils pour la lecture#Quelles traductions choisir ?|1 Quelles traductions choisir ?]]
* [[Pour lire Platon/Conseils pour la lecture#Faut-il apprendre le grec pour bien comprendre Platon ?|2 Faut-il apprendre le grec pour bien comprendre Platon ?]]
* [[Pour lire Platon/Conseils pour la lecture#Par quels dialogues commencer ?|3 Par quels dialogues commencer ?]]
* [[Pour lire Platon/Conseils pour la lecture#Comment tirer profit de la lecture des dialogues ?|4 Comment tirer profit de la lecture des dialogues ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels outils utiliser au cours de la lecture ?|5 Quels outils utiliser au cours de la lecture ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels livres lire sur Platon ?|6 Quels livres lire sur Platon ?]]
=== [[Pour lire Platon/Introduction par les dialogues|Introduction par les dialogues]] ===
=== [[Pour lire Platon/Introduction par les mythes|Introduction par les mythes]] ===
=== Lecture des dialogues ===
* [[Pour lire Platon/Guide des dialogues/Introduction|Introduction]]
* [[Pour lire Platon/Guide des dialogues|Guide des dialogues]]
=== [[Pour lire Platon/Vocabulaire|Vocabulaire]] ===
[[Catégorie:Histoire de la philosophie]][[Catégorie:Philosophe]]
{{AutoCat}}
__NOTOC__
0j95sufvns62v34rhvllpg0bbbevybo
764619
764610
2026-04-23T05:44:11Z
PandaMystique
119061
764619
wikitext
text/x-wiki
== Introduction ==
{{version imprimable}}
Ce livre propose de fournir au lecteur les connaissances nécessaires à la compréhension des œuvres de Platon. Il s'adresse aux débutants (par exemple, des élèves de terminale, mais également tous ceux qui souhaitent acquérir une culture générale ou découvrir ce philosophe sans avoir de culture philosophique particulière) et aux lecteurs intermédiaires ou avancés, c'est-à-dire à des lecteurs qui ont lu quelques dialogues parmi les moins difficiles et qui sont éventuellement familiers de quelques-unes des notions principales de Platon.
Après une partie introductive, qui s'efforce de donner quelques outils simples et abordables, le ''Guide des Dialogues'' se compose de commentaires plus substantiels, sans être trop techniques, dans le but de progresser dans la lecture.
Ce livre ne s'adresse pas aux spécialistes de Platon qui ne trouveront ici rien qu'ils ne connaissent déjà par la fréquentation assidue des dialogues et des commentateurs.
== Table des matières ==
=== '''[[/Premiers pas/]]''' ===
* [[Pour lire Platon/Premiers pas#Qui est Platon ?|1 Qui est Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit ?|2 Pourquoi Platon a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Qu’a-t-il écrit ?|3 Qu’a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Dans quel ordre Platon a-t-il écrit ses dialogues ?|4 Dans quel ordre Platon a-t-il écrit ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit des dialogues et non des traités ?|5 Pourquoi Platon a-t-il écrit des dialogues et non des traités ?]]
* [[Pour lire Platon/Premiers pas#Qui sont les personnages des dialogues de Platon ?|6 Qui sont les personnages des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?|7 Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#De quoi Platon parle-t-il dans ses dialogues ?|8 De quoi Platon parle-t-il dans ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Les dialogues de Platon forment-ils un système philosophique ?|9 Les dialogues de Platon forment-ils un système philosophique ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi lire un auteur mort il y a vingt-quatre siècles ?|10 Pourquoi lire un auteur mort il y a vingt-quatre siècles ?]]
=== '''[[/Conseils pour la lecture|Conseils pour la lecture]]''' ===
*<small>Quelques conseils élémentaires avant de se lancer</small>
* [[Pour lire Platon/Conseils pour la lecture#Quelles traductions choisir ?|1 Quelles traductions choisir ?]]
* [[Pour lire Platon/Conseils pour la lecture#Faut-il apprendre le grec pour bien comprendre Platon ?|2 Faut-il apprendre le grec pour bien comprendre Platon ?]]
* [[Pour lire Platon/Conseils pour la lecture#Par quels dialogues commencer ?|3 Par quels dialogues commencer ?]]
* [[Pour lire Platon/Conseils pour la lecture#Comment tirer profit de la lecture des dialogues ?|4 Comment tirer profit de la lecture des dialogues ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels outils utiliser au cours de la lecture ?|5 Quels outils utiliser au cours de la lecture ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels livres lire sur Platon ?|6 Quels livres lire sur Platon ?]]
=== [[Pour lire Platon/Introduction par les dialogues|Introduction par les dialogues]] ===
=== [[Pour lire Platon/Introduction par les mythes|Introduction par les mythes]] ===
=== Lecture des dialogues ===
* [[Pour lire Platon/Guide des dialogues/Introduction|Introduction]]
* [[Pour lire Platon/Guide des dialogues|Guide des dialogues]]
=== [[Pour lire Platon/Vocabulaire|Vocabulaire]] ===
[[Catégorie:Histoire de la philosophie]][[Catégorie:Philosophe]]
{{AutoCat}}
__NOTOC__
f5n1syo532s9ua7f8zdyx9d2pslemo7
764620
764619
2026-04-23T05:45:41Z
PandaMystique
119061
/* Table des matières */
764620
wikitext
text/x-wiki
== Introduction ==
{{version imprimable}}
Ce livre propose de fournir au lecteur les connaissances nécessaires à la compréhension des œuvres de Platon. Il s'adresse aux débutants (par exemple, des élèves de terminale, mais également tous ceux qui souhaitent acquérir une culture générale ou découvrir ce philosophe sans avoir de culture philosophique particulière) et aux lecteurs intermédiaires ou avancés, c'est-à-dire à des lecteurs qui ont lu quelques dialogues parmi les moins difficiles et qui sont éventuellement familiers de quelques-unes des notions principales de Platon.
Après une partie introductive, qui s'efforce de donner quelques outils simples et abordables, le ''Guide des Dialogues'' se compose de commentaires plus substantiels, sans être trop techniques, dans le but de progresser dans la lecture.
Ce livre ne s'adresse pas aux spécialistes de Platon qui ne trouveront ici rien qu'ils ne connaissent déjà par la fréquentation assidue des dialogues et des commentateurs.
== Table des matières ==
=== '''[[/Premiers pas/]]''' ===
* [[Pour lire Platon/Premiers pas#Qui est Platon ?|1 Qui est Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit ?|2 Pourquoi Platon a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Qu’a-t-il écrit ?|3 Qu’a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Dans quel ordre Platon a-t-il écrit ses dialogues ?|4 Dans quel ordre Platon a-t-il écrit ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit des dialogues et non des traités ?|5 Pourquoi Platon a-t-il écrit des dialogues et non des traités ?]]
* [[Pour lire Platon/Premiers pas#Qui sont les personnages des dialogues de Platon ?|6 Qui sont les personnages des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?|7 Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#De quoi Platon parle-t-il dans ses dialogues ?|8 De quoi Platon parle-t-il dans ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Les dialogues de Platon forment-ils un système philosophique ?|9 Les dialogues de Platon forment-ils un système philosophique ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi lire un auteur mort il y a vingt-quatre siècles ?|10 Pourquoi lire un auteur mort il y a vingt-quatre siècles ?]]
=== '''[[/Conseils pour la lecture|Conseils pour la lecture]]''' ===
*<small>Quelques conseils élémentaires avant de se lancer</small>
* [[Pour lire Platon/Conseils pour la lecture#Quelles traductions choisir ?|1 Quelles traductions choisir ?]]
* [[Pour lire Platon/Conseils pour la lecture#Faut-il apprendre le grec pour bien comprendre Platon ?|2 Faut-il apprendre le grec pour bien comprendre Platon ?]]
* [[Pour lire Platon/Conseils pour la lecture#Par quels dialogues commencer ?|3 Par quels dialogues commencer ?]]
* [[Pour lire Platon/Conseils pour la lecture#Comment tirer profit de la lecture des dialogues ?|4 Comment tirer profit de la lecture des dialogues ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels outils utiliser au cours de la lecture ?|5 Quels outils utiliser au cours de la lecture ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels livres lire sur Platon ?|6 Quels livres lire sur Platon ?]]
=== [[Pour lire Platon/Introduction par les dialogues|Introduction par les dialogues]] ===
=== [[Pour lire Platon/Introduction par les mythes|Introduction par les mythes]] ===
=== [[Pour lire Platon/Vocabulaire|Vocabulaire]] ===
== Le Guide des Dialogues ==
* [[Pour lire Platon/Guide des dialogues/Introduction|Introduction]]
* [[Pour lire Platon/Guide des dialogues|Guide des dialogues]]
[[Catégorie:Histoire de la philosophie]][[Catégorie:Philosophe]]
{{AutoCat}}
__NOTOC__
jrvq6adf8gcrrapcja67ps9ql0wkxd3
764621
764620
2026-04-23T05:47:19Z
PandaMystique
119061
/* Introduction par les dialogues */
764621
wikitext
text/x-wiki
== Introduction ==
{{version imprimable}}
Ce livre propose de fournir au lecteur les connaissances nécessaires à la compréhension des œuvres de Platon. Il s'adresse aux débutants (par exemple, des élèves de terminale, mais également tous ceux qui souhaitent acquérir une culture générale ou découvrir ce philosophe sans avoir de culture philosophique particulière) et aux lecteurs intermédiaires ou avancés, c'est-à-dire à des lecteurs qui ont lu quelques dialogues parmi les moins difficiles et qui sont éventuellement familiers de quelques-unes des notions principales de Platon.
Après une partie introductive, qui s'efforce de donner quelques outils simples et abordables, le ''Guide des Dialogues'' se compose de commentaires plus substantiels, sans être trop techniques, dans le but de progresser dans la lecture.
Ce livre ne s'adresse pas aux spécialistes de Platon qui ne trouveront ici rien qu'ils ne connaissent déjà par la fréquentation assidue des dialogues et des commentateurs.
== Table des matières ==
=== '''[[/Premiers pas/]]''' ===
* [[Pour lire Platon/Premiers pas#Qui est Platon ?|1 Qui est Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit ?|2 Pourquoi Platon a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Qu’a-t-il écrit ?|3 Qu’a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Dans quel ordre Platon a-t-il écrit ses dialogues ?|4 Dans quel ordre Platon a-t-il écrit ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit des dialogues et non des traités ?|5 Pourquoi Platon a-t-il écrit des dialogues et non des traités ?]]
* [[Pour lire Platon/Premiers pas#Qui sont les personnages des dialogues de Platon ?|6 Qui sont les personnages des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?|7 Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#De quoi Platon parle-t-il dans ses dialogues ?|8 De quoi Platon parle-t-il dans ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Les dialogues de Platon forment-ils un système philosophique ?|9 Les dialogues de Platon forment-ils un système philosophique ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi lire un auteur mort il y a vingt-quatre siècles ?|10 Pourquoi lire un auteur mort il y a vingt-quatre siècles ?]]
=== '''[[/Conseils pour la lecture|Conseils pour la lecture]]''' ===
*<small>Quelques conseils élémentaires avant de se lancer</small>
* [[Pour lire Platon/Conseils pour la lecture#Quelles traductions choisir ?|1 Quelles traductions choisir ?]]
* [[Pour lire Platon/Conseils pour la lecture#Faut-il apprendre le grec pour bien comprendre Platon ?|2 Faut-il apprendre le grec pour bien comprendre Platon ?]]
* [[Pour lire Platon/Conseils pour la lecture#Par quels dialogues commencer ?|3 Par quels dialogues commencer ?]]
* [[Pour lire Platon/Conseils pour la lecture#Comment tirer profit de la lecture des dialogues ?|4 Comment tirer profit de la lecture des dialogues ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels outils utiliser au cours de la lecture ?|5 Quels outils utiliser au cours de la lecture ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels livres lire sur Platon ?|6 Quels livres lire sur Platon ?]]
=== [[Pour lire Platon/Introduction par les dialogues|Introduction par les dialogues]] ===
* Le philosophe
** Qu'est-ce que l'amour de la sagesse ?
** Qu'est-ce que savoir ?
** Quelle est la place du philosophe dans la cité
=== [[Pour lire Platon/Introduction par les mythes|Introduction par les mythes]] ===
=== [[Pour lire Platon/Vocabulaire|Vocabulaire]] ===
== Le Guide des Dialogues ==
* [[Pour lire Platon/Guide des dialogues/Introduction|Introduction]]
* [[Pour lire Platon/Guide des dialogues|Guide des dialogues]]
[[Catégorie:Histoire de la philosophie]][[Catégorie:Philosophe]]
{{AutoCat}}
__NOTOC__
b1lui6wnwofztoc9rgy7wi72uz06ja2
764622
764621
2026-04-23T05:47:46Z
PandaMystique
119061
/* Conseils pour la lecture */
764622
wikitext
text/x-wiki
== Introduction ==
{{version imprimable}}
Ce livre propose de fournir au lecteur les connaissances nécessaires à la compréhension des œuvres de Platon. Il s'adresse aux débutants (par exemple, des élèves de terminale, mais également tous ceux qui souhaitent acquérir une culture générale ou découvrir ce philosophe sans avoir de culture philosophique particulière) et aux lecteurs intermédiaires ou avancés, c'est-à-dire à des lecteurs qui ont lu quelques dialogues parmi les moins difficiles et qui sont éventuellement familiers de quelques-unes des notions principales de Platon.
Après une partie introductive, qui s'efforce de donner quelques outils simples et abordables, le ''Guide des Dialogues'' se compose de commentaires plus substantiels, sans être trop techniques, dans le but de progresser dans la lecture.
Ce livre ne s'adresse pas aux spécialistes de Platon qui ne trouveront ici rien qu'ils ne connaissent déjà par la fréquentation assidue des dialogues et des commentateurs.
== Table des matières ==
=== '''[[/Premiers pas/]]''' ===
* [[Pour lire Platon/Premiers pas#Qui est Platon ?|1 Qui est Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit ?|2 Pourquoi Platon a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Qu’a-t-il écrit ?|3 Qu’a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Dans quel ordre Platon a-t-il écrit ses dialogues ?|4 Dans quel ordre Platon a-t-il écrit ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit des dialogues et non des traités ?|5 Pourquoi Platon a-t-il écrit des dialogues et non des traités ?]]
* [[Pour lire Platon/Premiers pas#Qui sont les personnages des dialogues de Platon ?|6 Qui sont les personnages des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?|7 Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#De quoi Platon parle-t-il dans ses dialogues ?|8 De quoi Platon parle-t-il dans ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Les dialogues de Platon forment-ils un système philosophique ?|9 Les dialogues de Platon forment-ils un système philosophique ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi lire un auteur mort il y a vingt-quatre siècles ?|10 Pourquoi lire un auteur mort il y a vingt-quatre siècles ?]]
=== '''[[/Conseils pour la lecture|Conseils pour la lecture]]''' ===
<small>''Quelques conseils élémentaires avant de se lancer''</small>
* [[Pour lire Platon/Conseils pour la lecture#Quelles traductions choisir ?|1 Quelles traductions choisir ?]]
* [[Pour lire Platon/Conseils pour la lecture#Faut-il apprendre le grec pour bien comprendre Platon ?|2 Faut-il apprendre le grec pour bien comprendre Platon ?]]
* [[Pour lire Platon/Conseils pour la lecture#Par quels dialogues commencer ?|3 Par quels dialogues commencer ?]]
* [[Pour lire Platon/Conseils pour la lecture#Comment tirer profit de la lecture des dialogues ?|4 Comment tirer profit de la lecture des dialogues ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels outils utiliser au cours de la lecture ?|5 Quels outils utiliser au cours de la lecture ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels livres lire sur Platon ?|6 Quels livres lire sur Platon ?]]
=== [[Pour lire Platon/Introduction par les dialogues|Introduction par les dialogues]] ===
* Le philosophe
** Qu'est-ce que l'amour de la sagesse ?
** Qu'est-ce que savoir ?
** Quelle est la place du philosophe dans la cité
=== [[Pour lire Platon/Introduction par les mythes|Introduction par les mythes]] ===
=== [[Pour lire Platon/Vocabulaire|Vocabulaire]] ===
== Le Guide des Dialogues ==
* [[Pour lire Platon/Guide des dialogues/Introduction|Introduction]]
* [[Pour lire Platon/Guide des dialogues|Guide des dialogues]]
[[Catégorie:Histoire de la philosophie]][[Catégorie:Philosophe]]
{{AutoCat}}
__NOTOC__
9bz0s187sbc1bxzc0bhm0rztl7cej0x
764623
764622
2026-04-23T05:48:36Z
PandaMystique
119061
/* Introduction par les dialogues */
764623
wikitext
text/x-wiki
== Introduction ==
{{version imprimable}}
Ce livre propose de fournir au lecteur les connaissances nécessaires à la compréhension des œuvres de Platon. Il s'adresse aux débutants (par exemple, des élèves de terminale, mais également tous ceux qui souhaitent acquérir une culture générale ou découvrir ce philosophe sans avoir de culture philosophique particulière) et aux lecteurs intermédiaires ou avancés, c'est-à-dire à des lecteurs qui ont lu quelques dialogues parmi les moins difficiles et qui sont éventuellement familiers de quelques-unes des notions principales de Platon.
Après une partie introductive, qui s'efforce de donner quelques outils simples et abordables, le ''Guide des Dialogues'' se compose de commentaires plus substantiels, sans être trop techniques, dans le but de progresser dans la lecture.
Ce livre ne s'adresse pas aux spécialistes de Platon qui ne trouveront ici rien qu'ils ne connaissent déjà par la fréquentation assidue des dialogues et des commentateurs.
== Table des matières ==
=== '''[[/Premiers pas/]]''' ===
* [[Pour lire Platon/Premiers pas#Qui est Platon ?|1 Qui est Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit ?|2 Pourquoi Platon a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Qu’a-t-il écrit ?|3 Qu’a-t-il écrit ?]]
* [[Pour lire Platon/Premiers pas#Dans quel ordre Platon a-t-il écrit ses dialogues ?|4 Dans quel ordre Platon a-t-il écrit ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit des dialogues et non des traités ?|5 Pourquoi Platon a-t-il écrit des dialogues et non des traités ?]]
* [[Pour lire Platon/Premiers pas#Qui sont les personnages des dialogues de Platon ?|6 Qui sont les personnages des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?|7 Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?]]
* [[Pour lire Platon/Premiers pas#De quoi Platon parle-t-il dans ses dialogues ?|8 De quoi Platon parle-t-il dans ses dialogues ?]]
* [[Pour lire Platon/Premiers pas#Les dialogues de Platon forment-ils un système philosophique ?|9 Les dialogues de Platon forment-ils un système philosophique ?]]
* [[Pour lire Platon/Premiers pas#Pourquoi lire un auteur mort il y a vingt-quatre siècles ?|10 Pourquoi lire un auteur mort il y a vingt-quatre siècles ?]]
=== '''[[/Conseils pour la lecture|Conseils pour la lecture]]''' ===
<small>''Quelques conseils élémentaires avant de se lancer''</small>
* [[Pour lire Platon/Conseils pour la lecture#Quelles traductions choisir ?|1 Quelles traductions choisir ?]]
* [[Pour lire Platon/Conseils pour la lecture#Faut-il apprendre le grec pour bien comprendre Platon ?|2 Faut-il apprendre le grec pour bien comprendre Platon ?]]
* [[Pour lire Platon/Conseils pour la lecture#Par quels dialogues commencer ?|3 Par quels dialogues commencer ?]]
* [[Pour lire Platon/Conseils pour la lecture#Comment tirer profit de la lecture des dialogues ?|4 Comment tirer profit de la lecture des dialogues ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels outils utiliser au cours de la lecture ?|5 Quels outils utiliser au cours de la lecture ?]]
* [[Pour lire Platon/Conseils pour la lecture#Quels livres lire sur Platon ?|6 Quels livres lire sur Platon ?]]
=== [[Pour lire Platon/Introduction par les dialogues|Introduction par les dialogues]] ===
* Le philosophe
** Qu'est-ce que l'amour de la sagesse ?
** Qu'est-ce que savoir ?
** Quelle est la place du philosophe dans la cité
* La vie éthique
** Qu'est-ce que l'âme ?
** Qu'est-ce que se connaître soi-même ?
** Qu'est-ce que la vertu ?
** Quel est le bien suprême de la vie ?
** Doit-on craindre la mort ?
=== [[Pour lire Platon/Introduction par les mythes|Introduction par les mythes]] ===
=== [[Pour lire Platon/Vocabulaire|Vocabulaire]] ===
== Le Guide des Dialogues ==
* [[Pour lire Platon/Guide des dialogues/Introduction|Introduction]]
* [[Pour lire Platon/Guide des dialogues|Guide des dialogues]]
[[Catégorie:Histoire de la philosophie]][[Catégorie:Philosophe]]
{{AutoCat}}
__NOTOC__
acg8671vitvz7n6lxpovckpy0ew3sjk
Pour lire Platon/Vocabulaire
0
29977
764618
684255
2026-04-23T05:41:43Z
PandaMystique
119061
764618
wikitext
text/x-wiki
{{ébauche}}
<noinclude>{{sous-pages}}</noinclude>
Cette annexe propose un vocabulaire de Platon.
Ce vocabulaire s'organise de la manière suivante. Les explications données dans le présent article sont à l'usage des débutants. Elles se présentent sous la forme de définitions qui n'ont pas la prétention d'être complètes mais d'être faciles à retenir tout en donnant les caractéristiques essentielles de ce qui est à expliquer. Les définitions sont suivies d'explications qui les éclairent et les complètent. Les liens présents dans chaque section renverront à des études plus développées, à l'usage des lecteurs plus avancés.
Cette présentation a un parti pris pédagogique. Pour qu'elle puisse être profitable, voici ce que nous conseillons. Un philosophe ne pense pas à partir de rien, mais a besoin bien au contraire d'outils intellectuels. Parmi ces outils, on trouve des notions philosophiques. C'est pourquoi, si ces notions doivent être évidemment comprises, elles doivent être aussi apprises par cœur, de sorte qu'elles puissent servir à une activité de pensée autonome. Pour bien parler et comprendre une langue, il faut passer par des exercices de mémorisation longs et fastidieux ; de même, l'acquisition d'outils intellectuels demande que l'on exerce sa mémoire afin que l'esprit gagne en étendue et en précision dans ses réflexions.
L'intérêt de définitions courtes et simples est de pouvoir garder facilement en mémoire tout ce qu'il faut savoir pour comprendre un auteur. Les quelques éléments qu'elles fournissent doivent permettre de se remémorer l'ensemble des explications données à leur suite. Ainsi, par un exercice scolaire d'apprentissage, accompagné d'exercices de resouvenir plus précis de la signification des notions présentées ici, on pourra commencer à prétendre à une certaine maîtrise intelligente de la pensée de Platon.
== Âme ==
<small><u>Définition</u></small><br/>
L'âme est ce qui est principe du mouvement et sujet de la pensée.
<small><u>Explications</u></small><br/>
homme
=
<small>Voir : [[Pour lire Platon/Vocabulaire/Amitié|Amitié]]</small>
<small><u>Définition</u></small><br/>
L’amitié est le désir de fréquenter qui ou ce qui nous rendra meilleur.
<small><u>Explications</u></small><br/>
L'amitié est pour les Grecs une forme d'affection réciproque, ce qui inclut les liens familiaux, les liens sociaux, mais aussi la bienveillance à l'égard de l'étranger. Les poètes et les philosophes avaient conçu deux grandes types de théories de l'amitié : l'amitié est l'attirance des semblables ou des contraires.
Platon rompt avec chacune des conceptions énoncées ci-dessus. Tout d'abord, l'amitié peut ne pas être réciproque, comme l'affection pour des animaux, mais aussi pour des réalités non vivantes, comme le savoir, c'est-à-dire la philosophie ; ensuite, l'amitié n'est en particulier ni l'attirance des semblables ni l'attirance des contraires, car, dans ces deux cas, celui qui a de l'amitié serait la mesure de l'objet de son affection ; or, Pour Platon, l'amitié est un désir, donc un désir de ce que l'on a pas et que l'on n'est pas ; enfin, l'amitié est une affection intéressée, car elle est un désir du bien.
<small><u>Texte</u></small><br/>
Dans cet extrait du ''Lysis'', Platon montre le caractère intéressé de l'amitié : l'ami est utile. Cette conception va à l'encontre de la conception populaire, puisque la recherche de l'utilité semble être à l'extrême opposé de l'amitié. Mais, pour ne pas faire de contre-sens, il faut avoir à l'esprit que l'utilité dont parle Socrate n'est pas l'utilité ''matérielle''. L'utilité recherchée dans l'amitié est l'utilité de l'âme, c'est-à-dire le ''bien moral'', et, pour Platon, ce bien repose sur la connaissance. Dès lors, l'ami est celui (ou la réalité) qui peut nous rendre meilleur, parce qu'il nous montre le bien, objet suprême du désir de l'âme. On remarquera que Platon place cette amitié au-dessus des liens naturels de la famille, ce qui s'accorde avec sa volonté d'abolir la famille dans la ''République''.
« — Socrate : Tu vois donc ce qu’il en est, mon cher Lysis, lui dis-je : pour les choses où nous serons passés maîtres, tout le monde s’en rapportera à nous, Grecs et barbares, hommes et femmes, et nous en userons à notre guise, sans que personne y mette obstacle volontairement ; c’est un domaine où nous serons libres, où nous commanderons même aux autres, et ce domaine sera notre bien, puisque nous en tirerons profit. Mais pour les choses dont nous n’aurons pas acquis la connaissance, personne ne nous permettra d’en user à notre fantaisie ; tout le monde au contraire s’y opposera autant qu’il le pourra, et non seulement les étrangers, mais encore notre père et notre mère et ceux qui pourraient nous toucher encore de plus près ; nous serons ici forcés d’obéir à d’autres, et ces choses seront pour nous des choses étrangères, car nous n’en tirerons aucun profit. M’accordes-tu qu’il en est ainsi ?
— Lysis : Je te l’accorde.
— Soc : Mais nous ferons-nous amis avec quelqu’un et quelqu’un nous aimera-t-il par rapport aux choses où nous ne serons d’aucune utilité ?
— Lys : Non, certes, dit-il.
— Soc : Ainsi ton père n’aimera même pas son fils, ni personne n’aimera un homme, par rapport aux choses où il est inutile ?
— Lys : Il ne me semble pas, dit-il.
— Soc : Si donc tu deviens savant, mon enfant, tout le monde t’aimera, tout le monde s’attachera à toi ; car tu seras utile et bon. Sinon, personne ne t’aimera, ni ton père, ni ta mère, ni tes proches. »
== Amour ==
<small>Voir : [[Pour lire Platon/Vocabulaire/Amour|Amour]]</small>
<small><u>Définition</u></small><br/>
L'amour est un désir pour un objet (être vivant ou réalité), et plus particulièrement un désir d'engendrer, soit des œuvres, soit des descendants.
== Beau ==
<small>Voir : [[Pour lire Platon/Vocabulaire/Beau|Beau]]</small>
== Bien ==
*[[Pour lire Platon/Vocabulaire/Bien|Bien]]
== Bonheur ==
*[[Pour lire Platon/Vocabulaire/Bonheur|Bonheur]]
== Cause ==
<small><u>Définition</u></small><br/>
Une cause est soit ce par quoi une chose est ce qu'elle est, soit ce dont elle est constituée.
<small><u>Explications</u></small><br/>
Platon distingue deux types de cause :
En un sens premier, la cause explique pourquoi une chose est ce qu'elle est : c'est sa raison d'être. En ce sens, une cause est à la fois ce qui donne une qualité à une chose et ce par quoi on peut la connaître. Par exemple, une chose belle est belle du fait qu'elle reçoit cette qualité de la forme du beau : il y a ainsi un rapport de causalité qui explique pourquoi et comment cette chose est qualifiée. Or, cette qualité est une forme (voir cette section) et elle est connue par sa définition, et même s'identifie à elle. Par conséquent, la connaissance de cette définition rend aussi possible la connaissance de ses effets dans les choses sensibles : connaître une cause en ce sens, c'est donc connaître ce qui produit les déterminations du monde sensible, ce qui donne à ce dernier son caractère intelligible.
En un sens secondaire, la cause est ce dont une chose est faite, comme, par exemple, les éléments (feu, eau, etc.) dont elle est composée.
Ces deux types de cause se combinent : ainsi, le fait que Socrate soit assis dans une prison peut être expliqué par la disposition de ses muscles, de son corps, etc. Mais cette explication est manifestement incomplète, puisque la description des éléments qui constituent cette scène n'expliquent pas ce que Socrate fait en prison. C'est donc par la volonté des Athéniens et de Socrate, ainsi que par leur conception de la justice et d'autres formes (le bien et certaines vertus par exemple), que l'on peut comprendre pourquoi ce dernier est dans cette situation. D'une manière plus générale, le monde est constitué d'éléments, mais ce sont les qualités qu'il reçoit des formes qui permettent d'en comprendre l'organisation et la raison d'être.
== Cité ==
*[[Pour lire Platon/Vocabulaire/Cité|Cité]]
== Connaissance ==
:<small>Voir : [[Pour lire Platon/Vocabulaire/Connaissance|Connaissance]]</small>
<small><u>Définition</u></small><br/>
La connaissance est une activité de l'âme au contact d'un objet qui lui permet de dire ce qu'est cet objet.
<small><u>Explications</u></small><br/>
[[File:Platon-Analogie-Ligne.svg|right|200px]]
Au contact d'un objet, l'âme est affectée de différentes manières qui définissent plusieurs manières de parler de cet objet. Ces différentes manières déterminent différentes manières de connaître qui dépendent de la manière d'être de l'objet. Ainsi, chaque sorte de contact de l'âme à un objet (on parlera de mode de connaissance) a un objet qui lui est propre. Ces modes de connaissance sont classés par Platon comme il suit :
Tout d'abord, au ''non-être'', qui ne définit pas à proprement parler un mode de connaissance, correspond dans l'âme l'''ignorance''.
Aux images et illusions correspond la conjecture.
Aux être vivants et aux objets fabriqués correspond la croyance.
Aux notions et aux nombres, correspond la pensée.
Enfin, aux formes correspond l'intellect.
La conjecture et la croyance ont pour objets des choses sensibles, et Platon réunit ces deux modes de connaissance sous le terme d'''opinion''. L'opinion est donc un jugement de l'âme qui porte sur des sensations. Comme l'objet de l'opinion est changeant, celle-ci ne peut justifier sa vérité et sa fausseté.
La pensée et l'intellect ont pour objets des réalités intelligibles, et Platon les désigne tout deux par le nom de ''science''. La pensée correspond aux raisonnements discursifs se fondant sur des hypothèses et elle englobe les sciences particulières, comme les mathématiques. L'intellect est au contraire une intuition de ce qui est, de manière inconditionnelle, et cette intuition est donc la science par excellence, que Platon nomme ''dialectique'', c'est-à-dire la science des formes et de leurs rapports. À cette forme la plus haute de la connaissance (à proprement parler la seule connaissance vraie) correspond l'activité par excellence de l'âme qui est l'activité de l'intellect. Cette activité par excellence est la vertu de l'âme (voir la section ''vertu'').
On a coutume de représenter cette division de la connaissance et de ses objets par une ligne que l'on appelle ''analogie de la ligne''. Le terme ''analogie'' est utilisée car, d'une part, les images des choses sensibles et les choses sensibles sont dans le même rapport que les objets hypothétiques et les formes ; d'autre part, les choses sensibles sont des images des formes.
{| border="1" cellpadding="5" cellspacing="0" align="center"
|+'''La ligne'''
! colspan="2" align="center" |'''Réalités intelligibles'''
! colspan="2" align="center" |'''Choses sensibles'''
|-
! colspan="2" align="center" |'''Science''' (''épistèmé'')
! colspan="2" align="center" |'''Opinion''' (''doxa'')
|-
! align="center"| '''Formes, principes non-hypothétiques'''
! align="center"|'''Objets hypothétiques, mathématiques'''
! align="center"|'''Objets sensibles'''
! align="center"|'''Ombres et images des objets sensibles'''
|-
! align="center"|Connaissance rationnelle intuitive
! align="center"|Connaissance rationnelle discursive
! align="center"|Croyances, convictions
! align="center"|Imaginations
|-
|}
== Courage ==
<small><u>Définition</u></small><br/>
Le courage est la connaissance de ce qu'il faut craindre et ne pas craindre.
<small><u>Explications</u></small><br/>
Le courage est l'une des vertus cardinales (avec la tempérance, la justice et la prudence), et, en tant que vertu, il est une science. Ce statut de science est expliqué dans le ''Lachès''. Si le courage est une fermeté de l'âme qui consiste à tenir bon et à ne pas fuir, cette définition ne tiendrait pas compte des cas où il est courageux de fuir : par exemple, la tactique des Scythes consiste à combattre l'ennemi en fuyant ; résister à certains plaisirs et les fuir peut être également une forme de courage. Si le courage est la fermeté de l'âme, cette définition est contredite par le fait que, dans certains cas, la fermeté est la conséquence de l'ignorance, voire de la folie : il s'agit alors plutôt de témérité, et non de courage. En conséquence, le courage demande l'intelligence de ce à l'égard de quoi il y a courage. Dès lors, c'est la connaissance qui distingue la témérité du courage, et Platon peut donc affirmer que ce dernier est une science.
== Corps ==
:<small>Voir : [[Pour lire Platon/Vocabulaire/Corps|Corps]]</small>
<small><u>Définition</u></small><br/>
Un corps est une partie de la ''khôra'', composé d'éléments (eau, feu, air, terre) et d'une âme.
== Forme ==
:<small>Voir : [[Pour lire Platon/Vocabulaire/Forme|Forme]]</small>
<small><u>Définition</u></small><br/>
Une forme est une réalité immuable et universelle, indépendante de la pensée, et qui donne au monde sensible ses qualités.
<small><u>Explications</u></small><br/>
Le mot français ''forme'' (ou ''Forme'' : l'usage de la majuscule est devenu une habitude dans les traductions, mais il n'a rien d'obligatoire) traduit les mots grecs ''idea'' et ''eidos'' ; ces mots sont aussi traduits par le mot « idée ». La traduction par « forme » est toutefois moins ambigüe et préférable, car le mot ''idée'' laisse à penser que l'on parle d'un contenu de pensée, d'une représentation ou de quoique ce soit qui se trouverait dans l'esprit, ce qu'une forme n'est pas. Enfin, certains commentateurs estiment que ''eidos'' et ''idea'' sont deux notions distinctes, bien que liées. Nous en dirons un mot plus loin.
La théorie des formes est une théorie qui vise à répondre aux questions de savoir ce qui est (on parle alors d'ontologie), quelles sont les normes vraies (éthique ou morale) et ce que c'est que savoir (épistémologie). Le fait qu'il n'y ait pour Platon qu'une théorie pour fonder tous ces domaines permet à celle-ci d'être économique, c'est-à-dire d'éviter de multiplier les hypothèses.
Nous développerons cette explication autour de deux questions : qu'est-ce qu'une forme considérée en elle-même ? quelle est la nature du lien entre forme et choses sensibles ?
Une forme est une réalité, et, bien plus, elle est la réalité même, ou la réalité vraie, par opposition aux choses sensibles, qui n'ont de réalité qu'autant qu'elles ont un certain rapport avec une forme.
Une forme est immuable, c'est-à-dire qu'elle est stable et éternelle. Encore une fois, cette caractéristique s'oppose aux choses sensibles, changeantes et éphémères.
Une forme est universelle, c'est-à-dire qu'il y a de la ressemblance entre les choses sensibles parce que chaque qualité présente dans plusieurs choses est déterminée par une seule et unique forme.
En tant que réalité vraie, immuable et universelle, une forme est toujours indépendante de la pensée : elle peut être l'objet d'un savoir, mais elle existe de toute nécessité en dehors de nous, sans quoi elle ne serait que subjective, c'est-à-dire relative à un sujet, et donc changeante, particulière et dépendante de nos opinions. On ne saurait donc qualifier la pensée de Platon d'idéalisme, puisque les formes sont des réalités objectives indépendantes de la pensée.
Une forme détermine des choses sensibles, c'est-à-dire que, si une chose est belle, c'est par la forme du Beau qui est présente d'une certain façon dans le sensible, ou qui s'ajoute aux choses pour les déterminer. Cette conception du lien entre forme et choses sensibles introduit un rapport de causalité et de ressemblance appelé ''participation''. La participation d'une chose sensible à une forme signifie que la chose sensible reçoit une qualité d'une forme : cette dernière est donc la cause de la présence de la qualité dans la chose et cette présence rend le sensible ressemblant à la forme. Ce problème est abordé plus en détails dans la section ''Participation''.
Les qualités déterminées dans le sensible par les formes peuvent-être morales (beau, bien), définir un vivant (homme, cheval) ou être de nature mathématique (grandeur).
Nous avons fait allusion à une possible distinction entre les mots grecs ''eidos'' et ''idea''. Cette interprétation est la suivante : l’''eidos'' (qu'on traduira par forme) est l'aspect de l’''idea'' (traduit par idée) telle qu'on la saisit dans les choses sensibles ; quand je vois une chose belle, je saisis l'idée du Beau dans une chose sensible. L’''idea'' est l'idée proprement dite, en tant qu'on la saisit par l'intellect. Autrement dit, dans cette interprétation, la forme est une manifestation de l'idée qui se présente donc à même les choses sensibles. Cette interprétation permet de souligner un point de doctrine, parfois négligé, à savoir que Platon ''ne divise pas'' le monde en deux : il n'y a pas d'un côté une réalité sensible et de l'autre une réalité constituée par les formes. Si les formes sont la réalité vraie, il ne peut en effet y avoir une deuxième réalité : le monde sensible existe en tant qu'il manifeste les idées. Il y a donc, pour Platon, un seul et même monde.
Le fait qu'il y ait un seul et même monde permet d'éviter certaines objections que Platon énonce dans le ''Parménide''. Par exemple, s'il y a deux mondes séparés, le sensible et l'intelligible, comment peut-on connaître le second à partir du premier, étant donné que nous vivons dans le monde sensible et que l'intelligible est une autre forme de réalité ? La réponse de Platon est que ce qu'il y a dans le sensible, c'est l'intelligible. Toutefois, cela n'élucide pas complètement le rapport de causalité entre la forme et les choses qu'elle qualifie. Pour l'expliquer, Platon introduit un moyen terme, l'âme, car celle-ci est à la fois le principe du mouvement et le sujet de la pensée.
La première chose que l'on peut remarquer, à propos de cette théorie, est sans doute que la signification du mot ''forme'' ne nous donne pas de manière très claire une idée de ce qu'est une réalité de ce genre. Platon n'en a de fait pas donné de définition, mais présente sa théorie comme une hypothèse qu'il construit pour tenter de répondre à des problèmes éthiques, ontologiques et épistémologiques. C'est en la considérant comme telle que l'on en aperçoit l'intérêt. Tout d'abord, l'immuabilité garantit la stabilité de la connaissance, alors que le monde sensible, qui est un flux perpétuel, ne nous permet que de former des opinions, dont rien ne nous dit de manière assurée qu'elles puissent être vraies ou fausses. Ensuite, l'universalité permet de rassembler sous un seul terme les ressemblances que présentent les choses. Sur ces bases, il devient possible de produire un discours vrai, dans la mesure où ce discours traduit la connaissance par l'âme, et, plus précisément, par l'intellect, de ces réalités que l'on appelle de ce fait des ''réalités intelligibles''. La théorie des formes, comme ontologie (c'est-à-dire répondant à la question de savoir ce qui est) permet donc de définir le savoir et d'expliquer comment nous connaissons, c'est-à-dire qu'elle constitue également une épistémologie : la connaissance naît en effet du contact de l'âme avec la réalité intelligible qu'est la forme. L'aspect affectif de cette connaissance est l'''amour'' (voir cette section).
Enfin, pour ce qui regarde la morale, l'existence d'une forme telle que le bien présente de manière évidente un caractère normatif : s'il y a de telles formes immuables et éternelles, elles sont aussi des normes, opposées à la tradition et au conventionnalisme, et elles doivent gouverner les conduites humaines individuelles et collectives. Cette fondation éthique est également politique, puisque la justice d'une cité dépend de la forme du juste. Mais puisqu'il faut connaître cette forme pour être juste et pour pouvoir gouverner une cité selon la justice, alors ce sont ceux dont l'âme est parvenue à la contemplation des réalités intelligibles, c'est-à-dire les philosophes, qui doivent gouverner.
La théorie des formes a été critiquée dès le vivant de Platon. Ce dernier en a rendu compte dans le ''Parménide'', et Aristote a lui aussi exposé des objections selon lesquelles cette théorie pouvait être jugée inutile. Parmi les philosophes contemporains, on peut remarquer un autre genre de critiques, qui soutient que l'hypothèse d'un monde intelligible est une création qui prend sa source dans la haine du monde sensible. Cette dernière critique, de nature psychologique, a été développée par Nietzsche. Il nous semble que les critiques de nature épistémologique et ontologique, exposées tant par Platon que par Aristote, rendent mieux compte de la démarche intellectuelle que supposent les formes : il s'agit avant tout de trouver des solutions à des problèmes philosophiques. En ce sens, la critique de Nietzsche paraît surtout porter contre l'usage dogmatique du platonisme, que l'on trouve par exemple, dans le christianisme, usage qui en ferait une justification d'un ordre moral fermé à toute recherche intellectuelle. C'est pourquoi cette critique ne nous semble pas rendre compte de tous les aspects de la pensée de Platon.
== Justice ==
<small><u>Définition</u></small><br/>
La justice est l'harmonie des parties d'une cité et d'une âme, lorsque toutes ces parties réalisent les fonctions qui leur revient de réaliser.
<small><u>Explications</u></small><br/>
La justice est l'une des vertus cardinales (avec la tempérance, le courage et la prudence). Sa spécificité, par rapport aux autres vertus, est qu'elle n'est pas une activité de l'une des parties de l'âme, mais est l'état d'une âme ou, dans le domaine politique, d'une cité, dont les parties réalisent leur fonction propre.
== Monde ==
<small><u>Définition</u></small><br/>
Le monde est l'ensemble organisé des choses sensibles.
<small><u>Explications</u></small><br/>
En tant qu'il est l'ensemble des choses sensibles, le monde est composé des éléments géométriques que sont le feu, l'air, l'eau et la terre. La combinaison de ces éléments déterminent au sein du monde les phénomènes de croissance et de décroissance, de génération et de corruption, c'est-à-dire tous les mouvements que l'on peut désigner par le terme général de devenir.
En tant qu'il est organisé, le monde est le produit d'une intention créatrice : le démiurge, divinité fictive hors du monde, introduit en effet dans la ''khôra'' un ordre mathématique entre les éléments, en prenant modèle sur les formes intelligibles, et crée une âme, principe d'ordre et de mouvement, qui maintiendra le monde dans son cours. Le monde a donc un corps et une âme, ce qui en fait un être vivant.
== Sagesse ==
<small><u>Définition</u></small><br/>
La sagesse consiste à placer la pensée au principe de ses actions.
<small><u>Explications</u></small><br/>
== Tempérance ==
<small><u>Définition</u></small><br/>
Le tempérance est la maîtrise des plaisirs.
<small><u>Explications</u></small><br/>
La tempérance est l'une des vertus cardinales (avec le courage, la justice et la prudence), et, en tant que vertu, elle est une science, ce qui suppose l'activité de la pensée. Cette science porte sur les plaisirs, et, plus exactement, sur la capacité de discerner les plaisirs nécessaires des plaisirs secondaires ou excessifs. De ce fait, comme nous le verrons plus en détails dans la section sur le plaisir, la tempérance n'est pas tant une contrainte ou une ascèse, qu'une conduite qui consiste à bien jouir. Celui qui agit droitement ne se prive donc pas de plaisir, mais choisit au contraire des plaisirs qui lui seront bénéfiques. Par conséquent, Platon ne refuse absolument pas les plaisirs des sens en général, tels que les plaisirs de la table, les rapports sexuels ou les spectacles ; néanmoins, le seul plaisir véritable, le plus haut et le plus excellent, demeure celui de l'âme au contact des réalités intelligibles et, en premier lieu, au contact du bien.
== Vertu ==
<small><u>Définition</u></small><br/>
La vertu est l'excellence dans la fonction propre.
== À venir ==
*[[Pour lire Platon/Vocabulaire/Démiurge|Démiurge]]
*[[Pour lire Platon/Vocabulaire/Devenir|Devenir]]
*[[Pour lire Platon/Vocabulaire/Dialectique|Dialectique]]
*[[Pour lire Platon/Vocabulaire/Dieu|Dieu]]
*[[Pour lire Platon/Vocabulaire/Loi|Loi]]
*[[Pour lire Platon/Vocabulaire/Monde|Monde]]
*[[Pour lire Platon/Vocabulaire/Mythe|Mythe]]
*[[Pour lire Platon/Vocabulaire/Nature|Nature]]
*[[Pour lire Platon/Vocabulaire/Nécessité|Nécessité]]
*[[Pour lire Platon/Vocabulaire/Opinion|Opinion]]
*[[Pour lire Platon/Vocabulaire/Paradigme|Paradigme]]
*[[Pour lire Platon/Vocabulaire/Participation|Participation]]
*[[Pour lire Platon/Vocabulaire/Pensée|Pensée]]
*[[Pour lire Platon/Vocabulaire/Philosophie|Philosophie]]
*[[Pour lire Platon/Vocabulaire/Réfutation|Réfutation]]
*[[Pour lire Platon/Vocabulaire/Réminiscence|Réminiscence]]
*[[Pour lire Platon/Vocabulaire/Savoir|Savoir]]
*[[Pour lire Platon/Vocabulaire/Sensation|Sensation]]
*[[Pour lire Platon/Vocabulaire/Technique|Technique]]
*[[Pour lire Platon/Vocabulaire/Vérité|Vérité]]
*[[Pour lire Platon/Vocabulaire/Vivant|Vivant]]
[[Catégorie:Vocabulaire philosophique]]
f25ktnx3kp7czkc43x1u0xk4kfnvpdh
Pour lire Platon/Guide des dialogues
0
30540
764465
764072
2026-04-22T16:31:19Z
PandaMystique
119061
764465
wikitext
text/x-wiki
<noinclude>{{sous-pages}}</noinclude>
<div style="text-align: center; font-size: 1.4em; font-weight: bold; margin-bottom: 1em; padding-bottom: 0.5em; border-bottom: 2px solid #8b7355; color: #3a3530;">※ Guide des dialogues platoniciens ※</div>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 1.5em; width: 100%;">
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
: [[/Premier Alcibiade/]]
: [[/Second Alcibiade/]]
: [[/Hippias majeur/]]
: [[/Hippias mineur/]]
: [[/Ion/]]
: [[/Lachès/]]
: [[/Charmide/]]
: [[/Lysis/]]
</div>
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
: [[/Protagoras/]]
: [[/Euthyphron/]]
: [[/Gorgias/]]
: [[/Ménon/]]
: [[/Apologie de Socrate/]]
: [[/Criton/]]
: [[/Euthydème/]]
</div>
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
: [[/Ménexène/]]
: [[/Cratyle/]]
: [[/Phédon/]]
: [[/Le Banquet/]]
: [[/La République/]]
: [[/Phèdre/]]
: [[/Théétète/]]
</div>
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
: [[/Parménide/]]
: [[/Le Sophiste/]]
: [[/Le Politique/]]
: [[/Philèbe/]]
: [[/Timée/]]
: [[/Critias/]]
: [[/Les Lois/]]
</div>
</div>
[[Catégorie:Pour lire Platon (livre)]]
kyeb9zf1aomy9ackcz9ldtl3yd735pw
764617
764465
2026-04-23T05:40:45Z
PandaMystique
119061
764617
wikitext
text/x-wiki
<noinclude>{{sous-pages}}</noinclude>
<div style="text-align: center; font-size: 1.4em; font-weight: bold; margin-bottom: 1em; padding-bottom: 0.5em; border-bottom: 2px solid #8b7355; color: #3a3530;">※ Guide des dialogues platoniciens ※</div>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 1.5em; width: 100%;">
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
: [[/Premier Alcibiade/]]
: [[/Second Alcibiade/]]
: [[/Hippias majeur/]]
: [[/Hippias mineur/]]
: [[/Ion/]]
: [[/Lachès/]]
: [[/Charmide/]]
: [[/Lysis/]]
</div>
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
: [[/Protagoras/]]
: [[/Euthyphron/]]
: [[/Gorgias/]]
: [[/Ménon/]]
: [[/Apologie de Socrate/]]
: [[/Criton/]]
: [[/Euthydème/]]
</div>
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
: [[/Ménexène/]]
: [[/Cratyle/]]
: [[/Phédon/]]
: [[/Le Banquet/]]
: [[/La République/]]
: [[/Phèdre/]]
: [[/Théétète/]]
</div>
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
: [[/Parménide/]]
: [[/Le Sophiste/]]
: [[/Le Politique/]]
: [[/Philèbe/]]
: [[/Timée/]]
: [[/Critias/]]
: [[/Les Lois/]]
</div>
</div>
<br>
[[Catégorie:Pour lire Platon (livre)]]
ippbfk791jdkxp3iezuwgzry57fgboa
Pour lire Platon/Guide des dialogues/Ménon
0
31164
764632
675934
2026-04-23T11:05:48Z
PandaMystique
119061
764632
wikitext
text/x-wiki
{{sous-pages}}
== Introduction ==
{{wikisource|Ménon|Ménon}}
Le ''Ménon'' est l’un des textes les plus étudiés du corpus platonicien. Relativement bref, trente pages Stephanus, de 70a à 100b, il articule pourtant un nombre important de thèmes : la nature de la vertu, la théorie de la définition, la méthode philosophique, la méthode mathématique, l’éducation, l’origine de la connaissance, l’immortalité de l’âme, la politique athénienne, et la distinction entre savoir et opinion vraie. J. S. Mill l’appelait un « philosophical gem » (Mill 1979 : 375) et la plupart des commentateurs continuent d’y voir un texte d’exception.
La tradition interprétative situe souvent le ''Ménon'' à un point de bascule entre les dialogues « socratiques » et les œuvres dites de la maturité (''Phédon'', ''République''). Cette qualification de « dialogue de transition », qui remonte surtout aux « développementalistes » du XIX{{e}} et du XX{{e}} siècle (voir Scott 2006 : 5-6), repose sur plusieurs constatations : le dialogue commence à la manière d’un texte socratique (recherche d’une définition, aporie), mais il introduit deux doctrines nouvelles, la réminiscence et la méthode hypothétique, qu’on retrouvera dans le ''Phédon'' et la ''République''. Il convient toutefois d’accueillir cette catégorisation avec prudence. Scott (2006 : 5-7) note qu’elle a eu un effet paradoxal : elle a souvent fait lire le ''Ménon'' à travers d’autres dialogues, plutôt que pour lui-même, or c’est précisément l’inverse que le texte semble exiger, lui qui critique à plusieurs reprises le fait de « couper la vertu en morceaux ». Quant à la date de composition, les indices internes et externes ne permettent pas d’en décider rigoureusement ; Bluck (1961 : 108-20) et Day (1994 : 10-11) penchent pour une rédaction autour de 385 av. J.-C., peu après le premier voyage de Platon en Sicile, ce qui expliquerait la présence d’influences pythagoriciennes plus nettes que dans les dialogues antérieurs.
Le ''Ménon'' prolonge une discussion inachevée du ''Protagoras'' : celle de l’enseignabilité de la vertu. Il ajoute cependant un déplacement méthodologique décisif. Le ''Protagoras'' se clôt sur l’exigence de définir la vertu avant d’examiner si elle s’enseigne. C’est précisément là que le ''Ménon'' commence ; et c’est au-delà que le dialogue conduit, en introduisant la méthode hypothétique pour ''examiner'' l’enseignabilité sans attendre d’avoir défini la vertu (Day 1994 : 10).
La scène est située à Athènes vers 402 av. J.-C., soit trois ans avant la mort de Socrate. L’interlocuteur principal, Ménon, est un jeune aristocrate thessalien, disciple de Gorgias. Xénophon (''Anabase'' II, 6, 21-29) lui prête une carrière ultérieure peu glorieuse dans l’expédition des Dix Mille, et une fin ignominieuse, témoignage qu’il faut recevoir avec précaution, car Xénophon est hostile à Ménon (Bluck 1961 : 120-6 ; Klein 1965 : 36-8). Le dialogue prend place chez Anytos, qui figurera parmi les accusateurs de Socrate en 399. Bluck (1961 : 124) rappelle que Platon ne charge pas son personnage aussi lourdement que Xénophon, mais que la réputation ultérieure de Ménon était probablement connue des lecteurs contemporains, qui pouvaient donc lire le dialogue avec une conscience aiguë de ce qu’allait devenir ce jeune homme.
Le plan général peut se décrire ainsi :
* 70a-71d : ouverture, question de Ménon
* 71e-79e : les trois tentatives de définition de la vertu
* 79e-80d : l’épisode de la torpille
* 80d-81a : le paradoxe de l’enquête
* 81a-86c : la doctrine de la réminiscence et l’interrogatoire de l’esclave
* 86c-89a : méthode hypothétique, la vertu est-elle science ?
* 89e-96d : la vertu s’enseigne-t-elle ? L’épisode d’Anytos
* 96d-100b : science et opinion droite ; vertu par faveur divine
== 1. L’ouverture (70a-71d) ==
Le dialogue commence sans préambule, par une question que Ménon pose d’emblée :
<blockquote>« Peux-tu me dire, Socrate, si la vertu s’enseigne ? Ou bien, si elle ne s’enseigne pas, si elle s’acquiert par la pratique ? Ou bien, ni par la pratique ni par l’enseignement, si elle revient aux hommes par nature, ou de quelque autre manière ? » (70a1-4)</blockquote>
Cette ouverture abrupte contraste avec l’usage platonicien ordinaire, qui consiste à ménager une scène, à présenter les personnages et à introduire progressivement le sujet. Bluck (1961 : 108) et Scott (2006 : 13) y voient un indice du personnage de Ménon : jeune et pressé, sûr de lui, habitué à poser des questions plutôt qu’à en recevoir. La lecture reste une reconstruction : Platon ne commente pas cette abruption, mais elle donne immédiatement une coloration dramatique à l’échange.
Les quatre options qu’énumère Ménon (enseignement, pratique, nature, « quelque autre manière ») recouvrent ce que l’on appelle souvent la « triade pédagogique » grecque (''physis, didaskalia, askēsis''), à laquelle Ménon ajoute un terme volontairement vague. Cette quatrième option, selon Scott (2006 : 18), peut annoncer rétrospectivement la « faveur divine » (''theia moira'') qui closera le dialogue ; la lecture est attrayante mais spéculative.
La question porte sur l’acquisition de la vertu. L’adjectif verbal ''didakton'' est ambigu : il peut signifier « effectivement enseigné » ou « susceptible d’être enseigné » (Scott 2006 : 22-3 ; Bluck 1961 : 202-3). Socrate, dans la suite, traite la question comme portant sur la possibilité en droit, sur la nature de la vertu, non sur le fait empirique. Cette lecture est confirmée par le fait qu’il engage aussitôt la recherche sur ce qu’est la vertu plutôt que de dresser l’inventaire des enseignants athéniens.
La réponse de Socrate ne va pas à la question, mais la déplace. Il commence par opposer la Thessalie et Athènes : naguère réputés pour l’équitation et la richesse, les Thessaliens sont désormais renommés pour leur sagesse, grâce à Gorgias et à ses disciples, dont Aristippe, un Aleuade de Larissa, est l’un des plus en vue. L’ironie est reconnue par la plupart des commentateurs (Thompson 1901 : ''ad loc.'' ; Klein 1965 : 39-42 ; Bluck 1961 : 206) : la Thessalie passait pour un pays désordonné, et les Aleuades avaient trahi la Grèce lors de l’invasion perse. La « sagesse » thessalienne ne serait, selon cette lecture, que la rhétorique apprise de Gorgias. Il faut toutefois noter que l’ironie n’est pas explicitement marquée dans le texte : on la reconstruit à partir du contraste entre les faits connus de l’auditoire et la phrase de Socrate.
Socrate ajoute qu’à Athènes la sagesse a disparu, et qu’il ne sait même pas, pour sa part, ''ce qu’est'' la vertu. Comment, dès lors, saurait-il si elle s’enseigne ? Si j’ignore qui est Ménon, comment dirais-je s’il est beau, riche ou bien né ?
Cette analogie introduit le principe dit de la « priorité de la définition », ou « exigence socratique ». Sa formulation la plus simple (Scott 2006 : 20-4) est : on ne peut connaître les attributs non essentiels d’une chose sans en connaître l’essence. Un débat plus large porte sur la version forte de ce principe (« on ne peut rien savoir de ''x'' sans savoir ce qu’est ''x'' ») et sur la question de savoir si Socrate la soutient (Geach 1966 ; Santas 1972 ; Burnyeat 1977 ; Beversluis 1987 ; Benson 1990 ; Prior 1998 ; Vlastos 1994 : ch. 2). Dans le ''Ménon'' stricto sensu, seule la version restreinte est explicitement formulée (71b3-4) ; mais Scott (2006 : 84-8) argumente qu’une version plus forte est en arrière-plan lorsque Socrate invoque l’« exigence dialectique » à 79d.
L’analogie qui appuie le principe est critiquable : connaître Ménon au sens où on le reconnaît n’est pas connaître une essence au sens où l’on définit ce qu’est la vertu (Scott 2006 : 21-2). Mais elle fournit à Ménon une prise intuitive sur l’exigence.
Ménon, étonné, demande si Socrate n’a jamais rencontré quelqu’un qui connaisse la vertu, Gorgias, par exemple ? Socrate répond qu’il ne se souvient plus, et prie Ménon de rapporter ce que Gorgias disait, ou de parler en son propre nom. Klein (1965 : 43-9) relève un jeu de mots dans le texte grec : ''ou panu eimi mnēmon, ō Menōn'', « je n’ai pas bonne mémoire, Ménon », qui associe par contraste le nom de Ménon et la racine ''mnēm-'' de la mémoire. La suggestion de Klein, que Ménon incarne une mémoire défaillante (répétant ce qu’il a entendu dire sans le comprendre), est une lecture ingénieuse mais fortement interprétative. Le texte l’autorise sans l’imposer.
Plus fondamentalement, la mise à l’écart de Gorgias contraint Ménon à parler en son nom propre. Ce geste a une fonction pédagogique reconnue : Socrate, dans nombre de dialogues, refuse la position de disciple qui reçoit, et impose celle du penseur qui rend raison.
== 2. La première définition (71e-73c) ==
Ménon répond par énumération :
<blockquote>« Ce n’est pas difficile, Socrate. Si tu veux la vertu d’un homme, il est facile de dire qu’elle consiste à être capable d’administrer les affaires de la cité, d’y faire du bien à ses amis et du mal à ses ennemis, et de veiller à ne souffrir soi-même aucun mal. Si tu veux la vertu d’une femme, il n’est pas difficile de la décrire non plus : elle doit bien gouverner la maison, en conserver les biens et être soumise à son mari. Il y a aussi une autre vertu pour l’enfant, pour l’esclave, et pour chaque âge, chaque action, chaque condition ; il y a de même autant de formes de vice. » (71e1-72a5)</blockquote>
Plusieurs traits méritent attention.
D’abord, Ménon ne dégage pas ''une'' nature de la vertu mais présente un catalogue. Socrate parlera plus loin d’un « essaim » (''smēnos'', 72a8) de vertus. Cette manière est représentative d’un pluralisme éthique grec, particulièrement hiérarchisé par genre, âge et condition. Elle n’est pas seulement naïve : elle correspond à une vision morale largement partagée dans l’aristocratie athénienne et, plus encore, thessalienne.
Ensuite, la définition de la « vertu d’un homme » que donne Ménon, « faire du bien à ses amis et du mal à ses ennemis », est un topos de l’éthique populaire grecque ; c’est précisément celle que la ''République'' (I, 332a-336a) mettra en question par la bouche de Socrate. Polémarque la défend dans le livre I ; Socrate la réfute. Le ''Ménon'' ne s’y arrête pas, mais le lecteur averti reconnaît la cible.
La réponse de Socrate ne porte pas sur le contenu particulier des clauses, mais sur leur forme logique. Il demande ''ce qui est commun'' à toutes ces vertus. Deux analogies sont déployées.
La première est celle de l’abeille (72b) : si l’on demande ce qu’est une abeille, on ne cite pas les différences d’espèce ; on cherche ''ce par quoi'' toutes les abeilles sont semblables, leur ''eidos'' (forme), leur ''ousia'' (essence). Scott (2006 : 25) souligne que Socrate n’infère pas l’existence d’une forme unitaire à partir du fait que plusieurs choses reçoivent le même nom : il demande si elles sont toutes ''également'' des cas de ''x'', exigence plus forte qu’une simple observation lexicale. La seconde analogie porte sur la santé, la grandeur, la force : ces propriétés ne varient pas selon qu’elles sont dans un homme ou dans une femme.
À ce stade, il est utile de souligner qu’une résistance à l’« hypothèse unitariste » est philosophiquement possible. Wittgenstein, dans les ''Investigations philosophiques'' (§ 66), la mettra en cause avec l’exemple célèbre des « jeux » : il n’est pas sûr que tout terme général renvoie à une essence unique. On peut se demander si Gorgias (dont Ménon récite l’enseignement) n’était pas conscient d’une telle difficulté. Scott (2006 : 24-5) doute que la position gorgienne se laisse rapprocher d’un anti-unitarisme général à la Wittgenstein : l’argument de Ménon s’appuie sur la relativité de la vertu à des rôles sociaux, non sur un scepticisme généralisé à l’égard des définitions. Il n’en reste pas moins que l’hypothèse unitariste socratique demeure une ''supposition'' : elle est présupposée plutôt que démontrée par le dialogue.
En 73a-c, Socrate glisse que la vertu est la même pour tous les humains, c’est-à-dire : être bon, ce qui suppose les mêmes qualités. Bluck (1961 : 222-3) note la présence implicite d’une idée d’''ousia'' en sens non transcendant, simple essence commune aux instances particulières, qu’il ne faut pas encore assimiler à la théorie des Formes séparées du ''Phédon''. Cette précaution est importante : on ne doit pas lire dans le ''Ménon'' des éléments qui n’y sont pas textuellement présents, même s’ils le seront plus tard.
== 3. La deuxième définition (73c-e) ==
Pressé de trouver un caractère commun, Ménon propose :
<blockquote>« Qu’est-ce d’autre, sinon être capable de commander aux hommes, si tu cherches une définition qui vaille pour tous les cas ? » (73c9-d1)</blockquote>
Cette proposition reste conjointe à l’identité sociale de Ménon. Il ne trouve d’unité que dans la vertu d’un homme comme lui, jeune aristocrate destiné à commander. Scott (2006 : 61) rattache ce mouvement à une conception « immoraliste » (celle de Thrasymaque en ''République'' I, 336b-354c, et de Calliclès en ''Gorgias'' 483c-484a), dans laquelle la vertu véritable serait la capacité du fort à imposer sa loi au faible. Cette association interprétative est cohérente, mais reste à demi-conjecturale : Platon ne la marque pas explicitement. Elle est cependant appuyée par le fait que Ménon lui-même reprendra ce thème en 78c, lorsqu’il listera comme « biens » l’or, l’argent, les honneurs et les charges publiques.
Socrate objecte que la définition exclut les enfants et les esclaves ; il demande s’il ne faut pas ajouter « avec justice ». Ménon concède. Mais alors, la justice est-elle ''la'' vertu, ou une vertu parmi d’autres ? Ménon admet qu’il existe plusieurs vertus, courage, tempérance, magnificence (''megaloprepeia''), sagesse... On se retrouve devant un essaim. La réfutation est brève : la définition n’a pas tenu même cinq minutes.
Socrate conclut qu’il faut reprendre le problème à la racine : Ménon n’a pas compris ce qu’est ''définir''. La leçon suivante y sera consacrée.
== 4. La leçon de définition : figure et couleur (74b-77a) ==
Ce passage, souvent traité rapidement dans la littérature, joue un rôle méthodologique important. Socrate illustre ce qu’est une bonne définition sur des termes non éthiques, moins chargés : la ''figure'' (''schēma'') et la ''couleur'' (''chroma'').
Première définition de la figure : « ce qui accompagne toujours la couleur » (75b). Définition extensionnelle, par co-occurrence. Utile mais non rigoureuse, et dépendante d’un terme (couleur) qui reste lui-même à définir.
Un interlocuteur imaginaire est introduit (75c-d) qui pourrait dire : « Je ne sais pas plus ce qu’est la couleur que ce qu’est la figure. » Socrate énonce alors ce qu’on peut appeler « l’exigence dialectique » (75d) : une définition doit procéder par des termes que l’interlocuteur ''admet connaître''. On ne peut pas définir par plus obscur (''ignotum per ignotius''). Il s’ajoute à cette exigence une distinction entre l’éristique (qui vise à vaincre) et la dialectique (qui se pratique entre amis et cherche à comprendre), distinction qui préparera la reformulation du paradoxe comme « argument éristique » en 80e.
Deuxième définition de la figure : « la figure est la limite du solide » (''peras stereou'', 76a). Plus rigoureuse. Genre (solide) et différence (être sa limite).
Un débat interprétatif existe ici sur le sens de ''schēma''. Lloyd (1992) et Vlastos (1991 : 118-21) prennent ''schēma'' au sens de « forme abstraite » (équivalent, à peu près, de l’''epiphaneia'' euclidienne) ; Friedländer (1964 : 279), Klein (1965 : 56-60) et Scott (2006 : 38-46) argumentent pour le sens de « surface » (la surface visible enveloppant un corps). Cette seconde lecture s’accorde mieux avec la troisième définition (celle de la couleur) et avec l’usage platonicien de ''schēma'' dans d’autres passages (''Cratyle'' 432b, ''République'' X 601a, ''Lois'' II 669a). On peut s’en tenir à cette lecture comme plus probable, sans exclure la première.
Ménon réclame une définition de la couleur. Socrate s’y prête « à la manière de Gorgias » :
<blockquote>« La couleur est un effluent des figures (''schēmatōn''), commensurable à la vue et donc perceptible. » (76d4-5)</blockquote>
Définition empédocléenne. Les choses émettent des effluents, les sens ont des pores ; quand l’effluent s’ajuste au pore, il y a perception. Bluck (1961 : 251-3) note qu’il est incertain que cette formule soit empédocléenne au sens strict ; Empédocle tenait la théorie des effluents, mais la formulation précise est peut-être platonicienne (''Timée'' 67c en propose une variante). Socrate la qualifie de ''tragikē'' (76e), terme qui connote la pompe tragique ou la grandiloquence (Bluck 1961 : 252). Ménon la préfère à la définition de la figure ; Socrate, lui, préfère la seconde définition du ''schēma''.
Cette préférence est instructive. L’exigence dialectique, dans sa version exigeante, ne se contente pas d’une impression de familiarité : elle réclame que les termes employés soient réellement compris. Ménon, amateur de rhétorique brillante, confond les deux ; Socrate fait voir l’écart.
On peut lire dans cet épisode une double fonction. D’une part, Socrate enseigne explicitement ce qu’est une bonne définition : genre, différence, clarté des termes. D’autre part, l’exemple choisi est géométrique, ce qui a paru à certains (Vlastos 1991 : 118-25) anticiper le programme de la ''République'' où la géométrie sert de préparation propédeutique à la philosophie. Scott (2006 : 34-5 et 48) tempère cette lecture : l’intérêt de Socrate porte ici autant sur la couleur que sur la figure, et rien n’indique qu’une préparation spécifiquement mathématique à l’éthique soit en vue. Il est plus prudent de voir dans cet épisode un modèle méthodologique général que l’annonce précise de la propédeutique républicaine.
== 5. La troisième définition (77b-79e) ==
Ménon propose une formule empruntée à un poète (probablement Simonide, selon certaines lectures, mais l’identification n’est pas sûre, Bluck 1961 : 254) :
<blockquote>« La vertu, c’est se réjouir du beau et pouvoir (le procurer). » (77b4-5)</blockquote>
Il interprète : désirer les belles choses et être capable de se les procurer. Socrate examine successivement les deux moitiés.
=== 5.1. La critique du désir du mal (77b-78b) ===
Tous désirent-ils le bien, ou y a-t-il des désirs du mal ? Ménon soutient qu’il y a des deux. Socrate distingue deux cas :
''Cas 1'' : ceux qui pensent que le mal est un bien. Ils désirent en réalité ce qu’ils ''croient'' être un bien ; ils ne désirent pas le mal en tant que mal.
''Cas 2'' : ceux qui savent que c’est un mal et le désirent néanmoins. Socrate demande alors : en pensent-ils qu’il leur fera du bien, ou du mal ? Si du bien, retour au cas 1. Si du mal, qu’il les rendra ''kakodaimones'', ils désireraient donc être malheureux. Or personne ne désire être malheureux.
Conclusion : nul ne désire le mal en tant que tel. Tous désirent le bien.
L’argument est un classique de l’« intellectualisme socratique ». Il trouve son plein déploiement dans le ''Protagoras'' (voir Vlastos 1969 ; Nakhnikian 1973 ; Nehamas 1987 : 277-93). Il repose sur ce qu’on peut appeler, avec quelques commentateurs modernes, un « eudémonisme psychologique » : le désir humain vise, au fond, le bonheur. On ne peut désirer quelque chose ''parce que'' c’est mauvais.
Plusieurs objections se présentent, dont il est utile de relever au moins deux.
''Objection 1'' : l’''akrasia''. Aristote insistera, contre Socrate, sur la possibilité d’agir contre son meilleur jugement (''Éthique à Nicomaque'' VII). La position socratique exclut cette possibilité par principe ; elle la redécrit comme une ignorance. On peut considérer que le texte du ''Ménon'' n’affronte pas sérieusement cette objection, il se contente de produire son conséquent, sans en examiner les limites.
''Objection 2'' : la traduction de ''epithumein'' et de ''boulesthai''. Socrate emploie les deux verbes de façon synonymique ; or Croiset et Bodin (1923) ainsi que Weiss (2001 : 36) suggèrent que Platon pourrait ici distinguer un désir rationnel (''boulesthai'', relatif au bien) d’un désir irrationnel (''epithumein'', relatif au plaisir), comme le fera la ''République''. Scott (2006 : 219-20) montre toutefois que cette distinction fonctionne mal dans le texte : les deux verbes y sont clairement traités comme synonymes. Il vaut mieux lire l’argument comme un tout intellectualiste.
L’importance philosophique de l’argument n’est pas à chercher dans ses dernières conséquences (la négation de l’''akrasia''), mais dans ce qu’il prépare : si tous désirent le bien, ce qui distingue le vertueux du vicieux n’est pas l’objet du désir, mais la ''connaissance'' du bien réel. La thèse « la vertu est science » est déjà en vue, bien que le ''Ménon'' ne la soutienne pas pleinement avant 87-89.
=== 5.2. La critique de la capacité de procurer les biens (78b-79e) ===
Ménon précise sa liste des biens : santé, richesse, or, argent, honneurs, charges publiques (78c8-d1). Socrate demande s’il faut ajouter « avec justice ». Ménon convient que oui, sinon c’est du vice.
Socrate montre alors que la définition se dérègle. Car s’abstenir d’acquérir injustement est aussi une vertu. Donc ce qui est vertueux n’est pas l’acquisition, mais ce qui est fait « avec justice ». La vertu serait donc : faire quelque chose avec une partie de la vertu (79b4-5).
Scott (2006 : 55-6) note que, au cours du passage, Socrate semble varier sur le nombre de qualités morales à ajouter (parfois « justice », parfois « justice ou tempérance ou piété », parfois « justice ou toute autre partie de la vertu »). Il ne faut probablement pas surinterpréter ces variations : l’enjeu logique est de faire reconnaître qu’une qualité morale quelconque est constitutive, non d’établir laquelle précisément.
La contradiction est double. D’abord, on a éclaté la vertu en parties alors qu’on demandait l’unité. Ensuite, et plus gravement, on viole l’''exigence dialectique'', on définit ''x'' par ce qui est encore en question. Comment prétendre connaître la justice (une partie de la vertu) sans connaître la vertu elle-même ?
Ici le texte formule une version plus forte de la priorité de la définition : « As-tu l’impression qu’on peut connaître une partie de la vertu si l’on ignore ce qu’est la vertu elle-même ? » (79c8-9). Cette formulation (79d1-4) est l’une des plus nettes du dialogue sur le primat du genre sur l’espèce en matière de connaissance. Scott (2006 : 84-8) y voit la preuve que Socrate adhère au principe de priorité de la définition dans une version large, non seulement sur les attributs, mais aussi sur les parties et, probablement, sur les instances. Cette lecture est contestée (Benson 2000 et d’autres) mais demeure plausible.
== 6. La torpille (79e-80d) ==
Ménon reconnaît son aporie dans l’un des passages les plus célèbres du dialogue :
<blockquote>« Socrate, j’avais entendu dire avant même de te rencontrer que tu ne faisais rien d’autre qu’être toi-même dans l’embarras et plonger les autres dans l’embarras. Et maintenant, il me semble que tu me charmes, que tu m’ensorcelles, que tu me jettes un sort : me voici plein d’aporie. Si je peux plaisanter, tu ressembles tout à fait, en apparence comme pour le reste, à ce poisson plat qu’on appelle la torpille (''narkē''). Elle engourdit qui s’en approche et la touche, et tu m’as fait quelque chose d’analogue : je suis engourdi de corps et d’esprit, et ne sais que te répondre. Pourtant j’ai tenu d’innombrables discours sur la vertu, devant beaucoup de gens, et, je l’imaginais, fort bien. Maintenant je ne puis même plus dire ce qu’elle est. Tu es bien avisé de ne pas quitter Athènes : ailleurs, on t’arrêterait comme sorcier. » (79e7-80b7)</blockquote>
Ce discours est un moment décisif de l’économie du dialogue ; il peut être lu à plusieurs niveaux.
On peut y lire, d’abord, un aveu d’aporie. Ménon reconnaît qu’il ne sait plus ce qu’il croyait savoir. C’est le moment socratique type : l’interlocuteur prend conscience de son ignorance. L’image de la torpille, le poisson ''Torpedo marmorata'', qui paralyse par décharge électrique, est saisissante et a fixé durablement l’imaginaire du dialogue.
On peut y lire aussi une accusation. Comparer Socrate à un ensorceleur, un ''goēs'', n’est pas neutre. Dans le ''Gorgias'' 483e-484a, Calliclès emploie l’image des charmes et de l’ensorcellement pour dénoncer la justice conventionnelle, présentée comme une ruse des faibles. Si l’on admet un parallèle (Scott 2006 : 70 ; Klein 1965 : 88-91), Ménon laisse entendre que Socrate utilise des moyens autres que la raison, charmes, paralysies, pour dominer ses interlocuteurs. La menace d’arrestation comme sorcier (''goēs'') prolonge ce registre sinistre. Il est difficile de ne pas lire, dans le sous-texte, une prolepse du procès. Le texte lui-même ne l’explicite pas ; l’allusion est du commentateur, mais elle est largement partagée.
On peut y lire, enfin, une plainte : quelque chose de réel aurait été retiré à Ménon. Avant de rencontrer Socrate, il savait discourir ; maintenant, il ne peut plus. L’elenchos serait donc destructeur, non purgatif. Scott (2006 : 71-2) met en garde contre la lecture dramatique de ce point : dans l’interrogatoire de l’esclave qui suivra (en particulier 84a-c), Socrate reviendra sur la fonction bénéfique de l’aporie, qu’elle n’ôte pas un savoir réel, mais un savoir prétendu.
La réponse de Socrate (80c-d) est mesurée. Il feint de croire que Ménon voulait seulement qu’on lui retourne la comparaison. Il la refuse. Il précise que si la torpille lui ressemble, c’est à condition qu’elle soit elle-même engourdie : Socrate ne plonge les autres dans l’aporie que parce qu’il y est lui-même. Puis il propose une chose nouvelle : ''chercher ensemble''.
Ce dernier point change le régime de la conversation. Jusqu’ici, Socrate demandait à Ménon de rapporter une thèse qu’il était supposé tenir de Gorgias. Désormais, il propose une enquête commune. L’éthique de la réception cède la place à une éthique de la recherche. Il serait excessif d’y voir un basculement méthodologique de tout le platonisme ; mais il est juste de souligner que, à l’intérieur du dialogue, le régime de parole change ici.
== 7. Le paradoxe de Ménon (80d-81a) ==
Ménon résiste à l’invitation à chercher. Il pose alors une objection célèbre :
<blockquote>« Mais de quelle manière vas-tu chercher, Socrate, ce dont tu ne sais absolument pas ce que c’est ? Laquelle, parmi les choses que tu ne connais pas, te proposeras-tu comme objet de ta recherche ? Et, si tu tombes par hasard dessus, comment sauras-tu que c’est elle, puisque tu ne la connaissais pas ? » (80d5-8)</blockquote>
On peut distinguer deux volets :
:(M1) Sans connaître ''x'', on ne peut même pas spécifier ce qu’on cherche.
:(M2) Même si l’on trouvait ''x'', on ne pourrait le reconnaître, puisqu’on ne le connaissait pas.
Socrate reformule aussitôt l’argument en un dilemme qu’il qualifie d’« éristique » :
<blockquote>« Il est impossible de chercher ce que l’on sait comme ce que l’on ne sait pas. Ce qu’on sait, on ne le chercherait pas : on le sait déjà, et qui sait n’a pas besoin de chercher. Et ce qu’on ne sait pas, on ne peut pas le chercher non plus : on ne sait même pas ce qu’il faudrait chercher. » (80e2-5)</blockquote>
Socrate étend l’argument : là où Ménon niait seulement qu’on puisse chercher l’inconnu, Socrate dilemmatise, on ne peut chercher ni le connu ni l’inconnu.
L’interprétation de ce passage a fait l’objet d’un débat considérable. On peut en distinguer plusieurs aspects.
(a) Le statut de l’argument. Socrate le qualifie d’« éristique » (80e2). White (1974 : 168 n. 1) rappelle qu’''eristikon'' signifie simplement « polémique » ou « obstructionniste », non nécessairement « sophistique » au sens fallacieux. L’argument peut être sérieux, même si l’usage qu’en fait Ménon est stratégique. Scott (2006 : 81-2) défend la thèse que Socrate s’intéresse moins à réfuter logiquement l’argument qu’à diagnostiquer ses usages : Ménon l’emploie pour se dispenser de chercher.
(b) La distinction entre deux problèmes. Scott (2006 : 76-8) et d’autres ont distingué dans l’objection de Ménon deux difficultés. La première (M1) est relativement superficielle : on peut avoir une saisie partielle ou vague de ce qu’on cherche sans avoir la science parfaite, et cette saisie partielle suffit à engager la recherche. Ménon lui-même, à preuve, a une idée de la vertu, il en a tenu maints discours. La deuxième (M2) est plus grave : même pourvu d’une idée initiale, comment saurait-on qu’on a trouvé la bonne réponse ? Cette difficulté, que Scott appelle « le problème de la découverte », continue de se poser même si l’on distingue connaissance totale et saisie partielle.
(c) La réponse de Socrate. Elle n’est ''pas'', selon l’interprétation majoritaire aujourd’hui (Moravcsik 1978 ; Scott 2006 : 79-82), une réfutation logique stricte du dilemme. Socrate dispose pourtant des ressources pour une telle réfutation, la distinction entre savoir et opinion vraie, qu’il énoncera en fin de dialogue. Mais il choisit plutôt de raconter un mythe (la réminiscence) et de faire une démonstration (l’interrogatoire de l’esclave). La fonction de la réminiscence semble davantage ''motivante'' que ''démonstrative'' : elle fonde la confiance que la recherche peut aboutir. D’autres commentateurs (Vlastos 1965 ; White 1974) ont maintenu qu’il s’agit au moins pour partie d’une réponse épistémologique. Le débat reste ouvert.
(d) La profondeur du problème. Socrate pourrait-il ignorer la portée épistémologique réelle du paradoxe et n’en voir que la dimension rhétorique ? Scott a lui-même nuancé sa position : dans Scott 1991 il se demandait si Socrate prend le paradoxe au sérieux ; dans Scott 2006 : 82, il aboutit à une position mesurée : Socrate ne le ''réfute'' pas directement, mais on peut considérer qu’il le prend philosophiquement au sérieux en en faisant le cadre de ses développements suivants.
Il paraît prudent de s’arrêter à cette position : le paradoxe touche à une question réelle de la théorie de la connaissance, mais sa fonction dans l’économie du dialogue est aussi psychologique et rhétorique. Ménon l’emploie pour se dérober, et Socrate y répond par une invitation à chercher plutôt que par une dissection conceptuelle.
== 8. La théorie de la réminiscence (81a-e) ==
Socrate répond en convoquant une tradition religieuse et poétique :
<blockquote>« J’ai entendu parler des hommes et des femmes versés dans les choses divines… » (81a5)</blockquote>
Il s’agit, précise-t-il, de prêtres et de prêtresses soucieux de rendre raison (''logon didonai'') de ce qu’ils pratiquent, ainsi que de poètes divins, Pindare et beaucoup d’autres (81a10-b2). Les contours historiques de ces « prêtres » sont incertains ; Bluck (1961 : 275-6) estime que l’on pense à des « Orphicotélestes » ou à d’autres figures apparentées aux mystères, sans pouvoir identifier un groupe précis. L’idée d’immortalité et de transmigration de l’âme circulait à l’époque, chez les pythagoriciens, chez Empédocle, dans certains milieux orphiques. Socrate se rattache à cette tradition, non pour l’appuyer d’une autorité révélée, mais pour y puiser une thèse qu’il va proposer à Ménon.
La thèse peut se résumer en cinq points :
# L’âme est immortelle et a existé avant la naissance.
# Dans ses existences antérieures, elle a « tout vu ».
# L’incarnation s’accompagne d’un oubli.
# Apprendre, en cette vie, c’est se ressouvenir.
# La nature tout entière étant apparentée (''tēs physeōs hapasēs suggenous ousēs''), la remémoration d’une seule chose permet de retrouver le reste, pourvu qu’on ne se lasse pas de chercher.
Socrate cite Pindare, ''fr.'' 133 Snell-Maehler (81b-c), vers sur les âmes que Perséphone renvoie vers la lumière après paiement d’un « prix de l’antique douleur ». L’usage de Pindare confirme que Socrate s’abrite derrière une tradition religieuse ; il ne revendique pas la réminiscence comme thèse personnelle mais comme un cadre qu’il propose à Ménon d’accueillir à titre d’hypothèse motivante.
Il faut noter plusieurs traits de cette présentation.
D’abord, la distinction entre « prêtres qui rendent raison » et « poètes divins » (81a10-b2) anticipe, selon Scott (2006 : 95), la distinction finale entre savoir et opinion vraie : les poètes disent des choses vraies sans pouvoir les justifier ; les prêtres, eux, rendent raison. Socrate se rapproche des seconds.
Ensuite, Socrate n’impose pas la doctrine : il invite Ménon à juger si elle est vraie (81b2-3). Le régime est hypothétique.
Enfin, le but déclaré de la doctrine n’est pas de réfuter le paradoxe, mais de motiver la recherche :
<blockquote>« Ainsi, il ne faut pas se laisser persuader par cet argument éristique : il nous rendrait paresseux et il est agréable à l’oreille des gens mous. Mais celui-ci [la réminiscence] nous rend actifs et curieux de chercher. Parce que je le tiens pour vrai, je consens à chercher avec toi ce qu’est la vertu. » (81d5-e1)</blockquote>
Le statut logique de la réminiscence face au paradoxe fait débat.
* Vlastos (1965) voit dans la réminiscence une réponse épistémologique précise, qui garantit qu’il y a dans l’âme de quoi soutenir la recherche.
* Moravcsik (1978) propose que la réminiscence soit une analogie avec le souvenir ordinaire, supportant une thèse de la connaissance innée.
* Fine (1992) conteste que Platon tienne une théorie de la connaissance innée au sens fort ; l’âme retiendrait plutôt une disposition à préférer le vrai au faux.
* White (1974) soutient que la réminiscence répond au paradoxe en soutenant qu’il y a un « objet » de la recherche qui nous reste accessible.
* Scott (2006 : 79-82) considère que la réminiscence n’est ''pas'' la réponse logique au paradoxe éristique, mais au « problème de la découverte » (sa version profonde), et qu’elle fonctionne aussi, narrativement, comme incitation à l’effort.
Chacune de ces lectures trouve un appui dans le texte. On peut s’en tenir à une prudence combinée : la réminiscence joue un rôle à la fois théorique (elle rend pensable la possibilité de la recherche) et pratique (elle en soutient la motivation). Elle ne prétend pas, dans le ''Ménon'', à un statut démontré ; elle est présentée comme un ''logos'' reçu, que Socrate juge digne de confiance.
Ménon demande à Socrate de lui ''enseigner'' la réminiscence. Socrate refuse le mot et propose de ''montrer''. Le passage qui suit est l’épisode de l’esclave.
== 9. L’interrogatoire de l’esclave (82b-85d) ==
Socrate appelle l’un des serviteurs qui accompagnent Ménon, un jeune esclave grec qui n’a jamais étudié la géométrie. Il s’agit d’aboutir, par le seul jeu des questions, à la reconnaissance d’un théorème : le carré construit sur la diagonale d’un carré donné est le double de celui-ci.
=== 9.1. Structure de la démonstration ===
Trois phases, ponctuées d’interruptions adressées à Ménon.
Phase 1 (82b-e). Socrate dessine un carré ABCD de 2 pieds de côté. L’enfant identifie sa surface (4 pieds carrés). Quel serait le côté d’un carré de surface double (8 pieds carrés) ? L’enfant répond : 4 pieds (doublement du côté). Socrate, à Ménon : l’enfant ''croit'' savoir.
Phase 2 (83a-e). Socrate construit le carré de 4 pieds : sa surface est 16, non 8. L’enfant propose 3. Socrate calcule : 3×3=9. L’enfant reconnaît ne pas savoir. Socrate, à Ménon : l’enfant est dans l’aporie, mais cette aporie est bénéfique (84a-c), car elle motive la recherche.
Phase 3 (83e-85b). Socrate construit un grand carré de 4 pieds de côté, composé de quatre petits carrés de 4 pieds carrés (total : 16). Il trace les diagonales des quatre petits carrés : elles délimitent un carré intérieur incliné, dont les sommets sont les milieux des côtés du grand carré. Ce carré intérieur est composé de quatre demi-carrés des petits carrés ; sa surface est donc 8, le double du carré initial. Et ses côtés sont les diagonales des carrés de 2 pieds. Conclusion : c’est la diagonale qui produit le carré double.
L’enfant suit pas à pas. À la fin, il identifie la diagonale comme solution.
=== 9.2. Les leçons tirées ===
Socrate tire quatre leçons en dialogue avec Ménon (85b-d) :
# L’enfant n’a donné que ses propres opinions.
# L’enfant ne savait pas au début.
# Ces opinions étaient en lui.
# Qui ne sait pas a néanmoins, sur ce qu’il ignore, des opinions vraies.
Et, ajoute Socrate, si on l’interrogeait longuement et sous de nombreux angles, il aurait à la fin un savoir aussi précis que celui de quiconque. Ce savoir serait donc tiré de lui-même : c’est se ressouvenir.
L’argument conclusif (85d-86b) a suscité des débats. Socrate demande : puisque l’enfant n’a pas appris la géométrie dans cette vie, il avait ces opinions soit depuis toujours, soit il les a acquises avant sa naissance. Dans les deux cas, l’âme possédait le savoir avant l’incarnation. Le texte conclut à l’immortalité de l’âme (86a-b). Plusieurs commentateurs (Gulley 1962 : 21 ; Sharples 1985 : 156 ; Scott 2006 : 117-8) notent que l’argument n’établit à proprement parler que la préexistence, non la survie future, faiblesse logique que le ''Phédon'' tentera d’aborder plus frontalement (105e-107a).
=== 9.3. Questions interprétatives ===
(a) Manipulation ou découverte ? Socrate pose une cinquantaine de questions ; il dessine les figures ; il trace les diagonales. Que reste-t-il à l’enfant ? L’objection de la manipulation est ancienne (Brown 1967) et mérite d’être prise au sérieux.
Scott (2006 : 100-2), suivant en cela une longue tradition (Augustin, ''De magistro'' ; Vlastos 1965 : 157 ; Moravcsik 1978 : 122-5), défend la lecture suivante : l’enfant ''comprend'', il reconnaît la nécessité des enchaînements. Quand Socrate le laisse proposer « 4 pieds », il n’oppose pas un démenti, mais fait calculer à l’enfant, qui voit par lui-même que 4×4=16. De même pour « 3 pieds ». L’enfant ne consent pas parce que Socrate insiste, mais parce qu’il ''voit''. La réminiscence, sous cette lecture, n’est pas l’enregistrement de ce que Socrate dit ; c’est l’acte mental par lequel l’esprit reconnaît la nécessité d’une proposition. L’observable (questions et réponses) n’est que le signe d’un acte invisible. Cette lecture est sans doute la plus défendable, mais on peut retenir que le texte n’exclut pas une lecture plus sceptique.
(b) Opinion vraie ou savoir ? Socrate précise (85c) que l’enfant n’a encore que des opinions vraies, non un savoir. Pour transformer ces opinions en savoir, il faudrait l’interroger « souvent et de nombreuses manières ». Cette précision prépare la distinction finale entre ''epistēmē'' et ''orthē doxa''. Mais elle complique aussi l’argument : si ce que l’enfant a tiré de lui-même n’est encore que de l’opinion, en quel sens exactement y avait-il ''connaissance latente'' ? Fine (1992) tire parti de cette précision pour soutenir que Platon ne tient pas une théorie de la connaissance innée au sens fort, mais seulement une théorie de la prédisposition à la vérité. Scott (2006 : 109-10) défend la lecture opposée : le texte en 85d parle bien de « savoir qu’il a maintenant », ce qui implique un savoir latent. Le débat n’est pas clos.
(c) Portée de la démonstration. Socrate affirme que ce qui vaut pour la géométrie vaut « pour toute la géométrie et pour tous les autres enseignements » (85e), y compris la vertu. La géométrie n’est donc pas, ici, un objet d’étude pour lui-même ; elle joue le rôle d’un paradigme. Mais peut-on légitimement transférer à l’éthique ce qui fonctionne pour une vérité mathématique nécessaire ? La question reste ouverte dans le ''Ménon''. Elle sera plus clairement thématisée dans la ''République'', où l’éducation mathématique précède l’éducation dialectique.
== 10. La méthode hypothétique (86c-89a) ==
Après la démonstration, Ménon consent à poursuivre, mais insiste pour revenir à sa question initiale, la vertu s’enseigne-t-elle. Socrate accepte à contrecœur : il aurait préféré, méthodologiquement, définir d’abord la vertu. Il propose alors une méthode « par hypothèse » (''ex hypotheseōs'', 86e3).
Il illustre par un exemple géométrique réputé difficile :
<blockquote>« Si l’on demande à un géomètre si telle figure (''chōrion'') peut être inscrite dans tel cercle comme triangle, il répondra : "Je ne puis te dire si oui ou non ; mais posons (''hypothesis'') ceci : si cette figure est telle que, étendue le long de sa ligne donnée, elle soit en défaut d’une figure semblable à elle-même, alors il me semble qu’il s’ensuit une conséquence ; et si ce n’est pas possible, il s’en suit une autre." » (86e4-87b2)</blockquote>
Le passage est notoirement obscur. La reconstruction géométrique exacte a occupé un siècle de recherche : Butcher 1888, Benecke 1867, Cook Wilson 1903, Heath 1921, Farquharson 1923, Heijboer 1955, Bluck 1961 (appendice), Scott 2006 (ch. 9 et appendice). Il serait inutile de trancher ici. L’interprétation la plus souvent retenue (Cook Wilson, Heath) suppose une application : étant donné un cercle de diamètre ''BH'' et une aire rectiligne ''X'', il s’agit d’inscrire ''X'' comme un triangle dans le cercle ; la condition est que ''X'' puisse être disposée comme un rectangle ''ABCD'' sur le diamètre de façon à « faire défaut » (''elleipein'') d’un rectangle semblable à lui-même. L’intérêt de cette reconstruction est d’exhiber une ''bi-conditionnelle'' : si la condition est satisfaite, la réponse est oui ; sinon, non.
Plus importante que le détail géométrique est l’idée méthodologique. Face à une question qu’on ne peut résoudre directement, on la ramène à une autre équivalente mais plus accessible : on examine ''p'' via ''q'', sachant que ''p'' et ''q'' sont logiquement équivalents. On procède par ''réduction''. Aristote décrit d’ailleurs cette méthode dans les ''Premiers Analytiques'' (II, 25, 69a20-36) et y fait allusion explicite au ''Ménon'', mentionnant précisément le rapport entre « vertu » et « science » comme exemple de réduction (Bluck 1961 : 80-1).
Socrate applique la méthode :
<blockquote>« Si la vertu est science (''epistēmē''), elle s’enseigne ; si elle n’est pas science, elle ne s’enseigne pas. » (87b-c)</blockquote>
L’examen de l’enseignabilité est ramené à celui de la scientificité. Une question ouverte demeure (voir les appendices de Scott 2006) : quelle est exactement l’hypothèse ? La proposition « la vertu est science » (Cherniss 1947 ; Friedländer 1964 ; Robinson 1953 ; Bluck 1961 : 86) ou la bi-conditionnelle « si la vertu est science, elle s’enseigne » (Robinson 1941 ; Weiss 2001 ; Sternfeld & Zyskind 1976) ? Scott (2006 : 138-41 ; appendice 2) soutient que seule la première interprétation fait sens du passage : l’hypothèse doit être quelque chose de tentatif portant sur la nature de la vertu.
Suit l’argument célèbre pour établir que la vertu est science :
# La vertu est bonne (hypothèse haute, quasi indubitable).
# Elle est utile, elle fait du bien à qui la possède.
# Examinons ce qu’on tient pour des biens : santé, force, beauté, richesse, pouvoir.
# Or ces « biens » peuvent être mal utilisés et devenir nuisibles.
# Ils ne sont donc bons que guidés par la prudence (''phronēsis''), nuisibles guidés par la folie.
# Il en va de même des qualités de l’âme (courage, tempérance, docilité, mémoire).
# Donc le seul bien en soi, qui donne leur valeur à tous les autres, est la science.
# La vertu, en tant que bonne et utile, est donc science, ou au moins une espèce de science.
# Si elle est science, elle s’enseigne.
Cet argument a une postérité considérable. L’''Euthydème'' (278e-282d) en offre une version étendue. Il constitue l’un des fondements de ce que Vlastos (1994) appelait l’« intellectualisme socratique ». Il joue aussi un rôle central dans l’éthique stoïcienne (Sedley 1999 : 309-28).
Quelques nuances sont à apporter, que le texte lui-même rend nécessaires :
* Socrate distingue deux niveaux d’hypothèse : l’hypothèse « basse » (la vertu est science) dérive d’une hypothèse « haute » (la vertu est bonne). C’est une architecture que la ''République'' VI et le ''Phédon'' 100a-102a développeront.
* À 89a, Socrate laisse ouverte la question de savoir si la vertu est ''toute'' science ou seulement ''une'' science (''mia tis epistēmē''). Cette ambiguïté deviendra décisive dans la suite.
* L’argument est présenté comme provisoire. Tant que la vertu n’est pas définie, toute affirmation sur elle reste hypothétique. Socrate insiste là-dessus (89c-d).
== 11. L’épisode d’Anytos (89e-95a) ==
Socrate amorce un mouvement en sens contraire : si la vertu est science, il devrait y en avoir des enseignants. Or y en a-t-il ? À ce moment entre en scène Anytos, qui se joint à la conversation.
L’intrusion d’Anytos est dramatiquement chargée. Anytos est, historiquement, l’un des trois accusateurs de Socrate en 399 (avec Mélétos, qui fut l’accusateur formel, et Lycon). Son apparition au cœur du ''Ménon'' donne à la discussion qui suit une tonalité que les lecteurs contemporains pouvaient reconnaître comme prémonitoire.
=== 11.1. Les sophistes ===
Socrate propose d’abord que, s’il fallait apprendre une ''technē'', on irait chez un professionnel : pour la médecine, chez un médecin ; pour la cordonnerie, chez un cordonnier. Pour la vertu, chez les sophistes ? Anytos explose : les sophistes sont des imposteurs, des corrupteurs.
Socrate feint de défendre Protagoras : quarante ans de bonne réputation, des sommes énormes pour ses leçons, s’il corrompait ses élèves comme un cordonnier qui rendrait les chaussures en pire état, on l’aurait démasqué depuis longtemps. Anytos maintient son accusation.
Socrate pose alors la question décisive : Anytos a-t-il fréquenté les sophistes ? Non. Il ne les connaît que par ouï-dire (''akoē'', 92b). Scott (2006 : 163-4) souligne que ce trait rapproche Anytos de Ménon en plus extrême : paresse intellectuelle, conviction sans examen, refus de chercher.
=== 11.2. Les hommes de bien et l’argument des pères ===
Vers qui aller, alors ? Anytos répond : vers n’importe lequel des ''kaloi kagathoi'', les notables athéniens. Socrate déploie alors ce qu’on appelle l’« argument des pères ».
Il prend quatre figures incontestables : Thémistocle, Aristide, Périclès, Thucydide fils de Mélésias (rival politique de Périclès, ostracisé en 443, non l’historien). S’il y avait des enseignants de la vertu, ce seraient eux. Ils ont fait enseigner à leurs fils toutes sortes d’arts (équitation, musique, gymnastique). Ils auraient ''a fortiori'' fait enseigner la vertu, puisqu’ils voulaient le bien de leurs fils. Or les fils de ces grands hommes n’ont pas égalé leurs pères. Donc la vertu n’est pas enseignable.
L’argument a ses faiblesses. Protagoras, dans le dialogue qui porte son nom, objectait que les fils pourraient manquer de dons naturels (''Protagoras'' 326e-328a). Bluck (1961 : 25-6) remarque que Platon emploie ici cet argument comme ''argumentum ad hominem'' contre Anytos : en démocrate, Anytos ne peut invoquer les inégalités naturelles, puisqu’il suppose que tout homme libre est apte à la vertu. L’argument ne vaut donc pas démonstrativement, mais rhétoriquement contre ce type d’interlocuteur.
Anytos se fâche. Il accuse Socrate de médire des grands hommes d’Athènes et lui conseille de « prendre garde » (94e3-95a1). Il se retire, ou se tait. Bluck (1961 : 432-3) et Sharples (1985 : 178-88) pensent qu’il quitte la conversation ; le texte n’est pas parfaitement décisif, mais cette lecture s’impose.
=== 11.3. Fonction dramatique et philosophique d’Anytos ===
Pourquoi Platon introduit-il Anytos ? On peut proposer, sans prétendre trancher, plusieurs hypothèses complémentaires.
* Scott (2006 : 172-3) suggère que l’épisode sert d’« objet-leçon » pour Ménon : Anytos présente sous une forme extrême les défauts que Ménon commence à manifester, paresse, conviction non examinée, hostilité à l’enquête. En observant Anytos, Ménon pourrait se voir lui-même.
* Le choix d’Anytos n’est pas neutre. Platon charge la scène de pressentiments sur le procès à venir. L’allusion est sobre, mais présente (voir Canto-Sperber 1991 : 22-3).
* Anytos représente un type de vertu athénienne conventionnelle, la ''kalokagathia'', qui sera fortement critiquée dans le ''Gorgias''. Plusieurs commentateurs (Bluck 1961 : 29 ; Klein 1965 : 230-5) soulignent que l’argument d’Anytos, même victorieux contre lui, ne démontre rien sur la vertu véritable : il montre seulement que la vertu ''conventionnelle'' d’Athènes ne s’enseigne pas. Cette précision est importante pour lire la fin du dialogue : il reste logiquement possible, au terme, qu’une vertu fondée sur la science véritable ''puisse'' s’enseigner, mais n’existe pas encore.
== 12. La discussion finale avec Ménon sur l’absence d’enseignants (95a-96d) ==
Anytos parti, Socrate poursuit avec Ménon. Deuxième argument pour l’absence d’enseignants : les hommes de bien sont eux-mêmes partagés sur la question. Chacun est, intérieurement, en proie au doute sur l’enseignabilité de la vertu (95b-c). Socrate invoque Théognis, qui dit tantôt que les bons se forment par fréquentation des bons, tantôt que rien ne peut faire bon qui ne le soit par nature. Cette contradiction du poète illustre l’incertitude générale.
De cet ensemble, Socrate tire une conclusion :
# Si la vertu s’enseignait, il y aurait des enseignants de la vertu.
# Il n’y a pas d’enseignants de la vertu.
# Donc la vertu ne s’enseigne pas.
# Donc (par la méthode hypothétique) la vertu n’est pas science.
La contradiction avec la conclusion de 87-89 est explicite. Comment la résoudre ?
== 13. Science et opinion droite (96d-98c) ==
Socrate propose un rééquilibrage. On avait supposé que seule la science pouvait guider correctement. C’est là qu’on s’est trompé. Il y a autre chose qui peut guider : l’''opinion vraie'' (''orthē doxa'', ''alēthēs doxa'').
L’exemple est limpide :
<blockquote>« Celui qui connaît la route de Larissa pour l’avoir parcourue la montre correctement ; mais celui qui a une opinion droite sur cette route, sans l’avoir parcourue ni la connaître, ne la montre-t-il pas aussi correctement ? » (97a9-b3)</blockquote>
Tant que l’opinion est vraie, elle guide aussi bien que le savoir. La différence pratique, dans l’action immédiate, est nulle.
Ménon, étonné, demande alors pourquoi on estime davantage le savoir, si leur utilité est la même ; et quelle est leur différence.
Socrate répond par la métaphore des statues de Dédale (97d-98a). Selon la légende, les statues de Dédale étaient si vivantes qu’elles s’enfuyaient si on ne les attachait pas. Ainsi des opinions vraies : elles sont précieuses tant qu’elles demeurent, mais elles s’échappent facilement. Pour qu’elles demeurent, il faut les ''lier'', et ce lien consiste à en « calculer la cause » (''aitias logismos'', 98a).
Socrate ajoute : « Et c’est ''anamnēsis'', comme nous en sommes convenus plus haut. » Ce rapprochement entre le « calcul de la cause » et la réminiscence est l’un des passages les plus discutés du dialogue. Il pose au moins trois difficultés.
* Sur le plan textuel, la formulation est rapide et elliptique : Socrate ne développe pas le lien.
* Sur le plan logique, ''aitias logismos'' désigne une démarche active de mise en ordre rationnelle des causes, là où ''anamnēsis'' désignait plutôt le jaillissement d’un contenu préalable. L’identification est donc partielle.
* Sur le plan philosophique, elle anticipe la distinction du ''Phédon'' et de la ''République'' entre science et opinion. Bluck (1961 : 411-5) et Scott (2006 : 181-3) l’interprètent comme un rapprochement fort : le travail de liaison par les raisons est bien ce qui transforme l’opinion en savoir, et c’est aussi ce par quoi l’âme reprend conscience d’elle-même (''anamnēsis''). D’autres (Day 1994 : 17-8 ; Ebert 1973) sont plus réservés, et voient dans l’identification un raccourci dont il faut se méfier.
Il est sans doute plus prudent de formuler ainsi : dans le ''Ménon'', la réminiscence et le calcul de la cause sont ''présentés'' comme coïncidants ; c’est l’un des moments où le texte relie ses propres développements antérieurs ; mais le rapport exact entre ces deux notions reste à déterminer, et les analyses que Platon en donnera dans le ''Phédon'' (100a-102a) ne sont pas encore présentes au ''Ménon''.
Une fois liées par le calcul des causes, les opinions vraies deviennent science ; et celle-ci est plus précieuse, non par son contenu au moment ''t'' (les deux peuvent être vraies au même moment), mais par sa stabilité. La science tient bon ; l’opinion s’envole.
Cette distinction prépare les développements du ''Phédon'', de la ''République'' et du ''Théétète''. Elle introduit aussi une nuance pour le débat moral : il peut y avoir des vertueux qui ne sont pas des savants, mais qui possèdent de justes opinions. Leur vertu est réelle dans ses effets, mais instable dans son fondement.
Socrate précise : il ne prétend pas savoir ''exactement'' ce qui distingue savoir et opinion (98b) ; il sait seulement ''qu’''il y a une distinction. C’est l’une des rares choses qu’il revendique comme savoir, formulation qui ne manquera pas de nourrir les débats sur le rapport du ''Ménon'' au ''disavowal of knowledge'' socratique (voir Vlastos 1994 : ch. 2).
== 14. La vertu par faveur divine (98c-100b) ==
Socrate arrive à la conclusion : la vertu, guidant correctement, est soit science soit opinion vraie. Comme elle n’est pas science (pas d’enseignants, pas d’enseignement), elle est opinion vraie.
Voilà pourquoi les grands politiques athéniens ont pu conduire la cité correctement sans science : ils avaient l’opinion droite, mais sans comprendre, comme les devins et les poètes inspirés qui disent tant de vérités sans rien savoir de ce qu’ils disent. Ils agissent par inspiration divine, ''theia moira'', « faveur divine » ou « part divine » (99c-d).
Socrate conclut :
<blockquote>« Si cette discussion a été menée correctement, la vertu ne vient ni par nature ni par enseignement : elle vient aux hommes qui en sont pourvus par faveur divine, sans intelligence, à moins qu’il n’y ait parmi les politiques un homme capable d’en faire naître un autre comme lui. Un tel homme serait parmi les vivants ce que Tirésias, selon Homère, est chez les morts, quand le poète dit : "Seul il conserve sa raison ; les autres ne sont que des ombres volantes." Tel serait un tel homme parmi nous, face aux autres, pour ce qui regarde la vertu. » (99e4-100a7, citant ''Odyssée'' X, 494-495)</blockquote>
=== 14.1. Questions interprétatives ===
Trois niveaux doivent être distingués (Scott 2006 : 186-94).
(1) Les politiques ont-ils vraiment guidé correctement la cité ? Socrate le dit. Mais le ''Gorgias'' (515c-519d) juge sévèrement Thémistocle, Périclès, Cimon : ils ont empli Athènes de murs, de ports, de tributs, sans se soucier de la vertu. Plusieurs lectures de la fin du ''Ménon'' voient donc une ironie généralisée (Klein 1965 : 238 ; Bluck 1961 : 38-9 et 368 ; Sharples 1985 : 15 ; Kraut 1984 : 302 n. 82 ; Weiss 2001 : 168). D’autres lisent la conclusion comme sincère (Gomperz 1905 ; Hackforth 1952 ; Dodds 1959 ; Calvert 1984 ; Vlastos 1991 : 125 n. 75). Scott (2006 : 188-9) propose une position intermédiaire : le succès des politiques est accepté comme plausible (''phainetai'', 93a5), non pleinement établi ; la théorie de l’opinion vraie est sérieuse, même si son application aux Athéniens demeure discutable.
’''(2) L’opinion vraie est-elle une vraie vertu ?’'' Au début de la section (96e-99c), Socrate attribue « vertu » aux politiques sur la base de l’opinion vraie. Mais la fin (99e-100a) distingue cette vertu de celle, supérieure, du politique capable d’engendrer un autre comme lui, distinction qui sépare « réalité » et « ombres ». On peut y voir l’ébauche de la distinction entre vertu philosophique et vertu populaire que développera le ''Phédon'' 82a-b. Le ''Ménon'' lui-même n’est pas plus explicite ; la lecture reste une conjecture philologiquement raisonnable.
(3) La faveur divine est-elle sérieusement affirmée ? Certains éléments suggèrent l’ironie (la référence à Anytos qui s’irriterait, la brièveté de l’argument). D’autres suggèrent un sérieux : Platon prend souvent l’inspiration divine au sérieux (''Ion'' 534b ; ''Phèdre'' 244a-245c ; ''Timée'' 71e-72a). Vlastos (1991 : 125 n. 75) estime l’attribution sincère ; Scott (2006 : 192-3) refuse de trancher contre elle en l’absence de preuve textuelle forte ; Bluck (1961 : 434-5) la lit ironiquement. Cette fois, la balance textuelle ne penche clairement dans aucune direction.
Il faut donc accepter, sur la fin du ''Ménon'', une irréductible indécision. Le dialogue ne dit pas ''clairement'' ce qu’il pense des politiques athéniens ; il dit que le problème se pose, que l’hypothèse de l’opinion droite est cohérente, que la question véritable reste celle de la nature de la vertu.
=== 14.2. La reprise finale ===
La dernière phrase du dialogue est méthodologiquement significative :
<blockquote>« Il nous sera impossible de savoir cela avec clarté, Ménon, avant que, sans nous occuper de la manière dont la vertu vient aux hommes, nous ayons d’abord cherché ce qu’elle est en elle-même. » (100b4-6)</blockquote>
Le dialogue se clôt sur la même question qui l’ouvrait, « qu’est-ce que la vertu ? », non résolue. Entre les deux, un parcours conséquent : trois définitions rejetées, un paradoxe, une doctrine de la réminiscence illustrée par une démonstration mathématique, une méthode hypothétique, un examen des prétendus enseignants de la vertu, et la distinction entre science et opinion droite.
== Conclusion ==
Le ''Ménon'' est un dialogue qui préfère l’ouverture au dogme. Il ne définit pas la vertu. Il n’arbitre pas entre science et opinion droite, entre enseignement et faveur divine. Il laisse ouvertes presque toutes les questions qu’il soulève. Son intérêt ne tient pas à ses thèses, mais à la manière dont il fait avancer la pensée. On peut en souligner quatre traits.
Premièrement, le dialogue montre ce qu’est chercher une définition. Non énumérer les cas, non répéter l’enseignement reçu, mais dégager ce par quoi toutes les instances relèvent d’un même genre, et le faire par des termes mieux connus que le défini.
Deuxièmement, il met en scène ce qu’est un interlocuteur. Ménon oscille entre désir d’apprendre et paresse, entre docilité et résistance. Il admet son aporie, il suit la démonstration, il consent à chercher. Mais il préfère revenir à la question initiale plutôt que creuser la plus profonde. Scott (2006 : 209-13) a argumenté que Ménon ''s’améliore'' au cours du dialogue ; Klein (1965 : 253-7) y voit au contraire un cas d’''amathia'' qui se protège. La lecture précise de la trajectoire de Ménon reste débattue.
Troisièmement, le dialogue propose une certaine idée de l’apprentissage. Quel que soit le statut métaphysique de la réminiscence, la thèse pratique est claire : apprendre ne consiste pas à recevoir un contenu ; c’est activer quelque chose qui se trouve dans l’âme. La pédagogie socratique ne fait pas déverser un savoir d’une tête dans une autre ; elle sollicite la reconnaissance. La « maïeutique », terme qui n’apparaît pas dans le ''Ménon'' mais que le dialogue inspire, est cette accoucheuse de vérités déjà là.
Quatrièmement, le ''Ménon'' produit deux outils méthodologiques qui auront une postérité considérable : la distinction entre savoir et opinion vraie, et la méthode hypothétique. L’une sera reprise dans le ''Théétète'' (201d-210a) avec la difficile question de savoir ce que le ''logos'' ajoute à la vraie croyance. L’autre sera développée dans le ''Phédon'' (100a-102a) avec la doctrine des hypothèses successives, et dans la ''République'' (VI, 510b-511e) avec la théorie de la dialectique ascendante et descendante.
Il faut toutefois se garder d’une lecture trop téléologique. Il est tentant, pour l’histoire de la philosophie, de voir dans le ''Ménon'' la « première formulation » d’une thèse qui conduirait jusqu’à Leibniz (qui cite explicitement le dialogue dans les ''Nouveaux Essais'' I, i, § 5 et I, iii, Remnant & Bennett 1982 : 52, 78-9) et jusqu’à Kant et son ''a priori''. Le trajet existe en effet, Leibniz se revendique héritier, la doctrine des idées innées des modernes est partiellement platonicienne, mais il est moins rectiligne qu’on ne le dit parfois (voir Brown 1991 ; Scott 1995 : ch. 8). Leibniz, par exemple, objecte à Platon que la réminiscence implique une régression à l’infini (''Nouveaux Essais'', I, i, § 5 ; voir Scott 2006 : 115-6). La dispositionalité innée des modernes n’est pas la connaissance latente du ''Ménon'' ; les stoïciens avaient déjà modifié le paradigme (Scott 1988 ; Scott 1995 : ch. 8). On peut donc dire, prudemment, que le ''Ménon'' propose une idée qui s’inscrit dans une tradition longue ; on dira moins exactement qu’il en est « la première formulation » au sens strict.
Plus sobrement, on peut retenir ceci : le ''Ménon'' est un texte d’exception parce qu’il est à la fois un drame philosophique (avec ses personnages et ses tensions), une leçon méthodologique (comment définir, comment hypothétiser, comment distinguer savoir et opinion), une doctrine métaphysique (immortalité, préexistence, affinité des êtres), et une méditation politique (que valent les grands hommes d’Athènes ? la cité est-elle gouvernée par des savants ou par des aveugles inspirés ?). Le fait que ces quatre registres coexistent en une trentaine de pages explique l’intérêt qu’il continue de susciter. Qu’il les laisse largement ouverts explique qu’on continue d’en débattre.
== Références ==
=== Éditions, traductions, commentaires ===
* Bluck, R. S. (1961). ''Plato’s Meno''. Cambridge University Press.
* Canto-Sperber, M. (1991). ''Platon : Ménon''. Paris : GF-Flammarion.
* Croiset, A. et Bodin, L. (1923). ''Platon, Gorgias-Ménon''. Paris : Les Belles Lettres (CUF).
* Day, J. M. (éd.) (1994). ''Plato’s Meno in Focus''. Londres et New York : Routledge.
* Klein, J. (1965). ''A Commentary on Plato’s Meno''. Chicago : University of Chicago Press.
* Robin, L. (1950). ''Platon, Œuvres complètes'', tome I. Paris : Gallimard (Pléiade).
* Scott, D. (2006). ''Plato’s Meno''. Cambridge University Press.
* Sedley, D. et Long, A. (éd.) (2010). ''Plato : Meno and Phaedo''. Cambridge Texts in the History of Philosophy.
* Sharples, R. W. (1985). ''Plato’s Meno''. Warminster.
* Thompson, E. S. (1901). ''The Meno of Plato''. Londres.
* Weiss, R. (2001). ''Virtue in the Cave : Moral Inquiry in Plato’s Meno''. Oxford University Press.
=== Études ===
* Benson, H. H. (1990). « The priority of definition and the Socratic elenchus », ''Oxford Studies in Ancient Philosophy'' 8, 19-65.
* Benson, H. H. (2000). ''Socratic Wisdom''. Oxford.
* Beversluis, J. (1987). « Does Socrates commit the Socratic fallacy? », ''American Philosophical Quarterly'' 24, 211-23.
* Brown, L. (1991). « Connaissance et réminiscence dans le ''Ménon'' », ''Revue philosophique'' 181, 603-19.
* Brown, M. S. (1967). « Plato disapproves of the slave-boy’s answer », ''Review of Metaphysics'' 20, 57-93.
* Brunschwig, J. (1991). « Pouvoir enseigner la vertu ? », ''Revue philosophique'' 181, 591-602.
* Burnyeat, M. F. (1977). « Examples in epistemology: Socrates, Theaetetus and G. E. Moore », ''Philosophy'' 52, 381-98.
* Calvert, B. (1974). « Meno’s paradox reconsidered », ''Journal of the History of Philosophy'' 12, 143-52.
* Calvert, B. (1984). « The politicians of Athens in the Gorgias and Meno », ''History of Political Thought'' 5, 1-16.
* Cherniss, H. (1947). « Some war-time publications concerning Plato », ''American Journal of Philology'' 68, 113-46.
* Cook Wilson, J. (1903). « On the geometrical problem in Plato’s Meno 86e ff. », ''Journal of Philology'' 28, 222-40.
* Dodds, E. R. (1959). ''Plato : Gorgias''. Oxford.
* Ebert, T. (1973). « Plato’s theory of recollection reconsidered », ''Man and World'' 6, 163-81.
* Fine, G. (1992). « Inquiry in the Meno », in R. Kraut (éd.), ''The Cambridge Companion to Plato'', Cambridge University Press, 200-26.
* Fine, G. (2004). « Knowledge and true belief in the Meno », ''Oxford Studies in Ancient Philosophy'' 27, 41-81.
* Friedländer, P. (1964). ''Platon''. Vol. II. Berlin.
* Geach, P. T. (1966). « Plato’s Euthyphro: an analysis and commentary », ''Monist'' 50, 369-82.
* Gomperz, T. (1905). ''Griechische Denker''. Vol. II. Leipzig.
* Gulley, N. (1962). ''Plato’s Theory of Knowledge''. Londres.
* Hackforth, R. (1952). « Meno 89b-c », ''Classical Review'' 2, 149.
* Heath, T. E. (1921). ''A History of Greek Mathematics''. Vol. I. Oxford.
* Irwin, T. (1977). ''Plato’s Moral Theory''. Oxford.
* Irwin, T. (1995). ''Plato’s Ethics''. Oxford.
* Kraut, R. (1984). ''Socrates and the State''. Princeton.
* Lloyd, G. E. R. (1992). « The Meno and the mysteries of mathematics », ''Phronesis'' 37, 166-83.
* Mill, J. S. (1979). « Grote’s Plato », dans ''Collected Works'', vol. XI. Toronto.
* Moravcsik, J. (1978). « Learning as recollection », in Vlastos (éd.), ''Plato I'', 53-69 ; repris dans Day (éd.) 1994 : 112-28.
* Nakhnikian, G. (1973). « The first Socratic paradox », ''Journal of the History of Philosophy'' 11, 1-17.
* Nehamas, A. (1985). « Meno’s paradox and Socrates as a teacher », ''Oxford Studies in Ancient Philosophy'' 3, 1-30.
* Nehamas, A. (1987). « Socratic intellectualism », ''Proceedings of the Boston Area Colloquium in Ancient Philosophy'' 2, 275-316.
* Prior, W. J. (1998). « Plato and the Socratic fallacy », ''Phronesis'' 43, 97-113.
* Remnant, P. et Bennett, J. (1982). ''G. W. Leibniz : New Essays on Human Understanding''. Cambridge.
* Robinson, R. (1953). ''Plato’s Earlier Dialectic''. 2{{e}} éd., Oxford.
* Santas, G. (1972). « The Socratic fallacy », ''Journal of the History of Philosophy'' 10, 127-41.
* Sedley, D. (1999). « The ideal of godlikeness », in G. Fine (éd.), ''Plato 2 : Ethics, Politics, Religion and the Soul'', Oxford, vol. II, 309-28.
* Scott, D. (1988). « Innatism and the Stoa », ''Proceedings of the Cambridge Philological Society'' 33, 123-53.
* Scott, D. (1991). « Socrate prend-il au sérieux le paradoxe de Ménon ? », ''Revue philosophique'' 181, 627-41.
* Scott, D. (1995). ''Recollection and Experience''. Cambridge University Press.
* Sternfeld, R. et Zyskind, H. (1976). « Plato’s Meno 89c : "Virtue is knowledge" – a hypothesis? », ''Phronesis'' 21, 130-4.
* Vlastos, G. (1965). « Anamnesis in the Meno », ''Dialogue'' 4, 143-67.
* Vlastos, G. (1969). « Socrates on acrasia », ''Phoenix'' 23, 71-88.
* Vlastos, G. (1991). ''Socrates : Ironist and Moral Philosopher''. Cambridge University Press.
* Vlastos, G. (1994). ''Socratic Studies''. Cambridge University Press.
* White, N. P. (1974). « Inquiry », ''Review of Metaphysics'' 28, 289-310 ; repris dans Day (éd.) 1994 : 152-71.
tnqmffnf6icugy36l94k5u05ivutk15
Pour lire Platon/Guide des dialogues/Charmide
0
31166
764498
642550
2026-04-22T18:02:09Z
PandaMystique
119061
764498
wikitext
text/x-wiki
== Introduction générale ==
=== Nature et place du dialogue ===
Le ''Charmide'' appartient à ce groupe de dialogues dits « socratiques » que Platon composa, selon l'hypothèse la plus communément reçue, entre la mort de Socrate (399) et son premier voyage en Sicile (388-387). On ne saurait en serrer davantage la datation sans hypothèses arbitraires : Hazebroucq le situe entre 399 et 390, Kahn entre 386 et 380, Solère-Queval vers 388, Dušanić en 382. En l'absence d'arguments décisifs, la prudence invite à s'en tenir à la fourchette large.
Le dialogue appartient, dans la classification de Thrasylle (Diogène Laërce III, 57-61) reprise jusqu'au dix-neuvième siècle, à la cinquième tétralogie, avec le ''Lachès'', le ''Lysis'' et le ''Théagès''. Il pose une question de forme simple, « qu'est-ce que la σωφροσύνη ? », et s'achève dans une aporie avouée : ni Socrate, ni Critias, ni Charmide ne sont parvenus à définir cette vertu. Cette structure aporétique est commune à plusieurs dialogues de jeunesse, tels l{{'}}''Euthyphron'', l{{'}}''Hippias majeur'' ou le ''Lysis''.
Comment interpréter cet échec ? Plusieurs lectures s'offrent, dont aucune ne s'impose absolument. Une lecture classique, notamment développée par V. Goldschmidt (''Les Dialogues de Platon'') et C. Chrétien (''Platon, Charmide de la sagesse''), y reconnaît la trace d'un « parcours initiatique » : l'aporie évoquerait la régression rituelle qui conditionne la renaissance de l'initié, l'errance argumentative rappellerait l'épreuve imposée aux adolescents dans certaines sociétés archaïques. Cette lecture trouve son appui textuel dans le ''Banquet'' (221d-222a), où Alcibiade compare les discours de Socrate à des objets grotesques en surface mais remplis d'« images de vertu » à l'intérieur. Une autre lecture, plus sobre, voit dans l'aporie le signe d'une limite propre de la méthode socratique, que Platon s'emploiera plus tard à dépasser dans la ''République'' par l'élévation de l'âme au monde des Idées. Nous reviendrons plus loin sur cette alternative ; il suffit, pour commencer, de ne pas confondre la structure apparente du dialogue avec sa signification philosophique ultime.
=== Le sujet : la σωφροσύνη ===
Le mot grec est intraduisible en un seul terme français : il voisine tantôt avec « tempérance », tantôt avec « modération », « maîtrise de soi » ou « sagesse ». ''Sōphrosunē'' se décompose en ''sōs'' (sain) et ''phrēn'' (pensée) ; elle désigne littéralement la « santé de l'esprit ». Dans l'usage classique, le terme recouvre un faisceau de significations : modération dans l'action et dans les passions, pudeur sexuelle, retenue civique, respect des hiérarchies, conscience des limites humaines. Aristophane l'emploie tour à tour pour désigner le comportement ordonné (''Nuées'', 423), la stabilité civique (''Oiseaux'', 414), la réserve féminine (''Lysistrata'', 411) et le respect des lois (''Ploutos'', 388). Cette polysémie même fait la difficulté, et par là même l'intérêt, du dialogue.
Dans le corpus platonicien, la σωφροσύνη reçoit des traitements variés. Dans le ''Protagoras'' (332a), Socrate la glose comme le fait d'« agir correctement et utilement » et tente de la rapprocher de la sagesse (σοφία). Dans le ''Gorgias'' (506e-507d), elle nomme l'ordre de l'âme dans lequel consiste la vertu humaine. Dans la ''République'' (430d-432b), elle est « accord » (''homonoia'') entre ceux qui commandent et ceux qui obéissent, harmonie des cités comme des âmes. Les ''Lois'' (696b-697c) la poseront comme condition préalable de la justice. Le ''Charmide'' précède et prépare ces analyses en s'attachant d'abord à la question d'essence : qu'est-ce donc que cette vertu ?
Le sujet est politiquement chargé. Dans l'Athènes du cinquième siècle finissant, « gouverner avec σωφροσύνη » est presque un mot d'ordre oligarchique. Thucydide rapporte qu'à la fin de la guerre, Pisandre demandait devant l'Assemblée que l'on « gouverne avec plus de σωφροσύνη » et qu'on « confie les magistratures à un plus petit nombre » (8.53.3). Les milieux aristocratiques spartophiles s'en réclament contre la ''polypragmosynē'' démocratique. Le choix de Critias (futur chef des Trente) et de Charmide (futur membre des Dix du Pirée) comme interlocuteurs principaux confère ainsi à l'enquête une coloration politique que le lecteur moderne ne doit pas sous-estimer.
=== Les personnages ===
Socrate, qui narre tout le dialogue à un auditeur anonyme, rentre du front de Potidée. Le contexte historique précis est cependant controversé. La critique récente hésite entre deux identifications de la bataille mentionnée en 153b. L'hypothèse classique renvoie à la bataille de 432 devant Potidée, à laquelle Socrate participa et au cours de laquelle il sauva la vie d'Alcibiade (''Banquet'' 220d-e) ; mais, comme le note L.-A. Dorion dans son introduction à la traduction GF Flammarion, cette hypothèse est problématique, notamment parce que l'armée athénienne ne fut pas démantelée après la bataille de 432. Selon plusieurs commentateurs récents (Luckhurst 1934, McAvoy 1996, Planeaux 1999), il s'agirait plutôt de la bataille de mai 429 aux environs de Spartôlos, où les Athéniens essuyèrent une lourde défaite (Thucydide II, 79) ; cette hypothèse est compatible avec le retour à Athènes que le ''Charmide'' présuppose. La date dramatique du dialogue se situerait donc vers 429, soit quelque vingt-six ans avant la tyrannie des Trente (404-403). Ce que le lecteur, en tout état de cause, sait par avance, c'est la catastrophe que l'histoire réserve à deux des trois interlocuteurs.
Charmide, fils de Glaucon, est un adolescent à la beauté proverbiale, cousin et pupille de Critias, oncle maternel de Platon. Le ''Banquet'' (222b), situé en 415, le range parmi les anciens jeunes amis de Socrate qui s'en sont éloignés. Il périra en 403 à la bataille de Munychie, dans les rangs des oligarques.
Critias, fils de Callaischros (vers 460-403), est au moment de la scène un homme mûr. Poète et polymathe, familier d'Alcibiade, il entretient des sympathies spartiates. Les fragments conservés de son œuvre (DK 88 B6-7) attestent qu'il a théorisé la σωφροσύνη : une élégie loue la modération spartiate dans la boisson, y associe la « Santé, voisine de la Sainteté » et personnifie la Σωφροσύνη comme une déesse. Il retient par ailleurs la maxime attribuée au Spartiate Chilon, « rien de trop », et la rapproche d'une autre inscription delphique. Le choix de Critias comme interlocuteur principal dans le ''Charmide'' n'est donc pas ironique au sens où il serait aberrant : il est légitime qu'un homme qui a érigé la σωφροσύνη en idéal personnel et civique vienne débattre de sa définition. L'ironie, réelle, tient plutôt au contraste entre l'ambition théorique du personnage et la catastrophe politique que l'histoire lui réservera.
Critias fut en 404 l'un des chefs du régime oligarchique imposé par Sparte après la défaite athénienne : la tyrannie dite « des Trente », qui fit exécuter sans jugement près de mille cinq cents citoyens et chassa vers le Pirée plus de cinq mille autres (Isocrate 7, 67 ; pseudo-Aristote, ''Constitution d'Athènes'' 35, 4). Il mourut lui-même à la bataille de Munychie, aux côtés de son jeune pupille. La tradition postérieure, relayée par Xénophon (''Mémorables'' 1, 2, 12 ; ''Helléniques'' 2, 4, 19), en a fait le plus féroce des Trente. Il convient toutefois de ne pas réduire le personnage à une caricature noire, comme l'ont souligné Tuozzo et Tsouna : c'est dans les tensions du portrait, dans ses clairs-obscurs, que se joue l'interprétation platonicienne. Dans le ''Timée'' (20a) et dans le ''Critias'', Platon lui prêtera d'ailleurs un rôle positif et savant.
Chéréphon, enfin, est le familier enthousiaste de Socrate, présenté comme un ''manikos'' (153b), terme que l'on peut rendre par « exalté ». On sait par l{{'}}''Apologie'' (21a) que c'est Chéréphon qui interrogea la Pythie et reçut l'oracle déclarant qu'aucun homme n'était plus sage que Socrate : sa présence dès l'ouverture inscrit donc discrètement Delphes à l'horizon du texte.
=== Méthode et enjeux ===
Toute définition proposée sera réfutée. Mais l'échec des définitions successives n'exclut pas que le dialogue progresse, dans la mesure où chaque réfutation met en évidence un aspect de la vertu que la formule antérieure avait laissé échapper. Selon la ''Lettre VII'' (342a-b, 343e), la recherche de l'essence d'une réalité procède à la fois par l'analyse du nom, par la formulation de définitions et par l'examen des « images », c'est-à-dire des incarnations partielles. Le ''Charmide'' met en œuvre ces trois procédés : Charmide et Socrate, par leurs conduites respectives, offrent deux images vivantes de la σωφροσύνη, que les définitions successives viennent éprouver.
L'un des fils interprétatifs les plus probants a été dégagé par l'édition Dorion : l'incantation (''epōidē'') que Socrate apprend aux Thraces et qu'il propose d'administrer à Charmide désigne métaphoriquement l'élenchos, c'est-à-dire la réfutation dialectique. Elenchos et incantation sont rapprochés non par leur forme mais par leurs effets : l'un et l'autre ont pour propriété d'engourdir l'interlocuteur et de le rendre disponible à l'action de celui qui parle, de sorte que Socrate est parfois décrit, chez Platon lui-même, comme un « sorcier » (''Ménon'' 80a-b) ou comme une « raie torpille » (''Ménon'' 80a). Si cette hypothèse herméneutique est recevable, le prologue du ''Charmide'' ne vaut pas simple décor : il énonce déjà métaphoriquement la thèse selon laquelle la sagesse ne peut être produite dans l'âme que par l'exercice de la réfutation dialectique. La fin du dialogue, en consacrant Socrate comme dispensateur de ce « charme », confirmerait cette lecture.
== I. Le prologue (153a à 159a) ==
=== 1. Le retour de Potidée (153a-c) ===
« J'étais arrivé la veille au soir de l'armée de Potidée, et je m'empressai, après une si longue absence, de revoir les lieux que j'avais coutume de fréquenter. » Ainsi s'ouvre le récit. Socrate parle à la première personne à un auditeur muet, procédé qu'on retrouve dans le ''Lysis'', le ''Parménide'', la ''République'' et le ''Théétète''. Chéréphon, à peine Socrate est-il entré dans la palestre de Tauréas, s'enquiert des pertes : « l'engagement a été très rude et il y a péri beaucoup d'hommes de notre connaissance ». Socrate répond laconiquement : « le rapport est assez juste ». Il accepte ensuite de s'asseoir auprès de Critias.
Cette ouverture apparemment anecdotique mérite attention. Socrate, Athénien par excellence, n'a quitté sa cité que contraint par ses obligations militaires ; il rentre du front, où il vient d'assister à un combat sanglant, et se montre prêt à philosopher sans dramatisation. Cette placidité est déjà l'un des indices dramatiques de la σωφροσύνη que le dialogue s'apprête à interroger : Tsouna a bien noté que Socrate, à la différence du « manique » Chéréphon, paraît maître de lui-même, sans pour autant afficher d'héroïsme. La mention de la bataille inscrit cependant la scène sous un horizon plus grave que ne le laisserait penser son ton poli : le siège de Potidée fut, dans l'un ou l'autre de ses deux épisodes, un épisode meurtrier de la guerre du Péloponnèse.
Deux détails topographiques méritent mention. La palestre de Tauréas se trouve « en face du temple de Basilè ». L'identification de cette divinité n'est cependant pas assurée et il faut se garder d'en forcer l'interprétation symbolique. Plusieurs hypothèses ont été proposées : pour Witte (1970, p. 40-42), Basilè serait Perséphone, reine des Enfers, identifiée sur la base d'une inscription attique de 418 et du caractère chthonien supposé du sanctuaire ; pour Shapiro (1986), thèse que suit l'édition Dorion, Basilè serait plutôt la personnification de l'ancienne royauté (''basileia'') athénienne ; pour Rotondaro (2000), le temple de Basilè serait lié au soin de l'âme, par contraste avec la palestre tournée vers le soin du corps. Tsouna, prudente, note que « l'identité de Basilè ne peut être inférée avec certitude », même si elle penche pour l'hypothèse de Perséphone. Je mentionne cette pluralité pour en tirer une conclusion méthodologique : les lectures qui font du temple de Basilè le signe d'une tonalité eschatologique et chthonienne du dialogue tout entier reposent sur une identification contestée et doivent, de ce fait, être considérées comme une hypothèse herméneutique plutôt que comme un fait textuel.
L'autre détail significatif est moins incertain. Dans les premières lignes, le terme ''psukhē'' (âme) apparaît avec une fréquence que L.-A. Dorion a relevée : sept occurrences sur onze dans l'ensemble du dialogue se concentrent dans le prologue. Cette insistance est structurelle : le prologue établit un lien entre la sagesse et l'âme, lien que Critias, plus tard, oubliera en substituant à ''psukhē'' le terme plus intellectualiste de ''dianoia'' (pensée). L'ouverture dessine ainsi, sans le thématiser, le clivage qui départagera Socrate et Critias.
=== 2. L'entrée de Charmide et l'épreuve érotique (153d-155e) ===
Socrate s'enquiert auprès de Critias de l'état de la philosophie à Athènes et des jeunes gens qui s'y distinguent par la beauté ou par l'esprit. La double question n'est pas fortuite : elle signale que la qualité intellectuelle de la jeunesse mesure la santé spirituelle de la cité. Critias annonce l'arrivée imminente de son cousin Charmide : « celui qui paraîtra tout à l'heure sera bientôt réputé le plus beau » (''kallistos'', 154a). Charmide entre, escorté d'une bande d'admirateurs, et toute la palestre se tait.
Socrate se décrit d'abord comme une « mesure sans valeur » (''leukē stathmē''), une « règle blanche » en matière de beauté : presque tous les jeunes gens de cet âge lui paraissent beaux. La vue de Charmide modifie ce régime. Même les enfants, note-t-il, sont saisis. Et quand Critias fait approcher son cousin sous prétexte de le présenter au médecin, Socrate confesse son trouble : apercevant « ce qu'il y avait sous le manteau » (155d-e), il n'est plus « maître de lui-même », il « brûle », il se sent « comme une bête sauvage ». La tempête érotique est à son comble.
Il résiste pourtant. Là où les autres hommes se bousculent sur les bancs pour se rapprocher de l'adolescent, où l'un d'eux tombe même à la renverse, Socrate se ressaisit. On peut y lire, sans prétendre que Platon ait voulu ici dessiner un tableau continu, une préfiguration du mythe du ''Phèdre'' (253c-254e) : le cocher de l'âme conduit ses deux chevaux, l'un noble, l'autre sans frein, et c'est son redressement qui lui permet, apercevant « le visage du bien-aimé », d'être « porté par la réminiscence vers la nature même de la beauté » et de la voir « assise à côté de la Sagesse sur son trône vénérable ». Qu'il y ait analogie de structure ne signifie pas qu'il faille projeter ici la doctrine développée dans le ''Phèdre'' ; l'analogie, prudente, sert seulement à faire voir que la maîtrise érotique socratique est un fait dramatique signifiant.
Plus fondamentalement, le passage illustre ceci : avant que la σωφροσύνη ne soit thématisée comme objet de définition, elle est exemplifiée dans le héros. Socrate tient bon à la guerre et tient bon devant le bien-aimé. Cette exemplification n'est pas sans ambivalence. La maîtrise socratique peut se confondre avec de la froideur, voire avec du mépris pour ce qui émeut ordinairement les hommes. Alcibiade en fera le reproche dans le ''Banquet'' (215-222). Et dans l'ouverture même du ''Charmide'', une inquiétude discrète affleure : Socrate accepte de se prêter à une ruse, à un mensonge thérapeutique sur le mal de tête. Est-ce la conduite d'un sage ? La question orientera la suite du dialogue.
=== 3. Le stratagème du mal de tête (155b-156d) ===
Critias, complice, présente Socrate comme un guérisseur capable de soigner le mal de tête dont souffre Charmide le matin. Socrate accepte le rôle. Il prétend détenir un remède composé d'une certaine feuille et d'une incantation (''epōidē''), mais précise aussitôt que la feuille seule, sans l'incantation, ne guérit rien.
Pourquoi Socrate consent-il à ce mensonge thérapeutique ? La ''République'' (389c) fournit un principe : le mensonge est utile aux hommes sous forme de remède, à condition d'être réservé au médecin. Pour conduire autrui vers le bien, la ruse est parfois nécessaire, car le but lointain, la sagesse, a moins d'attrait immédiat que la séduction d'un soulagement physique. Nul ne peut désirer ce qu'il ne connaît pas. Le mensonge de Socrate est donc pédagogique : il parle à Charmide le seul langage que celui-ci puisse entendre, pour le conduire insensiblement au soin de l'âme. On pourra préférer, avec d'autres commentateurs, ne pas forcer la clef du « pieux mensonge » et voir plutôt dans le stratagème une ruse sociale : la consultation médicale est le cadre discret qui permet à Socrate d'aborder philosophiquement un jeune homme entouré d'admirateurs. Les deux lectures ne sont pas exclusives.
De quoi souffre Charmide ? D'un mal de tête matinal et chronique. Drew Hyland a suggéré qu'il pourrait s'agir d'une « gueule de bois » due à des excès nocturnes. L'hypothèse est possible mais spéculative, et peu compatible avec la réputation de réserve attachée au personnage. Plus sobrement, on peut observer que la métaphore du mal de tête et de son remède joue avec l'une des acceptions courantes du mot σωφροσύνη : « avoir bon sens », « être sain d'esprit ». Charmide souffre de la tête, et son remède sera la sagesse. La mise en scène dramatique est ainsi étroitement liée au jeu de mots sur la vertu.
=== 4. L'incantation thrace et la doctrine de Zalmoxis (156d-157c) ===
Voici le cœur du prologue. L'incantation, précise Socrate, il l'a apprise d'un médecin thrace, disciple de Zalmoxis, dieu honoré chez les Gètes. Le médecin thrace enseignait que les médecins grecs ont raison de dire qu'il ne faut pas soigner les yeux sans soigner la tête, ni la tête sans soigner le corps entier. Mais, ajoutait-il, Zalmoxis va plus loin : on ne peut soigner le corps sans soigner l'âme. « Et c'est pourquoi la plupart des maladies échappent aux médecins grecs : ils ignorent le tout dont il faut s'occuper, et le tout allant mal, il est impossible que la partie se porte bien ». L'âme est la source du bien et du mal pour le corps et pour l'homme. C'est elle qu'il faut soigner d'abord. Or, dit le Thrace, « on soigne l'âme par des incantations, et ces incantations sont les beaux discours (''hoi logoi hoi kaloi''). Ils font germer dans les âmes la sagesse (σωφροσύνη) ; et une fois qu'elle y est établie, il est facile de procurer la santé à la tête et au reste du corps ».
Ce développement, qu'on prendrait à tort pour une digression pittoresque, énonce plusieurs des thèses directrices du dialogue.
En premier lieu, la σωφροσύνη est identifiée à la santé de l'âme. Cette équivalence traverse la pensée grecque depuis Héraclite, chez qui on lit que « tous les hommes ont en partage de se connaître eux-mêmes et d'être ''sōphrones'' » (DK 22 B116 = D30 LM). Elle constitue, avec l'éloge traditionnel de l{{'}}''aidōs'', la toile de fond que les définitions ultérieures ne cesseront de solliciter.
En deuxième lieu, la philosophie est présentée comme une médecine. Les « beaux discours » sont le remède. Si l'on admet, avec L.-A. Dorion, que l'incantation désigne métaphoriquement l'élenchos, c'est-à-dire la réfutation dialectique, alors Socrate, en offrant à Charmide son incantation, offre en réalité au jeune homme l'épreuve dialectique elle-même, sous couvert d'une consultation médicale. Cette identification éclaire à la fois le prologue et la clôture du dialogue, dans laquelle Charmide acceptera de « se soumettre » quotidiennement au charme socratique. Elle rapproche en outre le ''Charmide'' de ce que le ''Gorgias'' (464b-466a) dira bientôt : la médecine de l'âme est la véritable politique, par opposition à la rhétorique sophistique qui se contente de flatter.
En troisième lieu, le principe holistique du médecin thrace (le tout commande la partie) ouvre la polémique qui traversera tout le dialogue : celle de la subordination entre les savoirs spécialisés et un savoir englobant. Lorsque Critias définira plus loin la σωφροσύνη comme « science des sciences », il développera à sa manière cette intuition. On remarquera cependant que l'allégorie thrace n'est pas sans équivoque : si le corps est « la partie » et l'âme « le tout », dans quel sens l'âme est-elle le tout ? N'est-ce pas plutôt l'homme entier, âme et corps, qui constitue le tout ? L'indétermination, voulue ou non, pointe une difficulté qui ne sera jamais complètement résolue.
En quatrième lieu, la référence à Zalmoxis inscrit le soin de l'âme dans un horizon religieux. Hérodote (IV, 94-96) rapporte que les Gètes pratiquaient un culte de Zalmoxis associé à la croyance en l'immortalité de l'âme, et que les initiés étaient dits ''athanatizontes'', « ceux qui se rendent immortels ». On peut en déduire, avec certains commentateurs, que Platon suggère par là une portée eschatologique du soin de l'âme : soigner l'âme ne serait pas seulement viser le bien-être de cette vie, mais préparer l'âme à sa condition au-delà. Cette lecture n'est cependant pas explicitement soutenue par le texte. Elle se greffe sur l'analogie thrace sans que Socrate en thématise ici la dimension eschatologique. Il faut donc l'entendre comme une hypothèse herméneutique, laquelle trouve ses appuis davantage dans le ''Phédon'' (78a, où Socrate mentionne les « médecins-magiciens thraces » et les incantations comme remèdes à la peur de la mort) que dans le ''Charmide'' lui-même.
En cinquième lieu, Socrate insiste sur le serment qu'il a prêté au Thrace : ne jamais administrer le remède pour la tête sans avoir d'abord traité l'âme par l'incantation. Ce serment a une fonction dialectique précise. Il garantit à Socrate la maîtrise du dispositif : il ne « guérira » Charmide qu'à condition que celui-ci accepte d'abord de « soumettre son âme » à la philosophie. La consultation médicale est ainsi convertie en entretien dialectique.
En dernier lieu, la localisation thrace n'est sans doute pas arbitraire. La Thrace fonctionne chez Platon comme lieu emblématique d'une sagesse venue des confins, tournée vers les mystères (cf. encore ''Phédon'' 78a). Que Socrate rentre de Potidée, c'est-à-dire de Thrace, porteur d'une telle incantation, suggère que la campagne militaire a été en même temps, pour lui, un apprentissage philosophique, au moins métaphorique.
=== 5. Éloge de Charmide et première mise à l'épreuve (157d-159a) ===
Critias répond que Charmide n'a pas besoin qu'on lui inculque la σωφροσύνη, puisqu'il la possède déjà au plus haut point. Il passe, à Athènes, pour le plus ''sōphrōn'' des jeunes gens, tout en étant le plus beau. Socrate abonde : la noblesse de lignage de Charmide (par son père, famille de Dropidès, l'ami de Solon ; par sa mère, famille de Pyrilampe, liée à Périclès) laisse attendre, au jugement du discours aristocratique traditionnel, une qualité d'âme correspondante. Il attire cependant subtilement l'attention (154d-e, 158a) sur le fait que la beauté extérieure et la noblesse ne garantissent pas, à elles seules, que l'âme soit telle qu'elle doit être.
La proposition de Socrate d'examiner ensemble le cas de Charmide est d'abord accueillie avec un sourire imperceptible mais révélateur : Charmide rougit (158c). Ce rougissement est un signe de pudeur (''aidōs''), c'est-à-dire précisément de l'un des traits traditionnellement associés à la σωφροσύνη. La vertu est, avant d'être dite, visible dans le corps même de l'adolescent. Socrate le note : « il m'a paru plus beau que jamais ». Il y a là une beauté morale (''kallion'') superposée à la beauté physique.
Socrate demande alors à Charmide s'il possède la σωφροσύνη. Le jeune homme est pris dans une difficulté plus sociale encore que philosophique : s'il répond oui, il se fera taxer de présomption ; s'il répond non, il contredira ses admirateurs, et en particulier Critias, ce qui serait insolent. Il ne peut donc répondre. L'incapacité même est éloquente : Charmide ignore ce qu'il est, et il mesure d'abord les implications sociales de sa réponse avant d'en mesurer la portée intellectuelle. La σωφροσύνη qu'on lui prête se dérobe dès qu'on tente de la lui faire dire. Socrate fournit alors la procédure qui va orienter toute la discussion : « tu dois savoir, mieux que personne, si cette vertu habite en toi ; tu peux donc, en tournant ton regard vers toi-même, nous dire ce qu'elle t'apparaît être » (158e-159a). Cette procédure (''eis seauton apoblepsas'', « tourner le regard vers soi-même ») préfigure l'injonction delphique que Critias reprendra dans la cinquième définition.
== II. Les trois définitions de Charmide (159b à 162b) ==
Charmide propose successivement trois définitions : tranquillité, pudeur, faire ses propres affaires. Chacune révèle un aspect distinct de la σωφροσύνη traditionnelle. La première porte sur la manière extérieure d'agir ; la deuxième, sur le ressort intérieur de cette manière ; la troisième, sur le contenu moral et civique de l'action. Ensemble, elles décrivent la phénoménologie de la σωφροσύνη telle que la culture grecque classique la peint. Ensemble aussi, elles se révèlent incapables de saisir ce qui, dans cette vertu, est proprement normatif.
=== 1. Première définition : une sorte de tranquillité (159b à 160d) ===
Pressé par Socrate, Charmide répond, avec quelque hésitation, que la σωφροσύνη consiste « à faire toutes choses avec ordre et tranquillité : marcher dans les rues, discuter, et ainsi de tout le reste » ; en un mot, « une sorte d'état de tranquillité » (''hēsuchiotēs tis'', 159b3).
Le terme ''hēsuchia'' désigne le calme posé, la lenteur mesurée, le comportement sans précipitation. Xénophon décrit en ces termes la σωφροσύνη spartiate : « marcher dans la rue en gardant les mains près du corps, aller en silence, ne pas regarder partout » (''Constitution des Lacédémoniens'' 3, 4). Aristophane, dans les ''Nuées'' (962-984), loue les jeunes gens qui prennent soin de ne pas attirer l'attention sur leur beauté. La ''hēsuchia'' est aussi, chez Thucydide (3, 82, 4), l'opposé politique de la témérité ; elle caractérise l'aristocrate qui ne se mêle pas des affaires ni ne brigue le pouvoir. C'est la posture corporelle et sociale de l'homme bien né : silencieux, posé, retenu. Pindare la personnifie (''Pythique'' 8) comme la « bienveillante Hésychia », opposée à la violence de l'hubris.
Charmide lui-même, par sa manière d'entrer dans la palestre (retenu, distingué, à l'opposé de ses compagnons bruyants), incarne cette définition. Il décrit donc, sans en prendre conscience, sa propre manière d'être, ou plutôt l'image qu'on lui a donnée de lui-même et qu'il n'a pas examinée. La rapidité avec laquelle il formule et accepte la définition est déjà symptomatique. On notera toutefois la prudence du ''tis'' : la σωφροσύνη serait « une sorte » de tranquillité, ce qui pourrait laisser place à d'autres tranquillités moins dignes de ce nom.
La réfutation socratique est virtuose, presque sophistique. Elle se déroule en deux temps.
S'agissant des activités du corps, Socrate interroge : la σωφροσύνη est-elle une belle chose (''kalon'') ? Oui. Or, dans l'écriture, la lecture, le jeu de la cithare, la lutte, les sauts et toutes les activités corporelles, la vitesse et la vivacité sont plus belles que la lenteur. Il s'ensuit que, pour ces activités, la tranquillité n'est pas la σωφροσύνη.
S'agissant des activités de l'âme, même transposition : apprendre avec facilité est plus beau qu'apprendre péniblement ; apprendre avec facilité, c'est apprendre vite ; donc la vitesse est belle. Le même raisonnement vaut pour le rappel des souvenirs, la compréhension d'un discours, la recherche, la délibération.
Conclusion : la σωφροσύνη ne saurait être la tranquillité, puisque le contraire de la tranquillité est souvent plus beau.
La réfutation est brillante, mais elle est logiquement insuffisante à plusieurs titres. D'abord, l'antonyme propre de ''hēsuchia'' n'est pas la vitesse, mais la précipitation (''hybris''). Charmide n'a pas été invité à défendre la lenteur contre la vitesse, mais le calme mesuré contre la précipitation désordonnée. Ensuite, Socrate joue sur plusieurs glissements sémantiques : « facile » n'est pas « rapide », « irrésolution » n'est pas « lenteur ». Enfin, le raisonnement par accumulation d'exemples particuliers ne démontre pas qu'en ''toutes'' circonstances la vivacité soit préférable au calme. Une difficulté supplémentaire tient au ''tis'' : si la σωφροσύνη est ''une sorte'' de tranquillité, c'est-à-dire une espèce particulière, pour la réfuter, Socrate devrait montrer que certains cas de σωφροσύνη ne sont pas des cas de tranquillité ; or il procède en sens inverse.
La faiblesse même de la réfutation porte un enseignement. Charmide, s'il avait possédé la σωφροσύνη qu'il vient de décrire, aurait dû résister au rythme socratique, demander des précisions, discerner les glissements. Il acquiesce au contraire à chaque pas. Il démontre donc, par son comportement dans la discussion, qu'il ne possède pas la tranquillité réfléchie qu'il vient de revendiquer comme définition. La réfutation n'est pas d'abord une critique conceptuelle : elle est un examen éthique de l'interlocuteur.
Plus profondément, l'échec de la première définition tient à ce que Charmide a décrit une propriété phénoménale de certaines actions (le rythme lent), en oubliant la dimension normative qui ferait de cette propriété une vertu. La tranquillité n'est vertueuse que lorsqu'elle est orientée vers une fin bonne. Socrate, dans son résumé même (160b), réintroduit subtilement cette dimension normative en rappelant l'agir « avec ordre » (''kosmiōs'') que Charmide avait mentionné mais aussitôt oublié.
=== 2. Deuxième définition : la pudeur (160d à 161b) ===
Invité par Socrate à porter de nouveau son regard sur lui-même, Charmide propose : « la σωφροσύνη est ce qui fait qu'un homme a le sentiment de la honte et de la retenue ; elle est la même chose que la pudeur (''aidōs'') » (160e3-5).
La définition est plus profonde que la précédente. Là où la tranquillité décrivait un comportement extérieur, la pudeur en désigne le ressort intérieur. Charmide a cette fois réellement regardé en lui-même : il vient d'être l'objet d'une interrogation socialement délicate, il a rougi, et il sait que c'est précisément cette rougeur qui a paru, aux yeux de Socrate, manifester la σωφροσύνη. L'interlocuteur s'est donc rapproché de la procédure que Socrate lui avait prescrite.
La notion d{{'}}''aidōs'' occupe une place centrale dans l'éthique grecque traditionnelle. Elle recouvre à la fois la honte par anticipation (peur de faire ce qui disqualifierait aux yeux d'autrui) et le respect qu'on porte aux autres et à soi-même. E. R. Dodds a montré qu'elle constituait, dans la culture homérique, le principal ressort de la conscience morale. Bernard Williams a affiné l'analyse : l{{'}}''aidōs'' se distingue de la honte moderne par son ancrage dans un « regard imaginé » que l'agent a intériorisé. Dans le discours d'Archidamos chez Thucydide (1, 84), « nous sommes guerriers parce que la σωφροσύνη contient la pudeur comme son principal constituant, et la pudeur contient la bravoure ». Le mythe de Protagoras (322b-323a) présente Zeus distribuant ''aidōs'' et ''dikē'' à tous les hommes comme conditions de la vie en cité, et glisse de ''aidōs'' à σωφροσύνη avec si peu de transition qu'Aristote (''Éthique à Eudème'' III, 7, 1234a32-33) pourra noter que certains les identifient. Une inscription funéraire attique, à peu près contemporaine de la mort de Socrate, présente même la déesse Σωφροσύνη comme la fille de la « magnanime » Αἰδώς (IG II² 6859).
En définissant la σωφροσύνη comme pudeur, Charmide touche le cœur psychologique de la vertu telle que sa culture la pense. Il s'inscrit dans la lignée de l'éthique aristocratique dont il est le produit : sa modération n'est pas crainte des conséquences extérieures, mais attention au regard d'autrui. C'est l'éthique de l'élite athénienne traditionnelle, que Critias représente politiquement.
La réfutation socratique est brève mais subtile (160e-161b). Elle procède en trois pas. D'abord, la σωφροσύνη est belle (''kalon''), Charmide l'a admis. Elle rend ''bons'' ceux qu'elle habite, et rien ne peut rendre bon ceux qu'elle rendrait mauvais ; donc la σωφροσύνη est à la fois belle et ''bonne'' (''agathon''). Ensuite, Homère (''Odyssée'' XVII, 347) ne dit-il pas que « la pudeur n'est pas bonne pour l'homme dans le besoin » ? Charmide acquiesce : il croit Homère. L{{'}}''aidōs'' n'est donc pas toujours bonne ; elle est tantôt bonne, tantôt mauvaise. Or la σωφροσύνη est simplement bonne. Donc la σωφροσύνη n'est pas la pudeur.
La démarche de Socrate introduit une distinction essentielle : la σωφροσύνη n'est pas seulement belle (au sens du ''kalon'' : noble, admirable, convenable), elle est bonne, normativement bonne, partout et toujours. Cette exigence gouvernera toute la suite de la discussion. On remarquera le principe implicite, qui réapparaîtra plus loin : « le semblable produit le semblable », une bonne chose ne peut produire du mauvais.
Socrate réfute par ailleurs Charmide par son propre ressort. C'est par respect pour Homère, autorité poétique incontestable, que Charmide cède. Résister serait contraire à la pudeur. Charmide capitule donc par ''aidōs'' devant la réfutation de l{{'}}''aidōs'' : l'exemplification de sa définition se confond avec sa réfutation. Car un Charmide pleinement ''sōphrōn'', au sens où Socrate l'entend, aurait résisté à Homère pour peu qu'il eût eu de bonnes raisons de le faire. Il aurait remarqué que la phrase est prononcée par Eumée et reprise par Télémaque, qu'elle vise le besoin extrême du mendiant, que son sens contextuel est autre. Socrate, dans d'autres dialogues (''République'' III), manifestera lui-même des réserves à l'égard de l'autorité homérique en matière morale. L'argument est donc intentionnellement faible, et son acceptation par Charmide est une deuxième illustration du déficit de σωφροσύνη.
La citation d'Homère délivre par ailleurs un enseignement proprement socratique. Dans le contexte de l{{'}}''Odyssée'', Eumée recommande à Ulysse déguisé de ne pas se laisser retenir par la honte d'aller mendier chez les prétendants : il faut manger d'abord. Mais lu dans l'horizon du dialogue, le vers homérique prend un autre sens. Charmide, dans le besoin (d'apprendre, de s'examiner, d'accepter son ignorance), ne doit pas se laisser retenir par la honte. La vraie pudeur devrait porter non sur le fait de paraître ignorant, mais sur le fait de l'être sans le savoir. Ce qui est honteux, c'est de refuser d'apprendre (''Hippias mineur'' 372c : « j'ai une qualité qui me sauve : je n'ai pas honte d'apprendre »). Le renversement, implicite, est typique de l'ironie platonicienne.
=== 3. Troisième définition : faire ses propres affaires (161b à 162b) ===
Deux fois réfuté, Charmide se souvient avoir entendu quelqu'un dire que la σωφροσύνη est « faire ses propres affaires » (''to ta heautou prattein'', 161b6). Il tait l'attribution, mais Socrate, avec une malice transparente, soupçonne Critias. Socrate approuve toutefois la posture méthodologique : « il ne faut pas se demander qui a dit une chose, mais si elle est bien dite » (161c). Il reconnaît cependant que la formule tient d'un véritable « énigme » (''ainigma'', 161c9) qui demande exégèse.
La formule est chargée politiquement. Au cinquième siècle, « faire ses propres affaires » appartient au vocabulaire du camp oligarchique, aristocratique, spartophile. Chez Thucydide (1, 68, 1), les Spartiates sont ceux qui « ne s'occupent pas des affaires extérieures » et « font leurs propres affaires ». Dans l{{'}}''Électre'' de Sophocle (678), Clytemnestre ordonne à Électre de « faire ses propres affaires » et de cesser de pleurer son frère. Dans la ''Constitution des Lacédémoniens'' de Xénophon (7, 2), Lycurgue interdit aux citoyens les activités mercantiles, leur assignant comme « seule affaire propre » le service de la liberté civique. Le concept prend sens contre le terme adverse, ''polypragmosynē'', qui désigne, dans la polémique antidémocratique, la tendance athénienne à se mêler de tout. Entre la ''polypragmosynē'' et l{{'}}''apragmosynē'' (l'abstention pure), la formule « faire ses propres affaires » désigne une voie médiane : faire quelque chose, mais non les affaires des autres.
Cette troisième définition marque donc une rupture avec les précédentes : elle sort de la description phénoménologique pour entrer dans une détermination normative et sociale. Être ''sōphrōn'', c'est tenir sa place, remplir son rôle, ne pas empiéter sur celui des autres. Elle énonce, à un niveau préphilosophique, ce qui sera dans la ''République'' (433a-b) la définition de la ''justice'' : « faire chacun ses propres affaires ». On peut y voir, avec D. Hyland, l'indication que σωφροσύνη et δικαιοσύνη sont les deux faces d'une même vertu. La lecture reste toutefois hypothétique : la formule pourrait aussi bien n'être qu'une maxime traditionnelle reprise par Charmide sans en tirer de conséquence doctrinale.
La réfutation socratique (161d-162a) est un ''reductio ad absurdum''. Suivant la formule, le grammatiste, qui enseigne à écrire des noms (les siens comme ceux des autres), ne ferait pas « ses propres affaires » et ne serait donc pas ''sōphrōn''. Il en va de même pour tout artisan : le tisserand qui fait des vêtements pour autrui, le cordonnier qui fait des chaussures pour autrui, le médecin qui soigne les autres. Si l'on prend la formule au pied de la lettre, nulle division du travail ne peut subsister.
Charmide ne sait plus quoi répondre. Socrate l'en tire : peut-être Charmide ne comprend-il pas lui-même ce que veut dire la formule qu'il avance. Critias, qui ne peut supporter de voir sa propre formule maltraitée, entre alors en scène.
La mise en scène pédagogique est efficace. La « récitation » de Charmide, d'une pensée qu'il n'a pas faite sienne, est à l'image de « l'acteur qui récite mal les vers d'autrui » (162c-d). Charmide est resté étranger à la formule qu'il a prononcée. Il ne la possède pas, parce qu'il ne l'a pas examinée. Toute la transition, avec la comparaison de l'acteur et du poète, prépare la suite du dialogue, où Critias devra, lui, défendre ses propres thèses.
== III. La reprise par Critias : quatrième définition (162b à 164d) ==
Critias, piqué au vif, prend la relève. Il refuse la lecture littérale donnée par Socrate. La formule, soutient-il, ne dit pas que faire une chose pour soi ou pour autrui est décisif, mais qu'il faut faire les choses ''propres'' à soi, c'est-à-dire convenables, bienfaisantes. Sa défense s'appuie sur une distinction linguistique entre ''prattein'' (agir, faire au sens moral) et ''poiein'' (fabriquer, produire au sens technique).
=== 1. La distinction ''prattein''/''poiein'' ===
Critias invoque Hésiode (''Travaux et Jours'' 311 : « le travail n'est point honteux ; la honte est dans l'inaction ») pour soutenir qu'il existe des activités honteuses (simples ''poiēseis'') et d'autres qui sont nobles (véritables ''praxeis''). Le cordonnier qui vend du poisson salé (exemple que Critias choisit dans un mouvement de dédain aristocratique) « fabrique » mais ne « travaille » pas au sens noble. Seules les activités belles et utiles (''kalon kai ōphelimon'') méritent le nom de ''prattein''. Les œuvres propres à soi (''oikeia'') sont les bonnes œuvres ; les œuvres étrangères (''allotria''), les mauvaises.
La manœuvre est caractéristique de Critias : il s'adosse à une autorité poétique, décrète une distinction terminologique et attire le sens du mot vers la position qu'il veut défendre. Socrate ne manque pas de relever le procédé. Il rappelle que Prodicos, sophiste célèbre pour ses distinctions verbales, faisait « mille distinctions de ce genre » (''Charmide'' 163d ; cf. ''Protagoras'' 337a, 340a). Il propose alors une mise au point méthodologique décisive : « peu importe le sens fixé par convention, l'important est de voir ce que les mots désignent, quelle pensée ils traduisent, quelle réalité ils donnent à saisir » (163d). Le philosophe, à la différence du sophiste, cherche sous le mot l'idée et sous l'idée le réel. On peut lire, avec Tuckey, dans la technique argumentative de Critias un « goût sophistique pour les antithèses », qui trahit sa formation.
=== 2. Quatrième définition : faire le bien ===
Critias tire de ses distinctions la reformulation suivante : la σωφροσύνη est « faire ses propres affaires », entendu au sens où l'on fait les bonnes affaires, les affaires convenables et bienfaisantes. Autrement dit, la σωφροσύνη est « faire le bien » (''ta agatha prattein'', 163e). Socrate formule le même contenu en langage socratique : « faire des choses bonnes et profitables » équivaut à « agir bien » (''eu prattein''), formule qui, en grec, peut signifier aussi bien « bien agir » que « réussir sa vie ».
Socrate accepte provisoirement cette reformulation, tout en y décelant d'emblée une difficulté. Si la σωφροσύνη est « faire le bien », celui qui fait le bien par hasard, sans le savoir, sera ''sōphrōn'' sans le savoir. Le médecin qui soigne son patient peut ignorer si le traitement réussira. Cette objection met en lumière un point décisif : la σωφροσύνη, si elle est vertu authentique, doit inclure la ''connaissance'' du bien qu'elle fait. Si la vertu consistait à faire le bien sans qu'il faille le savoir, la σωφροσύνη serait indépendante de la conscience qu'on en a, ce qui contredit l'intuition selon laquelle la vertu engage la responsabilité du sujet.
Critias concède, et reformule une dernière fois : il faut connaître ce que l'on fait. L'enjeu devient épistémique. C'est précisément à partir de cette concession que Socrate peut conduire Critias vers la formule qui dominera la seconde partie du dialogue : la σωφροσύνη est une forme de savoir, et plus précisément un savoir portant sur soi-même.
== IV. Cinquième définition : se connaître soi-même (164d à 165b) ==
=== 1. Le discours de Critias sur l'inscription delphique ===
La discussion ayant montré que la vertu doit inclure la connaissance de ce que l'on fait, Critias reformule sa position. Il propose : la σωφροσύνη est « se connaître soi-même » (''to gignōskein heauton''). Il adosse sa définition à la célèbre inscription du temple d'Apollon à Delphes, Γνῶθι σεαυτόν, et prononce alors le discours le plus ambitieux et le plus étrange de tout le dialogue (164d-165a).
Cette formule, dit Critias, n'est pas une maxime morale parmi d'autres (comparable aux autres inscriptions delphiques : « rien de trop », ou « donne un gage, la ruine suit »). Ces deux-là ne sont que des conseils utiles (''symboulas chrēsimas'', 165a6-7), posés par ceux qui avaient mal compris la première inscription. « Connais-toi toi-même », au contraire, n'est pas un conseil : c'est une ''salutation'' (''prosrhēsis'') du dieu aux pèlerins qui entrent dans son temple. Cette salutation est la bonne, à la différence de la salutation humaine ordinaire « réjouis-toi » (''chaire''). Le dieu ne souhaite pas aux hommes qu'ils « se réjouissent » (vœu superficiel), mais qu'ils « soient sages » (''sōphronein'') : car c'est cela, être sage, que de se connaître soi-même. L'inscription signifie donc, en code, « sois ''sōphrōn'' » dit en guise de bonjour. La σωφροσύνη coïncide avec la connaissance de soi.
Le discours est remarquable. Il installe d'abord un rapport original entre l'homme et le dieu. La salutation est en principe un acte entre égaux, à la différence du conseil, qui suppose une asymétrie. En faisant de « connais-toi toi-même » une salutation, Critias suggère, plus ou moins consciemment, une relative parité entre le dieu et ceux qui entrent dans le temple. Cette audace a conduit certains commentateurs (L. Lampert notamment) à y lire l'ombre de l'athéisme que la tradition doxographique attribue à Critias, rangé avec Prodicos et Diagoras parmi les impies (le fameux fragment de ''Sisyphe'', DK 88 B25, présente les dieux comme une invention d'un homme habile pour contrôler les foules). D'autres lectures, plus nuancées (Tsouna, Tuozzo), observent que rien dans le discours lui-même ne nie l'existence des dieux : Critias suppose au contraire le dieu bienveillant. Ce qui demeure incontestable, c'est l'arrogance intellectuelle du propos : Critias se distingue de la foule des « ordinaires » qui n'ont rien compris, prétend déchiffrer le « langage énigmatique » du dieu, se pose en interprète autorisé. Cette prétention est ironiquement tout le contraire de la σωφροσύνη qu'il veut définir : elle est l'équivalent exact de la présomption que Socrate, dans l{{'}}''Apologie'' (21a-23b), récuse en revendiquant son ignorance.
La formule « connais-toi toi-même » est cependant authentiquement socratique. Dans l{{'}}''Apologie'' (21d), c'est par la reconnaissance de son ignorance que Socrate illustre la maxime delphique. Dans le ''Phèdre'' (230a), Socrate dit qu'il n'a pas le temps d'étudier les mythes, car il est occupé à s'examiner lui-même selon l'injonction delphique. Le ''Premier Alcibiade'' (127-134) développe par ailleurs longuement la thèse selon laquelle se connaître soi-même, c'est connaître son âme comme principe de l'homme. On notera toutefois que l'authenticité du ''Premier Alcibiade'' est disputée : contestée par Schleiermacher au début du dix-neuvième siècle, la critique moderne est partagée, certains (Pradeau dans sa traduction GF) le tenant pour authentique et caractéristique de la période moyenne, d'autres le classant parmi les dialogues d'école. Par prudence, on se contentera donc ici de renvoyer à l{{'}}''Apologie'' et au ''Phèdre'', dont l'authenticité n'est pas contestée, quitte à mentionner le ''Premier Alcibiade'' comme attestation indirecte.
La formule se laisse entendre en deux sens qui ouvrent une alternative. En un sens positif, se connaître soi-même, c'est connaître ce qu'est l'homme, sa nature propre, ce qui lui convient, et donc la vertu. Cette lecture rapproche la σωφροσύνη d'une ''sophia'' totalisante. En un sens négatif et critique, se connaître soi-même, c'est avoir conscience de sa propre ignorance. Telle est l'interprétation socratique la plus constante. Tuckey a défendu avec force cette seconde interprétation, en soulignant que la formule ''gnōthi seauton'' est, dans la tradition socratique, indissociable de l'aveu d'ignorance.
=== 2. Un moment de pause ===
Le passage est marqué par une certaine détente dramatique. Critias, jusque-là agressif et sûr de lui, paraît momentanément purgé de son arrogance (ou feint de l'être). Il accepte de reprendre l'enquête sur des bases nouvelles. Socrate y reconnaît l'énoncé d'une vérité essentielle, dont l'inspiration émane d'une source transcendante, en l'occurrence le dieu de Delphes.
Il faut cependant éviter ici d'interpréter trop vite cette scène comme le « moment crucial » d'un rituel d'initiation, sur le modèle proposé par Goldschmidt. L'hypothèse est séduisante, mais elle projette sur le texte une structure qui n'y est pas explicite. Plus sobrement, on se contentera de dire que l'énonciation de la formule delphique marque un tournant argumentatif, sans préjuger de sa signification symbolique plus large. Car Critias va aussitôt reformuler « se connaître soi-même » en termes de science réflexive, et non en termes de conscience critique. L'ambiguïté de la formule permet ce glissement, et c'est de là que naît la difficulté qui occupera toute la fin du dialogue.
== V. Sixième définition : la science d'elle-même et des autres sciences (165b à 166c) ==
=== 1. Du « connais-toi toi-même » à la « science de la science » ===
Socrate reprend la discussion. Si la σωφροσύνη est une forme de connaissance (''gignōskein ti''), elle est aussi une science (''epistēmē tis''), et toute science a un objet (165c4-6). La σωφροσύνη est-elle donc une science ? De quoi est-elle la science ? Quelle est son « œuvre » (''ergon'') ?
Les comparaisons que pose Socrate sont parlantes. La médecine est science de la santé, et son œuvre est la santé. L'architecture est science des constructions, et son œuvre est l'habitation. Il en va de même pour toutes les ''technai'' : chacune a un objet propre et produit une œuvre distincte du savoir lui-même. Si la σωφροσύνη est une science, elle devrait à son tour avoir un objet et produire une œuvre.
Critias répond d'abord que toutes les sciences ne se ressemblent pas : les mathématiques (le calcul, la géométrie) ne produisent aucune œuvre distincte d'elles-mêmes, et ce sont pourtant des sciences. Socrate concède la remarque, mais insiste : quel est alors l'objet de la σωφροσύνη ? Le calcul porte sur le pair et l'impair ; la géométrie, sur les grandeurs ; si la σωφροσύνη est une science, elle doit pareillement porter sur un objet déterminé.
C'est ici que Critias formule la sixième définition, la plus audacieuse du dialogue : la σωφροσύνη est ''la science d'elle-même et des autres sciences'' (ἐπιστήμη ἑαυτῆς καὶ τῶν ἄλλων ἐπιστημῶν, 166e). Elle est la seule, parmi toutes les sciences, à porter non sur un objet extérieur, mais sur le savoir lui-même. Socrate ajoute : « elle serait donc aussi science de l'ignorance » (''anepistēmosunē''), puisqu'il faut, pour connaître ce qui est su, savoir aussi ce qui ne l'est pas. Critias acquiesce. Socrate tire alors la conséquence : le sage, et lui seul, se connaîtra lui-même ; il saura ce qu'il sait et ce qu'il ne sait pas ; il pourra de même discerner chez autrui le savoir réel du savoir prétendu.
Le glissement par rapport à la définition précédente est subtil et profondément problématique. Au premier moment (« connais-toi toi-même »), l'objet semblait être la personne elle-même ; au second (« science d'elle-même et des autres sciences »), l'objet devient le savoir. La dimension personnelle et existentielle de la connaissance de soi s'efface au profit d'une métaconnaissance formelle. Le « soi » cède la place aux « sciences ». T. M. Tuozzo souligne que Socrate ne laissera pas Critias revenir en arrière : la réduction du « soi » au « savoir » est une pente, non un malentendu ponctuel. Sur la manière dont il faut comprendre ce glissement, les commentateurs divergent notablement. Pohlenz y voit une erreur flagrante que Platon signalerait pour la critiquer, tandis que Susemihl estime au contraire que « science d'elle-même » est simplement la reformulation technique de « connaissance de soi ». Selon Schirlitz, les deux notions s'impliquent. Selon von Arnim, elles marquent la confusion de Critias. Il n'est pas nécessaire ici de trancher. Ce qui importe, c'est que cette reformulation ouvre un examen conceptuel serré auquel Socrate va procéder.
=== 2. Trois lectures possibles de la « science des sciences » ===
La définition de Critias est d'une hauteur conceptuelle considérable. On y a vu, chez les commentateurs modernes, l'anticipation de la « subjectivité autonome » moderne (Oehler), de l'épistémologie critique kantienne, de l'ontologie aristotélicienne de l'être en tant qu'être, ou d'une encyclopédie du savoir. Sans préjuger de la portée que Platon lui donne, on peut proposer, pour la science des sciences, au moins trois lectures.
Dans une première lecture, elle serait science d'un objet englobant : elle porterait sur un être suprême qui inclurait ou fonderait tous les objets des autres sciences. On aurait affaire à une métaphysique ou à une théologie.
Dans une deuxième lecture, elle serait la science synthétique qui organise et totalise les autres savoirs : projet positiviste d'une science des sciences, ou encyclopédie hégélienne.
Dans une troisième lecture, enfin, elle serait une science formelle, dépourvue de contenu positif : une science critique des principes, des méthodes et des limites de tout savoir.
Critias ne précise pas laquelle de ces lectures il retient, et cette ambiguïté est peut-être la faille fondamentale de sa définition. Socrate avait attiré son attention sur la mention « science de l'ignorance », qui aurait pu orienter la discussion vers une lecture critique. Mais Critias, emporté par la grandeur de sa formule, l'entend plutôt comme une science totalisante. Tuckey a rapproché cette pente du « goût sophistique pour les antithèses » que le Critias historique partageait avec ses contemporains. L'attitude philosophique juste, celle qu'incarne Socrate, serait tout au contraire de reconnaître que la sagesse humaine est d'abord reconnaissance des limites du savoir, et non prétention à le totaliser.
== VI. Examen critique : la science de la science est-elle possible ? (166c à 169c) ==
Cette partie du dialogue, souvent tenue pour la plus aride, constitue en réalité l'un des exercices d'analyse conceptuelle les plus rigoureux de l'œuvre platonicienne. Socrate y soumet la définition de Critias à deux examens successifs : l'un ontologique (est-elle possible ?), l'autre pragmatique (serait-elle utile ?).
=== 1. Le problème de la réflexivité (167a à 168e) ===
Socrate propose : supposons que la σωφροσύνη soit la science qui a pour objet la science elle-même ; est-il seulement possible qu'une science se prenne elle-même pour objet ? Y a-t-il, dans les autres cas, des exemples de relations qui se portent sur elles-mêmes ?
L'examen est méthodique. Les entités que Socrate passe en revue sont toutes des « relatifs » (πρός τι), c'est-à-dire des réalités qui ne se définissent que par leur rapport à autre chose.
S'agissant des sensations : existe-t-il une vue qui verrait elle-même et les autres vues, mais qui ne verrait aucune couleur ? Or la vue est définie par son rapport à la couleur (objet propre), et si une « vue » ne voyait pas la couleur, elle ne serait pas une vue. De même, une audition qui n'entendrait aucun son ne serait pas une audition. Une capacité réflexive totale, qui ne porterait ''que'' sur elle-même, est absurde, car elle vide le relatif de son contenu propre.
S'agissant des désirs et des affects : un désir qui désirerait non aucun plaisir mais uniquement des désirs, une volonté qui ne voudrait aucun bien mais seulement d'autres volontés, un amour qui aimerait non le beau mais uniquement d'autres amours, une crainte qui ne craindrait aucun danger mais seulement des craintes ? L'absurdité est manifeste : chaque affect se définit par son objet caractéristique.
S'agissant des grandeurs relatives : existe-t-il un « plus grand » qui ne serait pas plus grand qu'un plus petit, mais plus grand que lui-même ? Pour être plus grand, il faut être plus grand qu'un plus petit ; or si ce « plus grand » est plus grand que lui-même, il est en même temps plus grand et plus petit que lui-même. Le relatif qui se prendrait lui-même pour objet hériterait simultanément des deux termes et tomberait dans la contradiction.
Dans les cas examinés, la réflexivité stricte (où un relatif ne porterait que sur soi) est soit absurde, soit contradictoire. Il faut distinguer deux types de réflexivité : la réflexivité totale (la science ne porterait que sur elle-même) et la réflexivité partielle (la science porterait sur soi ''et'' sur autre chose). La première semble inconcevable ; la seconde est plus prometteuse, mais exige une analyse serrée. Claude Chrétien a noté, à juste titre, que la conscience humaine présente précisément cette propriété étrange de pouvoir se retourner vers elle-même en même temps qu'elle se tourne vers autre chose. Le ''Charmide'' ne thématise pas cette distinction, mais il en ouvre le questionnement.
Socrate laisse la question ouverte pour l{{'}}''epistēmē''. Peut-être la connaissance, contrairement aux sensations et aux grandeurs, admet-elle la réflexivité ? Il reconnaît qu'une telle analyse exige un « grand homme » (169a) et « dépasse les limites du dialogue ». Il renvoie la résolution à un travail ultérieur : ce sera la « longue voie » de la ''République'' (435d). On peut voir dans cet ajournement l'aveu que la catégorialité rigoureuse déborde le dialogue vivant.
Pour relancer la discussion, Socrate propose une concession provisoire : supposons que la science de la science soit possible. Peut-elle procurer au sage ce qu'on attend de la σωφροσύνη, c'est-à-dire savoir ce qu'il sait et ne sait pas ?
=== 2. La contagion de l'aporie (169a à c) ===
À ce moment, Critias à son tour cède à l'embarras. Socrate l'observe avec humour : « voyant mes hésitations, Critias fit comme ceux qui voient des gens leur bâiller sous le nez et en font autant ; il me parut céder à la contagion, en proie au même embarras que moi » (169c). Critias, « habitué à se voir partout honoré, avait honte devant les assistants » et ne voulait pas concéder son incapacité. Il parle « sans rien dire de clair », pour masquer sa gêne. Scène psychologiquement aiguë : Critias, défini traditionnellement comme ''sōphrōn'', manifeste ici un défaut typique d{{'}}''aidōs'' mal orientée, la honte de paraître ignorant. L'amour-propre l'emporte sur l'amour de la vérité : c'est précisément le symptôme de la σωφροσύνη qui lui fait défaut. La dialectique socratique dévoile, dans la conduite même de l'interlocuteur, le défaut de la vertu qu'il prétend théoriser.
== VII. La question de l'utilité : le rêve socratique (169c à 175a) ==
=== 1. L'hypothèse et le problème de l'impuissance formelle ===
Socrate propose, pour faire avancer la discussion : admettons que la science de la science soit possible et qu'elle permette au sage de savoir ce qu'il sait et ne sait pas. Serait-elle pour autant ''utile'' ? Telle est la seconde question. Si la première était ontologique, celle-ci est pratique. L'enjeu est grave : Socrate lui-même, dans l{{'}}''Apologie'' (38a), déclare qu'une vie non réfléchie ne vaut pas la peine d'être vécue.
La démonstration socratique commence par une difficulté (170a-171c). La science de la science, si elle existe, ne peut que distinguer ce qui est science de ce qui ne l'est pas. Elle ne peut connaître les ''contenus'' des sciences particulières. Savoir ce qu'est la santé relève de la médecine, non de la science de la science. Savoir ce qui est juste relève de la politique. Si un homme possède la science de la science, il saura qu'il a une science, mais il ne saura pas ''quoi''. Il peut donc avoir les connaissances réflexives sans avoir les connaissances de premier ordre. Il est à même de distinguer formellement « savoir » de « non-savoir », mais il ne peut distinguer ''la science juste'' de ''la fausse science'' sans posséder lui-même la science de l'objet dont il est question. Le sage, dans cette configuration, est impuissant. La sagesse ainsi définie est formelle, vide, réduite à une sorte de métacognition sans substance.
Comme le note avec finesse L.-A. Dorion dans son introduction, la réfutation de 171c porte non pas sur la capacité de l'élenchos à éprouver le savoir moral et à produire la connaissance de soi, mais sur l'aptitude d'une science des sciences, dépourvue d'objet propre, à mettre à l'épreuve des connaissances particulières qui relèvent de savoirs particuliers. Ce point est important pour l'interprétation d'ensemble du dialogue : ce qui est réfuté, ce n'est pas l'ambition socratique de soumettre les autres savoirs à la question, mais la prétention d'une science purement réflexive à se substituer aux savoirs spécialisés.
Socrate sort personnellement de cette impasse par son renoncement à toute prétention dogmatique. Il n'affirme posséder aucune science et se contente d'interroger les prétendus savants sur la cohérence de leur discours. L'attitude socratique du questionnement n'est possible qu'à partir d'un tel renoncement.
=== 2. Le rêve d'omniscience (173a à 174b) ===
Socrate introduit cependant une hypothèse contrefactuelle. « Écoute donc mon songe, qu'il soit venu par la porte de corne ou par la porte d'ivoire » (173a), dit-il, faisant allusion à l{{'}}''Odyssée'' XIX, 562-567, où Pénélope évoque les deux portes des songes (ceux qui passent par l'ivoire sont trompeurs, ceux qui passent par la corne sont véridiques). L'allusion est significative : le rêve qui va suivre n'est pas présenté comme vérité certaine ; il est une vision dont on ignore si elle ouvre sur le vrai ou sur le trompeur. Socrate introduit donc son tableau avec une réserve herméneutique qui, rétroactivement, colore tout le développement d'une ambiguïté constitutive.
Dans ce rêve, Socrate explore ce que serait un monde où chacun ne ferait que ce qu'il sait faire, où la σωφροσύνη règnerait partout. Les imposteurs y seraient démasqués ; les médecins seraient de vrais médecins, les capitaines de vrais capitaines, les devins de vrais devins. Chacun serait à sa place, chacun agirait selon la science. On y vivrait plus sainement, préservés des dangers de la mer et de la guerre, ne traitant qu'avec de vrais professionnels. « Toutes choses seraient parfaitement réalisées du point de vue technique » (173b-c). Même la divination, cette « méta-science » prérationnelle, serait intégrée au régime scientifique. Le monde serait ordonné, transparent, maîtrisé.
On rapproche volontiers cette utopie de la cité idéale de la ''République''. Le rapprochement est légitime mais doit être nuancé : dans le ''Charmide'', la cité utopique n'est présentée que comme une hypothèse dans le cadre d'une interrogation sur la σωφροσύνη, et non comme un projet politique assumé. Socrate lui-même interrompt aussitôt le rêve : « qu'agir selon la science nous conduise à bien agir et à connaître le bonheur, cela, mon cher Critias, nous ne pouvons pas encore le savoir » (173d).
Le point est philosophiquement essentiel : ''agir selon la science ne suffit pas à bien agir''. Un monde parfaitement rationnel, maîtrisé, n'est pas nécessairement un monde heureux. Il peut être efficace et pourtant aveugle au bien. Le savoir n'est pas ''ipso facto'' valeur. B. Witte a souligné, dans une lecture forte, que cette correction socratique fonctionne comme une réfutation interne de l'utopie. Ce qui s'ouvrait comme un idéal se retourne en objection contre la définition de la σωφροσύνη comme science de la science. Car si un tel ordre n'engendrait pas le bonheur, la science qui le produit n'est pas la sagesse que nous cherchons.
Plus encore, un monde totalement maîtrisé a quelque chose d'inhumain : la liberté, donc la possibilité morale, y disparaîtraient. Sur ce point, on peut entendre la fin du dialogue comme un rappel de la condition humaine : la ''sophia'' est réservée à la divinité, l'homme est fait pour vivre dans les entre-deux. La σωφροσύνη est une vertu humaine, qui doit connaître sa place entre l'ignorance et le savoir, entre l'asservissement aux passions et la perfection divine.
=== 3. La science du bien et du mal (174a-c) ===
Quelle science, demande alors Socrate, assure le bonheur ? Est-ce la tactique ? la médecine ? le calcul ? À chaque fois, Critias répond par la négative. Socrate élimine méthodiquement toutes les sciences particulières (cordonnerie, travail du bois, divination, jeu de dés). Aucune, prise isolément, ne peut rendre heureux. Sommé de nommer la science qui rend heureux, Critias concède enfin : c'est « la science du bien et du mal » (ἡ ἐπιστήμη τοῦ ἀγαθοῦ καὶ κακοῦ, 174b).
Le coup de théâtre est dévastateur. Si c'est la science du bien et du mal qui produit l'utilité et le bonheur, et si la σωφροσύνη est la science de la science (qui n'inclut pas, par hypothèse, la science du bien particulier), alors la σωφροσύνη n'est ''pas'' la science qui nous est utile. Elle est autre chose que la science du bien et du mal. Elle est donc, conclut Socrate, inutile.
La portée de ce passage demande prudence. Il faut d'abord noter, avec Dorion, que l'assimilation de la sagesse à la connaissance du bien et du mal n'est pas une conclusion inattendue dans l'économie du dialogue : plusieurs passages antérieurs l'anticipent (156e, 160e, 161a, 163d-e). Cette conclusion n'exclut d'ailleurs pas les définitions précédentes, pour autant qu'elles soient correctement comprises : elle apparaît plutôt comme leur complément ou leur condition. Si la σωφροσύνη consiste à faire ses propres affaires, à faire le bien et à se connaître soi-même, c'est dans la mesure où ces conduites sont orientées par la connaissance du bien.
Il faut ensuite nuancer la lecture de B. Witte, qui fait du ''Charmide'' une « propédeutique négative » désignant ''in fine'' la science du bien comme science-limite que le dialogue n'aurait pas développée. La lecture est séduisante, et elle oriente vers les analyses ultérieures de la ''République'' (l'Idée du Bien). Mais elle risque de minorer ce que le ''Charmide'' accomplit par lui-même : il ne se contente pas de désigner un manque, il indique que la σωφροσύνη véritable, loin d'être une science-reine formelle, doit se subordonner à une science substantielle du bien. Cela suffit à rendre compte de son échec apparent sans qu'il soit nécessaire d'en faire une simple étape préparatoire à la ''République''.
== VIII. L'aporie finale et la scène de conclusion (175a à 176d) ==
=== 1. Le bilan de Socrate (175a à d) ===
Socrate dresse un bilan apparemment désastreux. Nous avons, dit-il, admis sans preuve plusieurs choses dans le raisonnement. Nous avons même concédé ce qui contredit la raison. Et malgré toutes ces complaisances, nous n'avons pas su trouver la nature de la σωφροσύνη. « Notre enquête n'a pas été davantage capable de trouver la vérité ; mais elle s'est si bien moquée de celle-ci que ce que nous avons jusqu'ici proposé comme définitions de la sagesse, à force de conventions et de combines, nous a montré celle-ci, provocation extrême, comme inutile » (175a-b).
C'est l'aporie explicite. Elle n'est pourtant pas un simple échec. Socrate n'en est pas trop affligé. Le bilan contient une correction manifeste : si la σωφροσύνη ''telle que nous l'avons définie'' s'est révélée inutile, cela ne signifie pas que la sagesse véritable le soit. Cela signifie que nous n'avons pas su la définir correctement.
Chaque définition rejetée a en effet indirectement révélé un aspect de la σωφροσύνη véritable. La tranquillité pose l'ordre (en dépit de l'échec de sa déclinaison physique). La pudeur pose le ressort intérieur (en dépit de son hétéronomie). « Faire ses propres affaires » pose l'adéquation à soi et la convenance. « Faire le bien » pose la normativité. La connaissance de soi pose la réflexivité. La science de la science pose la hauteur de la prétention philosophique. Au terme, la science du bien et du mal est nommée, sans être identifiée à la σωφροσύνη, mais comme sa condition éthique profonde.
=== 2. La scène finale : Charmide accepte l'incantation (175d à 176d) ===
Le dialogue ne s'achève pas sur l'aporie conceptuelle. Il revient à la scène dramatique initiale. Socrate, feignant d'être très affligé de son échec, s'adresse à Charmide. Il n'est pas trop chagriné pour lui-même, mais il l'est pour Charmide, « si, avec une telle beauté et l'esprit le plus sage, tu ne tires aucun fruit de cette sagesse ». Il s'irrite davantage d'avoir appris avec tant de soin la formule magique thrace, si elle n'a aucune valeur pratique. Non, conclut-il, « j'aime mieux penser que je suis un piètre chercheur, que la sagesse est un grand bien, et que, si tu la possèdes, tu es un heureux mortel ».
Charmide répond : « par Zeus, je ne sais pas, Socrate, si je la possède ou non. Comment en effet connaîtrais-je ce dont vous-mêmes n'êtes pas capables de déterminer la nature ? ». Il ajoute, touchant dans sa modestie : « pour ma part, je ne te crois guère, et je suis sûr que j'ai besoin de ta formule magique. Je ne vois aucun inconvénient, de mon côté, à me soumettre tous les jours à ton charme, jusqu'à ce que tu dises que c'est assez ».
Critias renchérit : « fais-le, Charmide. Ce sera pour moi la preuve que tu es sage, si tu te soumets au charme de Socrate et si tu ne le quittes plus d'un pas ». Charmide acquiesce : « je le suivrai et ne le quitterai pas, car j'agirais mal si je ne t'obéissais pas, à toi mon tuteur ». Et, quand Socrate plaisante sur le caractère contraignant de cette volonté, Charmide conclut : « alors ne résiste pas, toi non plus ».
La scène est remarquable. Dramatiquement, elle se déploie sur trois plans qu'il importe de distinguer.
Sur le plan pédagogique, la soumission de Charmide à Socrate témoigne du succès relatif de l'initiation dialectique. Le jeune homme reconnaît qu'il a besoin de la philosophie et accepte de suivre Socrate. L'échec conceptuel se convertit en succès pédagogique : Charmide, qui se flattait implicitement de la sagesse au début, reconnaît à la fin qu'il en a besoin. Telle est la direction que prend, dans le texte, l'élenchos socratique. Si l'on admet, avec l'édition Dorion, que l'incantation désigne métaphoriquement la réfutation dialectique, alors la scène finale confirme la thèse du prologue : la σωφροσύνη se produit dans l'âme par le travail dialectique, et la meilleure preuve en est le consentement final de Charmide à recevoir ce travail.
Sur le plan dramatique, cette lumière est indissociable d'une ombre. Le lecteur sait que cet adolescent, aujourd'hui docilement soumis à Critias, suivra son tuteur non dans l'école de Socrate, mais dans la tyrannie des Trente. Il mourra en 403 avec Critias. La promesse de « ne plus quitter Socrate d'un pas » ne sera pas tenue. La formule finale de Critias (« si tu te soumets au charme de Socrate et si tu ne le quittes plus d'un pas, ce sera la preuve que tu es sage ») énonce ainsi une dernière définition implicite : être sage, c'est tenir bon dans la compagnie de la philosophie. Mais ni Critias ni Charmide n'y parviendront. L'ironie tragique reste toutefois sous la surface du texte : c'est le lecteur, informé par l'histoire, qui l'y projette.
Sur le plan verbal, enfin, il faut noter l'emploi par Charmide du mot ''charisme'' (''charizesthai'') pour désigner ce à quoi il se soumet. Le terme désigne étymologiquement un don gratuit, une grâce, et fait écho à la tradition religieuse. Dans le ''Banquet'' de Xénophon (4, 14-15), Socrate se dit lui-même capable d'« ensorcellement » (''katepad-''). La clôture du ''Charmide'' confirme ainsi, dans le vocabulaire même, l'identification du discours socratique au chant incantatoire du prologue.
=== 3. L'ironie et la promesse ===
La scène finale accomplit ainsi trois choses. Elle confirme l'échec conceptuel : on n'a pas défini la σωφροσύνη. Elle révèle un succès pratique : l'élenchos opère, Charmide se tourne vers la philosophie. Elle porte, pour le lecteur averti, l'ombre historique : le succès pratique sera, dans les faits, révoqué.
Cette tension entre trois plans (conceptuel, pratique, historique) constitue une des singularités du ''Charmide''. On peut y lire la conviction que la philosophie ne saurait se suffire à elle-même comme pur exercice de définition, mais doit engager l'existence, sans que cet engagement garantisse par avance la fidélité. Peut-être est-ce en ce sens qu'on peut voir dans le ''Charmide'' une inquiétude à laquelle la ''République'' apportera une réponse partielle : ancrer la σωφροσύνη individuelle dans une cité, une ''paideia'' et une ontologie qui lui donnent un fondement stable.
== IX. Interprétation d'ensemble : la σωφροσύνη selon le ''Charmide'' ==
Au terme de cette lecture suivie, on peut tenter de ressaisir ce que le dialogue, malgré son aporie explicite, suggère sur la nature de la σωφροσύνη. La présentation qui suit est une synthèse interprétative, et doit être reçue comme telle.
En premier lieu, la σωφροσύνη est une vertu, mais non une valeur ascétique extérieure à l'individu. Elle situe le bien dans l'accomplissement de l'être propre et associe la vertu et le bonheur, le beau et le bon, le bien et l'utile. Elle est, en ce sens, profondément eudémoniste.
En deuxième lieu, cet accomplissement n'est pas abandon à soi, mais « maîtrise de soi » (''enkrateia'', ''République'' 430e). Toutefois, poussée jusqu'au bout, la maîtrise peut rendre l'humain inhumain : Socrate dans le prologue (presque trop maître de lui) et l'utopie du rêve (un monde totalement rationnel, donc invivable) en sont les deux figures. La sagesse exclut ainsi tant le schéma de la maîtrise que celui de la soumission. Platon lui-même, dans la ''République'' (430e-431a), qualifie la notion de maîtrise de soi de « ridicule » et de contradictoire : comment un même sujet peut-il être celui qui maîtrise et celui qui est maîtrisé ? La σωφροσύνη doit se penser autrement qu'en termes de domination.
En troisième lieu, cette vertu est connaissance, selon l'intellectualisme socratique (il suffit de savoir pour vouloir, et de vouloir pour faire). Elle tend à la vérité en la sachant inaccessible. Elle tend à l'unité en se sachant vouée à l'éparpillement. L'échec du ''Charmide'' à définir la sagesse comme science n'est pas l'échec de l'identification vertu-connaissance, mais l'échec d'une certaine conception de la connaissance : trop formelle, trop prétentieuse, trop coupée du bien.
En quatrième lieu, elle se développe surtout comme conscience critique de soi. Il ne s'agit pas d'introspection narcissique. La conscience de soi platonicienne est ouverture aux autres (comme le montre le dialogue) et ouverture au monde. Être conscient de soi, c'est se situer à sa place dans le tout.
En cinquième lieu, elle est vertu de l'entre-deux. Ni la bête ni le dieu n'ont besoin de la σωφροσύνη. La σωφροσύνη est proprement la vertu humaine, celle qui convient à un être capable de vouloir autrement qu'il ne sait.
On voit alors comment le ''Charmide'' articule la figure de Socrate à l'argument conceptuel. Socrate incarne l'attitude d'équilibre. Il désire et maîtrise son désir. Il sait des choses et surtout sait son ignorance. Il mène des discussions sans prétendre à aucune science propre. La sagesse se montre en lui plus qu'elle ne se dit dans les définitions. Le héros du dialogue est ainsi à la fois le locuteur principal, le narrateur et l'image exemplaire de ce qu'il cherche à définir. Cette coïncidence donne au ''Charmide'' une singularité remarquable dans le corpus.
== X. Actualité et portée philosophique ==
Les remarques qui suivent ont valeur de prolongements contemporains et non de reconstitution du sens platonicien. Il convient de les recevoir comme telles : à titre de résonances plausibles, non comme l'équivalent direct du propos du dialogue.
=== 1. Une éthique du connaître ===
Le ''Charmide'' propose, en creux, une philosophie de la connaissance qui n'est pas une théorie abstraite du savoir, mais ce qu'on pourrait appeler une ''éthique du connaître''. Savoir ce que l'on sait et ne pas savoir ce que l'on ne sait pas, c'est-à-dire ne pas feindre de savoir ce qu'on ignore : cette « science de l'ignorance », dont Critias admet le principe sans en voir les conséquences, est proche du « je sais que je ne sais rien » de l{{'}}''Apologie''. Elle fait de la σωφροσύνη une disposition à la fois intellectuelle et morale. Il faut du courage pour reconnaître son ignorance ; de la pudeur pour ne pas feindre la science ; de l'humilité pour accepter que cette reconnaissance soit non un point d'arrivée, mais un point de départ.
=== 2. Une critique du rêve de maîtrise totale ===
Le rêve socratique de 173-174 présente plusieurs traits qui peuvent résonner avec les critiques modernes des projets de rationalité totalisante (positivismes, scientismes, utopies de maîtrise intégrale). Il convient cependant de ne pas présenter cette résonance comme le sens direct du dialogue. Platon ne vise pas la gouvernance algorithmique ni le technocratisme contemporain, et toute actualisation doit rester prudente. Tout au plus peut-on dire que certaines inquiétudes modernes concernant les projets de maîtrise exhaustive trouvent ici une formulation ancienne : un monde où rien n'est laissé au hasard, où chacun est assigné à sa fonction, pourrait bien être inhumain. Platon paraît d'ailleurs reconnaître, dans le miroir de ce rêve, l'ombre qui pèse sur sa propre utopie (la ''République''). L'inquiétude platonicienne inaugure, en tout état de cause, une tradition critique que la philosophie politique occidentale prolongera.
=== 3. Une pédagogie par le dialogue ===
Sur le plan pédagogique, le ''Charmide'' fournit un modèle. Il montre comment Socrate conduit un jeune homme (Charmide), d'abord flatté et rassuré dans sa vertu supposée, à reconnaître qu'il ne sait pas ce qu'est cette vertu ; et comment il conduit un homme plus mûr (Critias), sûr de sa science, à éprouver lui-même la « contagion » de l'aporie. La pédagogie philosophique consiste moins à transmettre une doctrine qu'à éveiller le mouvement du questionnement. La figure de l'incantation thrace symbolise cette pédagogie, dont on retrouvera l'équivalent dans la maïeutique du ''Théétète''.
=== 4. L'ambivalence politique ===
La dimension politique du ''Charmide'' est indissociable de son enjeu conceptuel. Le choix des interlocuteurs (Critias, futur tyran, et Charmide, son complice) n'est pas ornement. Il situe la question de la σωφροσύνη dans l'horizon tragique de l'histoire athénienne. La formule « faire ses propres affaires », quand elle devient la devise d'une élite qui s'arroge le droit de « purger » la cité de ceux qui y ont « mal fait leurs affaires », vire à la justification du massacre. La σωφροσύνη, sans science du bien, peut justifier la violence politique. Platon, qui a vu mourir ses proches dans la débâcle oligarchique et son maître condamné par la démocratie restaurée, sait combien la sagesse mal comprise détruit ceux-là mêmes qui la revendiquent. Le dialogue est aussi, en creux, un examen de la responsabilité de la philosophie face à la politique, question qui traversera toute l'œuvre platonicienne jusqu'aux ''Lois''.
=== 5. La dimension existentielle ===
Enfin, le ''Charmide'' peut se lire comme une méditation existentielle sur le soin de l'âme (''epimeleia heautou''). La consultation médicale fictive est le cadre d'un programme : on ne saurait soigner le corps sans soigner l'âme, ni soigner l'âme sans philosopher, ni philosopher sans s'examiner soi-même, ni s'examiner sans reconnaître les limites de sa prétendue sagesse. Le parcours du dialogue est l'itinéraire par lequel Charmide (et le lecteur avec lui) est conduit depuis la satisfaction naïve de la vertu reçue jusqu'à l'humilité requise pour devenir véritablement ''sōphrōn''. L'aporie, dans cette perspective, n'est pas un échec ; elle est l'épreuve nécessaire.
== Conclusion ==
Le ''Charmide'' est un dialogue court, mais d'une densité rare. Sous la simplicité apparente d'une discussion sur la définition d'une vertu, il articule plusieurs enjeux : philosophique (qu'est-ce que la σωφροσύνη ? qu'est-ce qu'une science réflexive ? qu'est-ce que la connaissance de soi ?), politique (quelle est la vertu du bon gouvernant ? la science totalisante est-elle désirable ?), éthique (quel est le rapport du savoir à la vertu et au bonheur ?), pédagogique (comment conduit-on une âme à la philosophie ?), et existentiel (qu'est-ce que prendre soin de soi ?). Il conduit ces différents niveaux sans les dissocier.
Le lecteur qui referme le texte n'a pas reçu de définition de la σωφροσύνη. Mais il a été conduit, à travers six définitions successivement éprouvées, à comprendre pourquoi aucune ne suffit, et à entrevoir, derrière l'échec, l'esquisse d'une vertu tout humaine, proprement philosophique : équilibre entre savoir et ignorance, maîtrise qui n'est ni froideur ni crispation, adéquation à soi qui est ouverture à l'autre, humilité qui ne renonce pas à la vérité. Socrate incarne cette vertu sans la définir. Le pacte final entre Charmide et lui énonce silencieusement ce que les concepts n'ont pas réussi à dire : la σωφροσύνη se ''pratique'' avant de se ''dire''. Elle se cultive dans l'exercice dialectique et dans la fréquentation de celui qui en est l'image vivante.
On comprend alors la phrase ultime de Critias, qui clôt le dialogue sur une ambiguïté que le lecteur averti ne peut ignorer : « ce sera pour moi la preuve que tu es sage, Charmide, si tu te soumets au charme de Socrate et si tu ne le quittes plus d'un pas ». Cette phrase énonce une définition finale, implicite et pratique, de la σωφροσύνη : être sage, c'est tenir bon dans la compagnie de la philosophie. L'histoire montrera que ni Critias ni Charmide n'y parvinrent. Leur défaillance future, que Platon connaît et que son lecteur devine, donne au dialogue une gravité qu'il ne faudrait ni forcer ni négliger. L'aporie du ''Charmide'' est aussi, en dernière instance, la trace d'une inquiétude sur la capacité de la philosophie à former des hommes, inquiétude à laquelle l'œuvre ultérieure de Platon tentera de répondre.
== Annexes ==
=== Tableau récapitulatif des six définitions ===
# ''Tranquillité'' (''hēsuchiotēs tis'', 159b) : Charmide. Réfutation par énumération de cas où la vitesse ou la vivacité sont plus belles que la lenteur. Échec dû à l'oubli de la dimension normative.
# ''Pudeur'' (''aidōs'', 160e) : Charmide. Réfutation par citation homérique (''Odyssée'' XVII, 347). La σωφροσύνη est toujours bonne ; la pudeur ne l'est pas ; donc la σωφροσύνη n'est pas la pudeur.
# ''Faire ses propres affaires'' (''to ta heautou prattein'', 161b) : Charmide, empruntant à Critias. Réfutation par ''reductio ad absurdum'' : l'artisan qui fait pour autrui ne serait pas ''sōphrōn''.
# ''Faire le bien'' (''ta agatha prattein'', 163e) : Critias. Reformulation par la distinction ''prattein''/''poiein'' et l'appel à Hésiode. Écartée pour défaut de conscience de ce que l'on fait.
# ''Se connaître soi-même'' (''to gignōskein heauton'', 164d) : Critias, d'après le Γνῶθι σεαυτόν de Delphes interprété comme salutation divine.
# ''Science d'elle-même et des autres sciences'' (''epistēmē heautēs kai tōn allōn epistēmōn'', 166e) : Critias. Double examen, ontologique et pragmatique. Échec au second examen : ce n'est pas elle, mais la « science du bien et du mal » (174b), qui serait véritablement utile.
=== Plan dramatique ===
* Prologue (153a-158e) : retour de Potidée, palestre de Tauréas, arrivée de Charmide, stratagème du mal de tête, médecin thrace et Zalmoxis.
* Trois définitions de Charmide (158e-162b) : tranquillité, pudeur, « faire ses propres affaires ».
* Reprise et quatrième définition par Critias (162b-164d) : distinction ''prattein''/''poiein'', citation d'Hésiode, « faire le bien ».
* Cinquième définition (164d-166c) : se connaître soi-même, la formule delphique.
* Sixième définition et examen critique (166c-175a) : la science de la science, question de sa possibilité, question de son utilité, rêve socratique, mention de la science du bien et du mal.
* Conclusion (175a-176d) : aporie bilan, soumission de Charmide, ironie tragique.
=== Orientations bibliographiques ===
La bibliographie des études sur le ''Charmide'' est abondante. Pour la complète, on consultera les bibliographies cherniss-brissoniennes : H. Cherniss, ''Plato 1950-1957'', Lustrum 4-5 ; et les suites de L. Brisson dans Lustrum 20 (1977), 25 (1983), 30 (1988), 34 (1992), ainsi que ''Platon 1990-1995 : bibliographie'' (avec F. Plin), Paris, Vrin, 1999. On mentionnera ici, à titre de sélection :
Éditions, traductions et commentaires
* Platon, ''Charmide, Lysis'', traduction inédite, introduction et notes par L.-A. Dorion, Paris, GF-Flammarion, 2004.
* Platon, ''Hippias majeur, Charmide, Lachès, Lysis'', texte et traduction par A. Croiset, Paris, Les Belles Lettres, 1921 (réimpression avec introduction de J.-F. Pradeau, « Classiques en poche », 1999).
* Platon, ''Second Alcibiade, Hippias mineur, Premier Alcibiade, Euthyphron, Lachès, Charmide, Lysis, Hippias majeur, Ion'', traduction et notes par E. Chambry, Paris, GF-Flammarion, 1967.
* Platon, ''Charmides'', édition Hackett Publishing Company, 2018.
Études générales et commentaires monographiques
* V. Tsouna, ''Plato's Charmides : An Interpretation'', Cambridge University Press.
* T. M. Tuozzo, ''Plato's Charmides : Positive Elenchus in a Socratic Dialogue'', Cambridge University Press, 2011.
* R. Woolf, ''Plato's Charmides'', Cambridge University Press.
* W. T. Schmid, ''Plato's Charmides and the Socratic Ideal of Rationality'', SUNY Press, 1998.
* B. Witte, ''Die Wissenschaft vom Guten und Bösen : Interpretationen zu Platons Charmides'', De Gruyter, 1970.
* T. G. Tuckey, ''Plato's Charmides'', Amsterdam, Hakkert, 1968 (première édition Cambridge 1951).
* M.-F. Hazebroucq, ''La Folie humaine et ses remèdes. Platon : Charmide ou de la modération'', traduction et commentaire, Paris, Vrin, 1997.
* N. van der Ben, ''The Charmides of Plato : Problems and Interpretations'', B. R. Grüner, 1985.
* L. Lampert, ''How Philosophy Became Socratic'', University of Chicago Press, 2010.
* D. A. Hyland, ''The Virtue of Philosophy : an interpretation of Plato's Charmides'', Athens (Ohio), 1981.
* Cl. Chrétien, ''Platon, Charmide de la sagesse'', Paris, Hatier, Profil philosophique n° 725, 1987.
Études de synthèse en français
* V. Goldschmidt, ''Les Dialogues de Platon. Structure et méthode dialectique'', Paris, PUF, 1947 (plus général, mais essentiel pour la forme des dialogues socratiques).
* L. Robin, ''Platon'', Paris, PUF, 1968.
* É. Méron, ''Les idées morales des interlocuteurs de Socrate dans les dialogues platoniciens de jeunesse'', Paris, Vrin, 1979.
* L. Brisson et T. M. Robinson (éd.), ''Plato : Euthydemus, Lysis, Charmides'', Proceedings of the V Symposium Platonicum, Sankt Augustin, Academia Verlag, 2000.
Articles spécialisés cités
* H. A. Shapiro, « The Attic deity Basile », ''Zeitschrift für Papyrologie und Epigraphik'' 63 (1986), p. 134-136.
* C. Planeaux, « The Date of Bellona's Temple at Rome and the Battle at Potidaea (Charmides 153a-d) », ''Classical Journal'' 1999.
* W. H. Pohlenz, ''Aus Platons Werdezeit'', Berlin, Weidmann, 1913.
* K. Wellman, « The Question Posed at Charmides 165a-166c », ''Phronesis'' 9 (1964), p. 107-113.
* J.-F. Pradeau, introduction à ''Alcibiade'', Paris, GF-Flammarion, 1999.
dhb8zkx5k96zbyi44evzr8t208646xl
764538
764498
2026-04-22T21:34:45Z
PandaMystique
119061
764538
wikitext
text/x-wiki
== Introduction générale ==
=== Nature et place du dialogue ===
Le ''Charmide'' appartient à ce groupe de dialogues dits « socratiques » que Platon composa, selon l'hypothèse la plus communément reçue, entre la mort de Socrate (399) et son premier voyage en Sicile (388-387). On ne saurait en serrer davantage la datation sans hypothèses arbitraires : Hazebroucq le situe entre 399 et 390, Kahn entre 386 et 380, Solère-Queval vers 388, Dušanić en 382. En l'absence d'arguments décisifs, la prudence invite à s'en tenir à la fourchette large.
Le dialogue appartient, dans la classification de Thrasylle (Diogène Laërce III, 57-61) reprise jusqu'au dix-neuvième siècle, à la cinquième tétralogie, avec le ''Lachès'', le ''Lysis'' et le ''Théagès''. Il pose une question de forme simple, « qu'est-ce que la σωφροσύνη ? », et s'achève dans une aporie avouée : ni Socrate, ni Critias, ni Charmide ne sont parvenus à définir cette vertu. Cette structure aporétique est commune à plusieurs dialogues de jeunesse, tels l{{'}}''Euthyphron'', l{{'}}''Hippias majeur'' ou le ''Lysis''.
Comment interpréter cet échec ? Plusieurs lectures s'offrent, dont aucune ne s'impose absolument. Une lecture classique, notamment développée par V. Goldschmidt (''Les Dialogues de Platon'') et C. Chrétien (''Platon, Charmide de la sagesse''), y reconnaît la trace d'un « parcours initiatique » : l'aporie évoquerait la régression rituelle qui conditionne la renaissance de l'initié, l'errance argumentative rappellerait l'épreuve imposée aux adolescents dans certaines sociétés archaïques. Cette lecture trouve son appui textuel dans le ''Banquet'' (221d-222a), où Alcibiade compare les discours de Socrate à des objets grotesques en surface mais remplis d'« images de vertu » à l'intérieur. Une autre lecture, plus sobre, voit dans l'aporie le signe d'une limite propre de la méthode socratique, que Platon s'emploiera plus tard à dépasser dans la ''République'' par l'élévation de l'âme au monde des Idées. Nous reviendrons plus loin sur cette alternative ; il suffit, pour commencer, de ne pas confondre la structure apparente du dialogue avec sa signification philosophique ultime.
=== Le sujet : la σωφροσύνη ===
Le mot grec est intraduisible en un seul terme français : il voisine tantôt avec « tempérance », tantôt avec « modération », « maîtrise de soi » ou « sagesse ». ''Sōphrosunē'' se décompose en ''sōs'' (sain) et ''phrēn'' (pensée) ; elle désigne littéralement la « santé de l'esprit ». Dans l'usage classique, le terme recouvre un faisceau de significations : modération dans l'action et dans les passions, pudeur sexuelle, retenue civique, respect des hiérarchies, conscience des limites humaines. Aristophane l'emploie tour à tour pour désigner le comportement ordonné (''Nuées'', 423), la stabilité civique (''Oiseaux'', 414), la réserve féminine (''Lysistrata'', 411) et le respect des lois (''Ploutos'', 388). Cette polysémie même fait la difficulté, et par là même l'intérêt, du dialogue.
Dans le corpus platonicien, la σωφροσύνη reçoit des traitements variés. Dans le ''Protagoras'' (332a), Socrate la glose comme le fait d'« agir correctement et utilement » et tente de la rapprocher de la sagesse (σοφία). Dans le ''Gorgias'' (506e-507d), elle nomme l'ordre de l'âme dans lequel consiste la vertu humaine. Dans la ''République'' (430d-432b), elle est « accord » (''homonoia'') entre ceux qui commandent et ceux qui obéissent, harmonie des cités comme des âmes. Les ''Lois'' (696b-697c) la poseront comme condition préalable de la justice. Le ''Charmide'' précède et prépare ces analyses en s'attachant d'abord à la question d'essence : qu'est-ce donc que cette vertu ?
Le sujet est politiquement chargé. Dans l'Athènes du cinquième siècle finissant, « gouverner avec σωφροσύνη » est presque un mot d'ordre oligarchique. Thucydide rapporte qu'à la fin de la guerre, Pisandre demandait devant l'Assemblée que l'on « gouverne avec plus de σωφροσύνη » et qu'on « confie les magistratures à un plus petit nombre » (8.53.3). Les milieux aristocratiques spartophiles s'en réclament contre la ''polypragmosynē'' démocratique. Le choix de Critias (futur chef des Trente) et de Charmide (futur membre des Dix du Pirée) comme interlocuteurs principaux confère ainsi à l'enquête une coloration politique que le lecteur moderne ne doit pas sous-estimer.
=== Les personnages ===
Socrate, qui narre tout le dialogue à un auditeur anonyme, rentre du front de Potidée. Le contexte historique précis est cependant controversé. La critique récente hésite entre deux identifications de la bataille mentionnée en 153b. L'hypothèse classique renvoie à la bataille de 432 devant Potidée, à laquelle Socrate participa et au cours de laquelle il sauva la vie d'Alcibiade (''Banquet'' 220d-e) ; mais, comme le note L.-A. Dorion dans son introduction à la traduction GF Flammarion, cette hypothèse est problématique, notamment parce que l'armée athénienne ne fut pas démantelée après la bataille de 432. Selon plusieurs commentateurs récents (Luckhurst 1934, McAvoy 1996, Planeaux 1999), il s'agirait plutôt de la bataille de mai 429 aux environs de Spartôlos, où les Athéniens essuyèrent une lourde défaite (Thucydide II, 79) ; cette hypothèse est compatible avec le retour à Athènes que le ''Charmide'' présuppose. La date dramatique du dialogue se situerait donc vers 429, soit quelque vingt-six ans avant la tyrannie des Trente (404-403). Ce que le lecteur, en tout état de cause, sait par avance, c'est la catastrophe que l'histoire réserve à deux des trois interlocuteurs.
Charmide, fils de Glaucon, est un adolescent à la beauté proverbiale, cousin et pupille de Critias, oncle maternel de Platon. Le ''Banquet'' (222b), situé en 415, le range parmi les anciens jeunes amis de Socrate qui s'en sont éloignés. Il périra en 403 à la bataille de Munychie, dans les rangs des oligarques.
Critias, fils de Callaischros (vers 460-403), est au moment de la scène un homme mûr. Poète et polymathe, familier d'Alcibiade, il entretient des sympathies spartiates. Les fragments conservés de son œuvre (DK 88 B6-7) attestent qu'il a théorisé la σωφροσύνη : une élégie loue la modération spartiate dans la boisson, y associe la « Santé, voisine de la Sainteté » et personnifie la Σωφροσύνη comme une déesse. Il retient par ailleurs la maxime attribuée au Spartiate Chilon, « rien de trop », et la rapproche d'une autre inscription delphique. Le choix de Critias comme interlocuteur principal dans le ''Charmide'' n'est donc pas ironique au sens où il serait aberrant : il est légitime qu'un homme qui a érigé la σωφροσύνη en idéal personnel et civique vienne débattre de sa définition. L'ironie, réelle, tient plutôt au contraste entre l'ambition théorique du personnage et la catastrophe politique que l'histoire lui réservera.
Critias fut en 404 l'un des chefs du régime oligarchique imposé par Sparte après la défaite athénienne : la tyrannie dite « des Trente », qui fit exécuter sans jugement près de mille cinq cents citoyens et chassa vers le Pirée plus de cinq mille autres (Isocrate 7, 67 ; pseudo-Aristote, ''Constitution d'Athènes'' 35, 4). Il mourut lui-même à la bataille de Munychie, aux côtés de son jeune pupille. La tradition postérieure, relayée par Xénophon (''Mémorables'' 1, 2, 12 ; ''Helléniques'' 2, 4, 19), en a fait le plus féroce des Trente. Il convient toutefois de ne pas réduire le personnage à une caricature noire, comme l'ont souligné Tuozzo et Tsouna : c'est dans les tensions du portrait, dans ses clairs-obscurs, que se joue l'interprétation platonicienne. Dans le ''Timée'' (20a) et dans le ''Critias'', Platon lui prêtera d'ailleurs un rôle positif et savant.
Chéréphon, enfin, est le familier enthousiaste de Socrate, présenté comme un ''manikos'' (153b), terme que l'on peut rendre par « exalté ». On sait par l{{'}}''Apologie'' (21a) que c'est Chéréphon qui interrogea la Pythie et reçut l'oracle déclarant qu'aucun homme n'était plus sage que Socrate : sa présence dès l'ouverture inscrit donc discrètement Delphes à l'horizon du texte.
=== Méthode et enjeux ===
Toute définition proposée sera réfutée. Mais l'échec des définitions successives n'exclut pas que le dialogue progresse, dans la mesure où chaque réfutation met en évidence un aspect de la vertu que la formule antérieure avait laissé échapper. Selon la ''Lettre VII'' (342a-b, 343e), la recherche de l'essence d'une réalité procède à la fois par l'analyse du nom, par la formulation de définitions et par l'examen des « images », c'est-à-dire des incarnations partielles. Le ''Charmide'' met en œuvre ces trois procédés : Charmide et Socrate, par leurs conduites respectives, offrent deux images vivantes de la σωφροσύνη, que les définitions successives viennent éprouver.
L'un des fils interprétatifs les plus probants a été dégagé par l'édition Dorion : l'incantation (''epōidē'') que Socrate apprend aux Thraces et qu'il propose d'administrer à Charmide désigne métaphoriquement l'élenchos, c'est-à-dire la réfutation dialectique. Elenchos et incantation sont rapprochés non par leur forme mais par leurs effets : l'un et l'autre ont pour propriété d'engourdir l'interlocuteur et de le rendre disponible à l'action de celui qui parle, de sorte que Socrate est parfois décrit, chez Platon lui-même, comme un « sorcier » (''Ménon'' 80a-b) ou comme une « raie torpille » (''Ménon'' 80a). Si cette hypothèse herméneutique est recevable, le prologue du ''Charmide'' ne vaut pas simple décor : il énonce déjà métaphoriquement la thèse selon laquelle la sagesse ne peut être produite dans l'âme que par l'exercice de la réfutation dialectique. La fin du dialogue, en consacrant Socrate comme dispensateur de ce « charme », confirmerait cette lecture.
== I. Le prologue (153a à 159a) ==
=== 1. Le retour de Potidée (153a-c) ===
« J'étais arrivé la veille au soir de l'armée de Potidée, et je m'empressai, après une si longue absence, de revoir les lieux que j'avais coutume de fréquenter. » Ainsi s'ouvre le récit. Socrate parle à la première personne à un auditeur muet, procédé qu'on retrouve dans le ''Lysis'', le ''Parménide'', la ''République'' et le ''Théétète''. Chéréphon, à peine Socrate est-il entré dans la palestre de Tauréas, s'enquiert des pertes : « l'engagement a été très rude et il y a péri beaucoup d'hommes de notre connaissance ». Socrate répond laconiquement : « le rapport est assez juste ». Il accepte ensuite de s'asseoir auprès de Critias.
Cette ouverture apparemment anecdotique mérite attention. Socrate, Athénien par excellence, n'a quitté sa cité que contraint par ses obligations militaires ; il rentre du front, où il vient d'assister à un combat sanglant, et se montre prêt à philosopher sans dramatisation. Cette placidité est déjà l'un des indices dramatiques de la σωφροσύνη que le dialogue s'apprête à interroger : Tsouna a bien noté que Socrate, à la différence du « manique » Chéréphon, paraît maître de lui-même, sans pour autant afficher d'héroïsme. La mention de la bataille inscrit cependant la scène sous un horizon plus grave que ne le laisserait penser son ton poli : le siège de Potidée fut, dans l'un ou l'autre de ses deux épisodes, un épisode meurtrier de la guerre du Péloponnèse.
Deux détails topographiques méritent mention. La palestre de Tauréas se trouve « en face du temple de Basilè ». L'identification de cette divinité n'est pas assurée. Plusieurs hypothèses ont été proposées : pour Witte (1970, p. 40-42), Basilè serait Perséphone, reine des Enfers, identifiée sur la base d'une inscription attique de 418 et du caractère chthonien supposé du sanctuaire ; pour Shapiro (1986), thèse que suit l'édition Dorion, Basilè serait la personnification de l'ancienne royauté (''basileia'') athénienne ; pour Rotondaro (2000), le temple de Basilè serait lié au soin de l'âme, par opposition à la palestre tournée vers le soin du corps. Tsouna, prudente, note que « l'identité de Basilè ne peut être inférée avec certitude », tout en penchant pour Perséphone. Il s'ensuit que les lectures qui font du temple de Basilè le signe d'une tonalité chthonienne et eschatologique de l'ensemble du dialogue reposent sur une identification discutée : elles relèvent de la conjecture herméneutique plus que du fait textuel.
L'autre détail significatif est moins incertain. Dans les premières lignes, le terme ''psukhē'' (âme) apparaît avec une fréquence que L.-A. Dorion a relevée : sept occurrences sur onze dans l'ensemble du dialogue se concentrent dans le prologue. Cette insistance est structurelle : le prologue établit un lien entre la sagesse et l'âme, lien que Critias, plus tard, oubliera en substituant à ''psukhē'' le terme plus intellectualiste de ''dianoia'' (pensée). L'ouverture dessine ainsi, sans le thématiser, le clivage qui départagera Socrate et Critias.
=== 2. L'entrée de Charmide et l'épreuve érotique (153d-155e) ===
Socrate s'enquiert auprès de Critias de l'état de la philosophie à Athènes et des jeunes gens qui s'y distinguent par la beauté ou par l'esprit. La double question n'est pas fortuite : elle signale que la qualité intellectuelle de la jeunesse mesure la santé spirituelle de la cité. Critias annonce l'arrivée imminente de son cousin Charmide : « celui qui paraîtra tout à l'heure sera bientôt réputé le plus beau » (''kallistos'', 154a). Charmide entre, escorté d'une bande d'admirateurs, et toute la palestre se tait.
Socrate se décrit d'abord comme une « mesure sans valeur » (''leukē stathmē''), une « règle blanche » en matière de beauté : presque tous les jeunes gens de cet âge lui paraissent beaux. La vue de Charmide modifie ce régime. Même les enfants, note-t-il, sont saisis. Et quand Critias fait approcher son cousin sous prétexte de le présenter au médecin, Socrate confesse son trouble : apercevant « ce qu'il y avait sous le manteau » (155d-e), il n'est plus « maître de lui-même », il « brûle », il se sent « comme une bête sauvage ». La tempête érotique est à son comble.
Il résiste pourtant. Là où les autres hommes se bousculent sur les bancs pour se rapprocher de l'adolescent, où l'un d'eux tombe même à la renverse, Socrate se ressaisit. On peut y lire, sans prétendre que Platon ait voulu ici dessiner un tableau continu, une préfiguration du mythe du ''Phèdre'' (253c-254e) : le cocher de l'âme conduit ses deux chevaux, l'un noble, l'autre sans frein, et c'est son redressement qui lui permet, apercevant « le visage du bien-aimé », d'être « porté par la réminiscence vers la nature même de la beauté » et de la voir « assise à côté de la Sagesse sur son trône vénérable ». Qu'il y ait analogie de structure ne signifie pas qu'il faille projeter ici la doctrine développée dans le ''Phèdre'' ; l'analogie, prudente, sert seulement à faire voir que la maîtrise érotique socratique est un fait dramatique signifiant.
Plus fondamentalement, le passage illustre ceci : avant que la σωφροσύνη ne soit thématisée comme objet de définition, elle est exemplifiée dans le héros. Socrate tient bon à la guerre et tient bon devant le bien-aimé. Cette exemplification n'est pas sans ambivalence. La maîtrise socratique peut se confondre avec de la froideur, voire avec du mépris pour ce qui émeut ordinairement les hommes. Alcibiade en fera le reproche dans le ''Banquet'' (215-222). Et dans l'ouverture même du ''Charmide'', une inquiétude discrète affleure : Socrate accepte de se prêter à une ruse, à un mensonge thérapeutique sur le mal de tête. Est-ce la conduite d'un sage ? La question orientera la suite du dialogue.
=== 3. Le stratagème du mal de tête (155b-156d) ===
Critias, complice, présente Socrate comme un guérisseur capable de soigner le mal de tête dont souffre Charmide le matin. Socrate accepte le rôle. Il prétend détenir un remède composé d'une certaine feuille et d'une incantation (''epōidē''), mais précise aussitôt que la feuille seule, sans l'incantation, ne guérit rien.
Pourquoi Socrate consent-il à ce mensonge thérapeutique ? La ''République'' (389c) fournit un principe : le mensonge est utile aux hommes sous forme de remède, à condition d'être réservé au médecin. Pour conduire autrui vers le bien, la ruse est parfois nécessaire, car le but lointain, la sagesse, a moins d'attrait immédiat que la séduction d'un soulagement physique. Nul ne peut désirer ce qu'il ne connaît pas. Le mensonge de Socrate est donc pédagogique : il parle à Charmide le seul langage que celui-ci puisse entendre, pour le conduire insensiblement au soin de l'âme. On pourra préférer, avec d'autres commentateurs, ne pas forcer la clef du « pieux mensonge » et voir plutôt dans le stratagème une ruse sociale : la consultation médicale est le cadre discret qui permet à Socrate d'aborder philosophiquement un jeune homme entouré d'admirateurs. Les deux lectures ne sont pas exclusives.
De quoi souffre Charmide ? D'un mal de tête matinal et chronique. Drew Hyland a suggéré qu'il pourrait s'agir d'une « gueule de bois » due à des excès nocturnes. L'hypothèse est possible mais spéculative, et peu compatible avec la réputation de réserve attachée au personnage. Plus sobrement, on peut observer que la métaphore du mal de tête et de son remède joue avec l'une des acceptions courantes du mot σωφροσύνη : « avoir bon sens », « être sain d'esprit ». Charmide souffre de la tête, et son remède sera la sagesse. La mise en scène dramatique est ainsi étroitement liée au jeu de mots sur la vertu.
=== 4. L'incantation thrace et la doctrine de Zalmoxis (156d-157c) ===
Voici le cœur du prologue. L'incantation, précise Socrate, il l'a apprise d'un médecin thrace, disciple de Zalmoxis, dieu honoré chez les Gètes. Le médecin thrace enseignait que les médecins grecs ont raison de dire qu'il ne faut pas soigner les yeux sans soigner la tête, ni la tête sans soigner le corps entier. Mais, ajoutait-il, Zalmoxis va plus loin : on ne peut soigner le corps sans soigner l'âme. « Et c'est pourquoi la plupart des maladies échappent aux médecins grecs : ils ignorent le tout dont il faut s'occuper, et le tout allant mal, il est impossible que la partie se porte bien ». L'âme est la source du bien et du mal pour le corps et pour l'homme. C'est elle qu'il faut soigner d'abord. Or, dit le Thrace, « on soigne l'âme par des incantations, et ces incantations sont les beaux discours (''hoi logoi hoi kaloi''). Ils font germer dans les âmes la sagesse (σωφροσύνη) ; et une fois qu'elle y est établie, il est facile de procurer la santé à la tête et au reste du corps ».
Ce développement, qu'on prendrait à tort pour une digression pittoresque, énonce plusieurs des thèses directrices du dialogue.
En premier lieu, la σωφροσύνη est identifiée à la santé de l'âme. Cette équivalence traverse la pensée grecque depuis Héraclite, chez qui on lit que « tous les hommes ont en partage de se connaître eux-mêmes et d'être ''sōphrones'' » (DK 22 B116 = D30 LM). Elle constitue, avec l'éloge traditionnel de l{{'}}''aidōs'', la toile de fond que les définitions ultérieures ne cesseront de solliciter.
En deuxième lieu, la philosophie est présentée comme une médecine. Les « beaux discours » sont le remède. L.-A. Dorion défend l'idée que l'incantation (''epōidē'') du ''Charmide'' fonctionne comme une désignation métaphorique de l'élenchos, c'est-à-dire de la réfutation dialectique. L'argument n'est pas arbitraire : il repose sur plusieurs convergences textuelles. D'une part, l'incantation socratique agit sur l'âme par la parole, comme la réfutation dialectique ; d'autre part, Socrate est comparé ailleurs par Platon lui-même à un sorcier et à une raie torpille qui engourdit son interlocuteur (''Ménon'' 80a-b), termes qui relèvent du même champ lexical que l'incantation thrace ; enfin, dans la scène finale (175e-176b), Charmide accepte de se soumettre quotidiennement à ce « charme » socratique, ce qui n'a guère de sens s'il s'agit d'une simple formule magique mais prend tout son sens si l'incantation désigne l'épreuve dialectique continue. Si l'on admet cette équivalence, le prologue énonce déjà métaphoriquement la thèse qui gouverne le dialogue entier : la sagesse ne se produit dans l'âme que par le travail de la réfutation. La scène finale ne fait alors que confirmer le prologue. On peut rapprocher cette lecture de ce que le ''Gorgias'' (464b-466a) dira bientôt : la médecine de l'âme est la véritable politique, par opposition à la rhétorique sophistique qui se contente de flatter.
En troisième lieu, le principe holistique du médecin thrace (le tout commande la partie) ouvre la polémique qui traversera tout le dialogue : celle de la subordination entre les savoirs spécialisés et un savoir englobant. Lorsque Critias définira plus loin la σωφροσύνη comme « science des sciences », il développera à sa manière cette intuition. On remarquera cependant que l'allégorie thrace n'est pas sans équivoque : si le corps est « la partie » et l'âme « le tout », dans quel sens l'âme est-elle le tout ? N'est-ce pas plutôt l'homme entier, âme et corps, qui constitue le tout ? L'indétermination, voulue ou non, pointe une difficulté qui ne sera jamais complètement résolue.
En quatrième lieu, la référence à Zalmoxis inscrit le soin de l'âme dans un horizon religieux. Hérodote (IV, 94-96) rapporte que les Gètes pratiquaient un culte de Zalmoxis associé à la croyance en l'immortalité de l'âme, et que les initiés étaient dits ''athanatizontes'', « ceux qui se rendent immortels ». On peut en déduire, avec certains commentateurs, que Platon suggère par là une portée eschatologique du soin de l'âme : soigner l'âme ne serait pas seulement viser le bien-être de cette vie, mais préparer l'âme à sa condition au-delà. Cette lecture n'est cependant pas explicitement soutenue par le texte. Elle se greffe sur l'analogie thrace sans que Socrate en thématise ici la dimension eschatologique. Il faut donc l'entendre comme une hypothèse herméneutique, laquelle trouve ses appuis davantage dans le ''Phédon'' (78a, où Socrate mentionne les « médecins-magiciens thraces » et les incantations comme remèdes à la peur de la mort) que dans le ''Charmide'' lui-même.
En cinquième lieu, Socrate insiste sur le serment qu'il a prêté au Thrace : ne jamais administrer le remède pour la tête sans avoir d'abord traité l'âme par l'incantation. Ce serment a une fonction dialectique précise. Il garantit à Socrate la maîtrise du dispositif : il ne « guérira » Charmide qu'à condition que celui-ci accepte d'abord de « soumettre son âme » à la philosophie. La consultation médicale est ainsi convertie en entretien dialectique.
En dernier lieu, la localisation thrace n'est sans doute pas arbitraire. La Thrace fonctionne chez Platon comme lieu emblématique d'une sagesse venue des confins, tournée vers les mystères (cf. encore ''Phédon'' 78a). Que Socrate rentre de Potidée, c'est-à-dire de Thrace, porteur d'une telle incantation, suggère que la campagne militaire a été en même temps, pour lui, un apprentissage philosophique, au moins métaphorique.
=== 5. Éloge de Charmide et première mise à l'épreuve (157d-159a) ===
Critias répond que Charmide n'a pas besoin qu'on lui inculque la σωφροσύνη, puisqu'il la possède déjà au plus haut point. Il passe, à Athènes, pour le plus ''sōphrōn'' des jeunes gens, tout en étant le plus beau. Socrate abonde : la noblesse de lignage de Charmide (par son père, famille de Dropidès, l'ami de Solon ; par sa mère, famille de Pyrilampe, liée à Périclès) laisse attendre, au jugement du discours aristocratique traditionnel, une qualité d'âme correspondante. Il attire cependant subtilement l'attention (154d-e, 158a) sur le fait que la beauté extérieure et la noblesse ne garantissent pas, à elles seules, que l'âme soit telle qu'elle doit être.
La proposition de Socrate d'examiner ensemble le cas de Charmide est d'abord accueillie avec un sourire imperceptible mais révélateur : Charmide rougit (158c). Ce rougissement est un signe de pudeur (''aidōs''), c'est-à-dire précisément de l'un des traits traditionnellement associés à la σωφροσύνη. La vertu est, avant d'être dite, visible dans le corps même de l'adolescent. Socrate le note : « il m'a paru plus beau que jamais ». Il y a là une beauté morale (''kallion'') superposée à la beauté physique.
Socrate demande alors à Charmide s'il possède la σωφροσύνη. Le jeune homme est pris dans une difficulté plus sociale encore que philosophique : s'il répond oui, il se fera taxer de présomption ; s'il répond non, il contredira ses admirateurs, et en particulier Critias, ce qui serait insolent. Il ne peut donc répondre. L'incapacité même est éloquente : Charmide ignore ce qu'il est, et il mesure d'abord les implications sociales de sa réponse avant d'en mesurer la portée intellectuelle. La σωφροσύνη qu'on lui prête se dérobe dès qu'on tente de la lui faire dire. Socrate fournit alors la procédure qui va orienter toute la discussion : « tu dois savoir, mieux que personne, si cette vertu habite en toi ; tu peux donc, en tournant ton regard vers toi-même, nous dire ce qu'elle t'apparaît être » (158e-159a). Cette procédure (''eis seauton apoblepsas'', « tourner le regard vers soi-même ») préfigure l'injonction delphique que Critias reprendra dans la cinquième définition.
== II. Les trois définitions de Charmide (159b à 162b) ==
Charmide propose successivement trois définitions : tranquillité, pudeur, faire ses propres affaires. Chacune révèle un aspect distinct de la σωφροσύνη traditionnelle. La première porte sur la manière extérieure d'agir ; la deuxième, sur le ressort intérieur de cette manière ; la troisième, sur le contenu moral et civique de l'action. Ensemble, elles décrivent la phénoménologie de la σωφροσύνη telle que la culture grecque classique la peint. Ensemble aussi, elles se révèlent incapables de saisir ce qui, dans cette vertu, est proprement normatif.
=== 1. Première définition : une sorte de tranquillité (159b à 160d) ===
Pressé par Socrate, Charmide répond, avec quelque hésitation, que la σωφροσύνη consiste « à faire toutes choses avec ordre et tranquillité : marcher dans les rues, discuter, et ainsi de tout le reste » ; en un mot, « une sorte d'état de tranquillité » (''hēsuchiotēs tis'', 159b3).
Le terme ''hēsuchia'' désigne le calme posé, la lenteur mesurée, le comportement sans précipitation. Xénophon décrit en ces termes la σωφροσύνη spartiate : « marcher dans la rue en gardant les mains près du corps, aller en silence, ne pas regarder partout » (''Constitution des Lacédémoniens'' 3, 4). Aristophane, dans les ''Nuées'' (962-984), loue les jeunes gens qui prennent soin de ne pas attirer l'attention sur leur beauté. La ''hēsuchia'' est aussi, chez Thucydide (3, 82, 4), l'opposé politique de la témérité ; elle caractérise l'aristocrate qui ne se mêle pas des affaires ni ne brigue le pouvoir. C'est la posture corporelle et sociale de l'homme bien né : silencieux, posé, retenu. Pindare la personnifie (''Pythique'' 8) comme la « bienveillante Hésychia », opposée à la violence de l'hubris.
Charmide lui-même, par sa manière d'entrer dans la palestre (retenu, distingué, à l'opposé de ses compagnons bruyants), incarne cette définition. Il décrit donc, sans en prendre conscience, sa propre manière d'être, ou plutôt l'image qu'on lui a donnée de lui-même et qu'il n'a pas examinée. La rapidité avec laquelle il formule et accepte la définition est déjà symptomatique. On notera toutefois la prudence du ''tis'' : la σωφροσύνη serait « une sorte » de tranquillité, ce qui pourrait laisser place à d'autres tranquillités moins dignes de ce nom.
La réfutation socratique est virtuose, presque sophistique. Elle se déroule en deux temps.
S'agissant des activités du corps, Socrate interroge : la σωφροσύνη est-elle une belle chose (''kalon'') ? Oui. Or, dans l'écriture, la lecture, le jeu de la cithare, la lutte, les sauts et toutes les activités corporelles, la vitesse et la vivacité sont plus belles que la lenteur. Il s'ensuit que, pour ces activités, la tranquillité n'est pas la σωφροσύνη.
S'agissant des activités de l'âme, même transposition : apprendre avec facilité est plus beau qu'apprendre péniblement ; apprendre avec facilité, c'est apprendre vite ; donc la vitesse est belle. Le même raisonnement vaut pour le rappel des souvenirs, la compréhension d'un discours, la recherche, la délibération.
Conclusion : la σωφροσύνη ne saurait être la tranquillité, puisque le contraire de la tranquillité est souvent plus beau.
La réfutation est brillante, mais elle est logiquement insuffisante à plusieurs titres. D'abord, l'antonyme propre de ''hēsuchia'' n'est pas la vitesse, mais la précipitation (''hybris''). Charmide n'a pas été invité à défendre la lenteur contre la vitesse, mais le calme mesuré contre la précipitation désordonnée. Ensuite, Socrate joue sur plusieurs glissements sémantiques : « facile » n'est pas « rapide », « irrésolution » n'est pas « lenteur ». Enfin, le raisonnement par accumulation d'exemples particuliers ne démontre pas qu'en ''toutes'' circonstances la vivacité soit préférable au calme. Une difficulté supplémentaire tient au ''tis'' : si la σωφροσύνη est ''une sorte'' de tranquillité, c'est-à-dire une espèce particulière, pour la réfuter, Socrate devrait montrer que certains cas de σωφροσύνη ne sont pas des cas de tranquillité ; or il procède en sens inverse.
La faiblesse même de la réfutation porte un enseignement. Charmide, s'il avait possédé la σωφροσύνη qu'il vient de décrire, aurait dû résister au rythme socratique, demander des précisions, discerner les glissements. Il acquiesce au contraire à chaque pas. Il démontre donc, par son comportement dans la discussion, qu'il ne possède pas la tranquillité réfléchie qu'il vient de revendiquer comme définition. La réfutation n'est pas d'abord une critique conceptuelle : elle est un examen éthique de l'interlocuteur.
Plus profondément, l'échec de la première définition tient à ce que Charmide a décrit une propriété phénoménale de certaines actions (le rythme lent), en oubliant la dimension normative qui ferait de cette propriété une vertu. La tranquillité n'est vertueuse que lorsqu'elle est orientée vers une fin bonne. Socrate, dans son résumé même (160b), réintroduit subtilement cette dimension normative en rappelant l'agir « avec ordre » (''kosmiōs'') que Charmide avait mentionné mais aussitôt oublié.
=== 2. Deuxième définition : la pudeur (160d à 161b) ===
Invité par Socrate à porter de nouveau son regard sur lui-même, Charmide propose : « la σωφροσύνη est ce qui fait qu'un homme a le sentiment de la honte et de la retenue ; elle est la même chose que la pudeur (''aidōs'') » (160e3-5).
La définition est plus profonde que la précédente. Là où la tranquillité décrivait un comportement extérieur, la pudeur en désigne le ressort intérieur. Charmide a cette fois réellement regardé en lui-même : il vient d'être l'objet d'une interrogation socialement délicate, il a rougi, et il sait que c'est précisément cette rougeur qui a paru, aux yeux de Socrate, manifester la σωφροσύνη. L'interlocuteur s'est donc rapproché de la procédure que Socrate lui avait prescrite.
La notion d{{'}}''aidōs'' occupe une place centrale dans l'éthique grecque traditionnelle. Elle recouvre à la fois la honte par anticipation (peur de faire ce qui disqualifierait aux yeux d'autrui) et le respect qu'on porte aux autres et à soi-même. E. R. Dodds a montré qu'elle constituait, dans la culture homérique, le principal ressort de la conscience morale. Bernard Williams a affiné l'analyse : l{{'}}''aidōs'' se distingue de la honte moderne par son ancrage dans un « regard imaginé » que l'agent a intériorisé. Dans le discours d'Archidamos chez Thucydide (1, 84), « nous sommes guerriers parce que la σωφροσύνη contient la pudeur comme son principal constituant, et la pudeur contient la bravoure ». Le mythe de Protagoras (322b-323a) présente Zeus distribuant ''aidōs'' et ''dikē'' à tous les hommes comme conditions de la vie en cité, et glisse de ''aidōs'' à σωφροσύνη avec si peu de transition qu'Aristote (''Éthique à Eudème'' III, 7, 1234a32-33) pourra noter que certains les identifient. Une inscription funéraire attique, à peu près contemporaine de la mort de Socrate, présente même la déesse Σωφροσύνη comme la fille de la « magnanime » Αἰδώς (IG II² 6859).
En définissant la σωφροσύνη comme pudeur, Charmide touche le cœur psychologique de la vertu telle que sa culture la pense. Il s'inscrit dans la lignée de l'éthique aristocratique dont il est le produit : sa modération n'est pas crainte des conséquences extérieures, mais attention au regard d'autrui. C'est l'éthique de l'élite athénienne traditionnelle, que Critias représente politiquement.
La réfutation socratique est brève mais subtile (160e-161b). Elle procède en trois pas. D'abord, la σωφροσύνη est belle (''kalon''), Charmide l'a admis. Elle rend ''bons'' ceux qu'elle habite, et rien ne peut rendre bon ceux qu'elle rendrait mauvais ; donc la σωφροσύνη est à la fois belle et ''bonne'' (''agathon''). Ensuite, Homère (''Odyssée'' XVII, 347) ne dit-il pas que « la pudeur n'est pas bonne pour l'homme dans le besoin » ? Charmide acquiesce : il croit Homère. L{{'}}''aidōs'' n'est donc pas toujours bonne ; elle est tantôt bonne, tantôt mauvaise. Or la σωφροσύνη est simplement bonne. Donc la σωφροσύνη n'est pas la pudeur.
La démarche de Socrate introduit une distinction essentielle : la σωφροσύνη n'est pas seulement belle (au sens du ''kalon'' : noble, admirable, convenable), elle est bonne, normativement bonne, partout et toujours. Cette exigence gouvernera toute la suite de la discussion. On remarquera le principe implicite, qui réapparaîtra plus loin : « le semblable produit le semblable », une bonne chose ne peut produire du mauvais.
Socrate réfute par ailleurs Charmide par son propre ressort. C'est par respect pour Homère, autorité poétique incontestable, que Charmide cède. Résister serait contraire à la pudeur. Charmide capitule donc par ''aidōs'' devant la réfutation de l{{'}}''aidōs'' : l'exemplification de sa définition se confond avec sa réfutation. Car un Charmide pleinement ''sōphrōn'', au sens où Socrate l'entend, aurait résisté à Homère pour peu qu'il eût eu de bonnes raisons de le faire. Il aurait remarqué que la phrase est prononcée par Eumée et reprise par Télémaque, qu'elle vise le besoin extrême du mendiant, que son sens contextuel est autre. Socrate, dans d'autres dialogues (''République'' III), manifestera lui-même des réserves à l'égard de l'autorité homérique en matière morale. L'argument est donc intentionnellement faible, et son acceptation par Charmide est une deuxième illustration du déficit de σωφροσύνη.
La citation d'Homère délivre par ailleurs un enseignement proprement socratique. Dans le contexte de l{{'}}''Odyssée'', Eumée recommande à Ulysse déguisé de ne pas se laisser retenir par la honte d'aller mendier chez les prétendants : il faut manger d'abord. Mais lu dans l'horizon du dialogue, le vers homérique prend un autre sens. Charmide, dans le besoin (d'apprendre, de s'examiner, d'accepter son ignorance), ne doit pas se laisser retenir par la honte. La vraie pudeur devrait porter non sur le fait de paraître ignorant, mais sur le fait de l'être sans le savoir. Ce qui est honteux, c'est de refuser d'apprendre (''Hippias mineur'' 372c : « j'ai une qualité qui me sauve : je n'ai pas honte d'apprendre »). Le renversement, implicite, est typique de l'ironie platonicienne.
=== 3. Troisième définition : faire ses propres affaires (161b à 162b) ===
Deux fois réfuté, Charmide se souvient avoir entendu quelqu'un dire que la σωφροσύνη est « faire ses propres affaires » (''to ta heautou prattein'', 161b6). Il tait l'attribution, mais Socrate, avec une malice transparente, soupçonne Critias. Socrate approuve toutefois la posture méthodologique : « il ne faut pas se demander qui a dit une chose, mais si elle est bien dite » (161c). Il reconnaît cependant que la formule tient d'un véritable « énigme » (''ainigma'', 161c9) qui demande exégèse.
La formule est chargée politiquement. Au cinquième siècle, « faire ses propres affaires » appartient au vocabulaire du camp oligarchique, aristocratique, spartophile. Chez Thucydide (1, 68, 1), les Spartiates sont ceux qui « ne s'occupent pas des affaires extérieures » et « font leurs propres affaires ». Dans l{{'}}''Électre'' de Sophocle (678), Clytemnestre ordonne à Électre de « faire ses propres affaires » et de cesser de pleurer son frère. Dans la ''Constitution des Lacédémoniens'' de Xénophon (7, 2), Lycurgue interdit aux citoyens les activités mercantiles, leur assignant comme « seule affaire propre » le service de la liberté civique. Le concept prend sens contre le terme adverse, ''polypragmosynē'', qui désigne, dans la polémique antidémocratique, la tendance athénienne à se mêler de tout. Entre la ''polypragmosynē'' et l{{'}}''apragmosynē'' (l'abstention pure), la formule « faire ses propres affaires » désigne une voie médiane : faire quelque chose, mais non les affaires des autres.
Cette troisième définition marque donc une rupture avec les précédentes : elle sort de la description phénoménologique pour entrer dans une détermination normative et sociale. Être ''sōphrōn'', c'est tenir sa place, remplir son rôle, ne pas empiéter sur celui des autres. Elle énonce, à un niveau préphilosophique, ce qui sera dans la ''République'' (433a-b) la définition de la ''justice'' : « faire chacun ses propres affaires ». On peut y voir, avec D. Hyland, l'indication que σωφροσύνη et δικαιοσύνη sont les deux faces d'une même vertu. La lecture reste toutefois hypothétique : la formule pourrait aussi bien n'être qu'une maxime traditionnelle reprise par Charmide sans en tirer de conséquence doctrinale.
La réfutation socratique (161d-162a) est un ''reductio ad absurdum''. Suivant la formule, le grammatiste, qui enseigne à écrire des noms (les siens comme ceux des autres), ne ferait pas « ses propres affaires » et ne serait donc pas ''sōphrōn''. Il en va de même pour tout artisan : le tisserand qui fait des vêtements pour autrui, le cordonnier qui fait des chaussures pour autrui, le médecin qui soigne les autres. Si l'on prend la formule au pied de la lettre, nulle division du travail ne peut subsister.
Charmide ne sait plus quoi répondre. Socrate l'en tire : peut-être Charmide ne comprend-il pas lui-même ce que veut dire la formule qu'il avance. Critias, qui ne peut supporter de voir sa propre formule maltraitée, entre alors en scène.
La mise en scène pédagogique est efficace. La « récitation » de Charmide, d'une pensée qu'il n'a pas faite sienne, est à l'image de « l'acteur qui récite mal les vers d'autrui » (162c-d). Charmide est resté étranger à la formule qu'il a prononcée. Il ne la possède pas, parce qu'il ne l'a pas examinée. Toute la transition, avec la comparaison de l'acteur et du poète, prépare la suite du dialogue, où Critias devra, lui, défendre ses propres thèses.
== III. La reprise par Critias : quatrième définition (162b à 164d) ==
Critias, piqué au vif, prend la relève. Il refuse la lecture littérale donnée par Socrate. La formule, soutient-il, ne dit pas que faire une chose pour soi ou pour autrui est décisif, mais qu'il faut faire les choses ''propres'' à soi, c'est-à-dire convenables, bienfaisantes. Sa défense s'appuie sur une distinction linguistique entre ''prattein'' (agir, faire au sens moral) et ''poiein'' (fabriquer, produire au sens technique).
=== 1. La distinction ''prattein''/''poiein'' ===
Critias invoque Hésiode (''Travaux et Jours'' 311 : « le travail n'est point honteux ; la honte est dans l'inaction ») pour soutenir qu'il existe des activités honteuses (simples ''poiēseis'') et d'autres qui sont nobles (véritables ''praxeis''). Le cordonnier qui vend du poisson salé (exemple que Critias choisit dans un mouvement de dédain aristocratique) « fabrique » mais ne « travaille » pas au sens noble. Seules les activités belles et utiles (''kalon kai ōphelimon'') méritent le nom de ''prattein''. Les œuvres propres à soi (''oikeia'') sont les bonnes œuvres ; les œuvres étrangères (''allotria''), les mauvaises.
La manœuvre est caractéristique de Critias : il s'adosse à une autorité poétique, décrète une distinction terminologique et attire le sens du mot vers la position qu'il veut défendre. Socrate ne manque pas de relever le procédé. Il rappelle que Prodicos, sophiste célèbre pour ses distinctions verbales, faisait « mille distinctions de ce genre » (''Charmide'' 163d ; cf. ''Protagoras'' 337a, 340a). Il propose alors une mise au point méthodologique décisive : « peu importe le sens fixé par convention, l'important est de voir ce que les mots désignent, quelle pensée ils traduisent, quelle réalité ils donnent à saisir » (163d). Le philosophe, à la différence du sophiste, cherche sous le mot l'idée et sous l'idée le réel. On peut lire, avec Tuckey, dans la technique argumentative de Critias un « goût sophistique pour les antithèses », qui trahit sa formation.
=== 2. Quatrième définition : faire le bien ===
Critias tire de ses distinctions la reformulation suivante : la σωφροσύνη est « faire ses propres affaires », entendu au sens où l'on fait les bonnes affaires, les affaires convenables et bienfaisantes. Autrement dit, la σωφροσύνη est « faire le bien » (''ta agatha prattein'', 163e). Socrate formule le même contenu en langage socratique : « faire des choses bonnes et profitables » équivaut à « agir bien » (''eu prattein''), formule qui, en grec, peut signifier aussi bien « bien agir » que « réussir sa vie ».
Socrate accepte provisoirement cette reformulation, tout en y décelant d'emblée une difficulté. Si la σωφροσύνη est « faire le bien », celui qui fait le bien par hasard, sans le savoir, sera ''sōphrōn'' sans le savoir. Le médecin qui soigne son patient peut ignorer si le traitement réussira. Cette objection met en lumière un point décisif : la σωφροσύνη, si elle est vertu authentique, doit inclure la ''connaissance'' du bien qu'elle fait. Si la vertu consistait à faire le bien sans qu'il faille le savoir, la σωφροσύνη serait indépendante de la conscience qu'on en a, ce qui contredit l'intuition selon laquelle la vertu engage la responsabilité du sujet.
Critias concède, et reformule une dernière fois : il faut connaître ce que l'on fait. L'enjeu devient épistémique. C'est précisément à partir de cette concession que Socrate peut conduire Critias vers la formule qui dominera la seconde partie du dialogue : la σωφροσύνη est une forme de savoir, et plus précisément un savoir portant sur soi-même.
== IV. Cinquième définition : se connaître soi-même (164d à 165b) ==
=== 1. Le discours de Critias sur l'inscription delphique ===
La discussion ayant montré que la vertu doit inclure la connaissance de ce que l'on fait, Critias reformule sa position. Il propose : la σωφροσύνη est « se connaître soi-même » (''to gignōskein heauton''). Il adosse sa définition à la célèbre inscription du temple d'Apollon à Delphes, Γνῶθι σεαυτόν, et prononce alors le discours le plus ambitieux et le plus étrange de tout le dialogue (164d-165a).
Cette formule, dit Critias, n'est pas une maxime morale parmi d'autres (comparable aux autres inscriptions delphiques : « rien de trop », ou « donne un gage, la ruine suit »). Ces deux-là ne sont que des conseils utiles (''symboulas chrēsimas'', 165a6-7), posés par ceux qui avaient mal compris la première inscription. « Connais-toi toi-même », au contraire, n'est pas un conseil : c'est une ''salutation'' (''prosrhēsis'') du dieu aux pèlerins qui entrent dans son temple. Cette salutation est la bonne, à la différence de la salutation humaine ordinaire « réjouis-toi » (''chaire''). Le dieu ne souhaite pas aux hommes qu'ils « se réjouissent » (vœu superficiel), mais qu'ils « soient sages » (''sōphronein'') : car c'est cela, être sage, que de se connaître soi-même. L'inscription signifie donc, en code, « sois ''sōphrōn'' » dit en guise de bonjour. La σωφροσύνη coïncide avec la connaissance de soi.
Le discours est remarquable. Il installe d'abord un rapport original entre l'homme et le dieu. La salutation est en principe un acte entre égaux, à la différence du conseil, qui suppose une asymétrie. En faisant de « connais-toi toi-même » une salutation, Critias suggère, plus ou moins consciemment, une relative parité entre le dieu et ceux qui entrent dans le temple. Cette audace a conduit certains commentateurs (L. Lampert notamment) à y lire l'ombre de l'athéisme que la tradition doxographique attribue à Critias, rangé avec Prodicos et Diagoras parmi les impies (le fameux fragment de ''Sisyphe'', DK 88 B25, présente les dieux comme une invention d'un homme habile pour contrôler les foules). D'autres lectures, plus nuancées (Tsouna, Tuozzo), observent que rien dans le discours lui-même ne nie l'existence des dieux : Critias suppose au contraire le dieu bienveillant. Ce qui demeure incontestable, c'est l'arrogance intellectuelle du propos : Critias se distingue de la foule des « ordinaires » qui n'ont rien compris, prétend déchiffrer le « langage énigmatique » du dieu, se pose en interprète autorisé. Cette prétention est ironiquement tout le contraire de la σωφροσύνη qu'il veut définir : elle est l'équivalent exact de la présomption que Socrate, dans l{{'}}''Apologie'' (21a-23b), récuse en revendiquant son ignorance.
La formule « connais-toi toi-même » est cependant authentiquement socratique. Dans l{{'}}''Apologie'' (21d), c'est par la reconnaissance de son ignorance que Socrate illustre la maxime delphique. Dans le ''Phèdre'' (230a), Socrate dit qu'il n'a pas le temps d'étudier les mythes, car il est occupé à s'examiner lui-même selon l'injonction delphique. Le ''Premier Alcibiade'' (127-134) développe par ailleurs longuement la thèse selon laquelle se connaître soi-même, c'est connaître son âme comme principe de l'homme. On notera toutefois que l'authenticité du ''Premier Alcibiade'' est disputée : contestée par Schleiermacher au début du dix-neuvième siècle, la critique moderne est partagée, certains (Pradeau dans sa traduction GF) le tenant pour authentique et caractéristique de la période moyenne, d'autres le classant parmi les dialogues d'école. Par prudence, on se contentera donc ici de renvoyer à l{{'}}''Apologie'' et au ''Phèdre'', dont l'authenticité n'est pas contestée, quitte à mentionner le ''Premier Alcibiade'' comme attestation indirecte.
La formule se laisse entendre en deux sens qui ouvrent une alternative. En un sens positif, se connaître soi-même, c'est connaître ce qu'est l'homme, sa nature propre, ce qui lui convient, et donc la vertu. Cette lecture rapproche la σωφροσύνη d'une ''sophia'' totalisante. En un sens négatif et critique, se connaître soi-même, c'est avoir conscience de sa propre ignorance. Telle est l'interprétation socratique la plus constante. Tuckey a défendu avec force cette seconde interprétation, en soulignant que la formule ''gnōthi seauton'' est, dans la tradition socratique, indissociable de l'aveu d'ignorance.
=== 2. Un moment de pause ===
Le passage est marqué par une certaine détente dramatique. Critias, jusque-là agressif et sûr de lui, paraît momentanément purgé de son arrogance (ou feint de l'être). Il accepte de reprendre l'enquête sur des bases nouvelles. Socrate y reconnaît l'énoncé d'une vérité essentielle, dont l'inspiration émane d'une source transcendante, en l'occurrence le dieu de Delphes.
Il faut cependant éviter ici d'interpréter trop vite cette scène comme le « moment crucial » d'un rituel d'initiation, sur le modèle proposé par Goldschmidt. L'hypothèse est séduisante, mais elle projette sur le texte une structure qui n'y est pas explicite. Plus sobrement, on se contentera de dire que l'énonciation de la formule delphique marque un tournant argumentatif, sans préjuger de sa signification symbolique plus large. Car Critias va aussitôt reformuler « se connaître soi-même » en termes de science réflexive, et non en termes de conscience critique. L'ambiguïté de la formule permet ce glissement, et c'est de là que naît la difficulté qui occupera toute la fin du dialogue.
== V. Sixième définition : la science d'elle-même et des autres sciences (165b à 166c) ==
=== 1. Du « connais-toi toi-même » à la « science de la science » ===
Socrate reprend la discussion. Si la σωφροσύνη est une forme de connaissance (''gignōskein ti''), elle est aussi une science (''epistēmē tis''), et toute science a un objet (165c4-6). La σωφροσύνη est-elle donc une science ? De quoi est-elle la science ? Quelle est son « œuvre » (''ergon'') ?
Les comparaisons que pose Socrate sont parlantes. La médecine est science de la santé, et son œuvre est la santé. L'architecture est science des constructions, et son œuvre est l'habitation. Il en va de même pour toutes les ''technai'' : chacune a un objet propre et produit une œuvre distincte du savoir lui-même. Si la σωφροσύνη est une science, elle devrait à son tour avoir un objet et produire une œuvre.
Critias répond d'abord que toutes les sciences ne se ressemblent pas : les mathématiques (le calcul, la géométrie) ne produisent aucune œuvre distincte d'elles-mêmes, et ce sont pourtant des sciences. Socrate concède la remarque, mais insiste : quel est alors l'objet de la σωφροσύνη ? Le calcul porte sur le pair et l'impair ; la géométrie, sur les grandeurs ; si la σωφροσύνη est une science, elle doit pareillement porter sur un objet déterminé.
C'est ici que Critias formule la sixième définition, la plus audacieuse du dialogue : la σωφροσύνη est ''la science d'elle-même et des autres sciences'' (ἐπιστήμη ἑαυτῆς καὶ τῶν ἄλλων ἐπιστημῶν, 166e). Elle est la seule, parmi toutes les sciences, à porter non sur un objet extérieur, mais sur le savoir lui-même. Socrate ajoute : « elle serait donc aussi science de l'ignorance » (''anepistēmosunē''), puisqu'il faut, pour connaître ce qui est su, savoir aussi ce qui ne l'est pas. Critias acquiesce. Socrate tire alors la conséquence : le sage, et lui seul, se connaîtra lui-même ; il saura ce qu'il sait et ce qu'il ne sait pas ; il pourra de même discerner chez autrui le savoir réel du savoir prétendu.
Le glissement par rapport à la définition précédente est subtil et profondément problématique. Au premier moment (« connais-toi toi-même »), l'objet semblait être la personne elle-même ; au second (« science d'elle-même et des autres sciences »), l'objet devient le savoir. La dimension personnelle et existentielle de la connaissance de soi s'efface au profit d'une métaconnaissance formelle. Le « soi » cède la place aux « sciences ». T. M. Tuozzo souligne que Socrate ne laissera pas Critias revenir en arrière : la réduction du « soi » au « savoir » est une pente, non un malentendu ponctuel. Sur la manière dont il faut comprendre ce glissement, les commentateurs divergent notablement. Pohlenz y voit une erreur flagrante que Platon signalerait pour la critiquer, tandis que Susemihl estime au contraire que « science d'elle-même » est simplement la reformulation technique de « connaissance de soi ». Selon Schirlitz, les deux notions s'impliquent. Selon von Arnim, elles marquent la confusion de Critias. Il n'est pas nécessaire ici de trancher. Ce qui importe, c'est que cette reformulation ouvre un examen conceptuel serré auquel Socrate va procéder.
=== 2. Trois lectures possibles de la « science des sciences » ===
La définition de Critias est d'une hauteur conceptuelle considérable. On y a vu, chez les commentateurs modernes, l'anticipation de la « subjectivité autonome » moderne (Oehler), de l'épistémologie critique kantienne, de l'ontologie aristotélicienne de l'être en tant qu'être, ou d'une encyclopédie du savoir. Sans préjuger de la portée que Platon lui donne, on peut proposer, pour la science des sciences, au moins trois lectures.
Dans une première lecture, elle serait science d'un objet englobant : elle porterait sur un être suprême qui inclurait ou fonderait tous les objets des autres sciences. On aurait affaire à une métaphysique ou à une théologie.
Dans une deuxième lecture, elle serait la science synthétique qui organise et totalise les autres savoirs : projet positiviste d'une science des sciences, ou encyclopédie hégélienne.
Dans une troisième lecture, enfin, elle serait une science formelle, dépourvue de contenu positif : une science critique des principes, des méthodes et des limites de tout savoir.
Critias ne précise pas laquelle de ces lectures il retient, et cette ambiguïté est peut-être la faille fondamentale de sa définition. Socrate avait attiré son attention sur la mention « science de l'ignorance », qui aurait pu orienter la discussion vers une lecture critique. Mais Critias, emporté par la grandeur de sa formule, l'entend plutôt comme une science totalisante. Tuckey a rapproché cette pente du « goût sophistique pour les antithèses » que le Critias historique partageait avec ses contemporains. L'attitude philosophique juste, celle qu'incarne Socrate, serait tout au contraire de reconnaître que la sagesse humaine est d'abord reconnaissance des limites du savoir, et non prétention à le totaliser.
== VI. Examen critique : la science de la science est-elle possible ? (166c à 169c) ==
Cette partie du dialogue, souvent tenue pour la plus aride, constitue en réalité l'un des exercices d'analyse conceptuelle les plus rigoureux de l'œuvre platonicienne. Socrate y soumet la définition de Critias à deux examens successifs : l'un ontologique (est-elle possible ?), l'autre pragmatique (serait-elle utile ?).
=== 1. Le problème de la réflexivité (167a à 168e) ===
Socrate propose : supposons que la σωφροσύνη soit la science qui a pour objet la science elle-même ; est-il seulement possible qu'une science se prenne elle-même pour objet ? Y a-t-il, dans les autres cas, des exemples de relations qui se portent sur elles-mêmes ?
L'examen est méthodique. Les entités que Socrate passe en revue sont toutes des « relatifs » (πρός τι), c'est-à-dire des réalités qui ne se définissent que par leur rapport à autre chose.
S'agissant des sensations : existe-t-il une vue qui verrait elle-même et les autres vues, mais qui ne verrait aucune couleur ? Or la vue est définie par son rapport à la couleur (objet propre), et si une « vue » ne voyait pas la couleur, elle ne serait pas une vue. De même, une audition qui n'entendrait aucun son ne serait pas une audition. Une capacité réflexive totale, qui ne porterait ''que'' sur elle-même, est absurde, car elle vide le relatif de son contenu propre.
S'agissant des désirs et des affects : un désir qui désirerait non aucun plaisir mais uniquement des désirs, une volonté qui ne voudrait aucun bien mais seulement d'autres volontés, un amour qui aimerait non le beau mais uniquement d'autres amours, une crainte qui ne craindrait aucun danger mais seulement des craintes ? L'absurdité est manifeste : chaque affect se définit par son objet caractéristique.
S'agissant des grandeurs relatives : existe-t-il un « plus grand » qui ne serait pas plus grand qu'un plus petit, mais plus grand que lui-même ? Pour être plus grand, il faut être plus grand qu'un plus petit ; or si ce « plus grand » est plus grand que lui-même, il est en même temps plus grand et plus petit que lui-même. Le relatif qui se prendrait lui-même pour objet hériterait simultanément des deux termes et tomberait dans la contradiction.
Dans les cas examinés, la réflexivité stricte (où un relatif ne porterait que sur soi) est soit absurde, soit contradictoire. Il faut distinguer deux types de réflexivité : la réflexivité totale (la science ne porterait que sur elle-même) et la réflexivité partielle (la science porterait sur soi ''et'' sur autre chose). La première semble inconcevable ; la seconde est plus prometteuse, mais exige une analyse serrée. Claude Chrétien a noté, à juste titre, que la conscience humaine présente précisément cette propriété étrange de pouvoir se retourner vers elle-même en même temps qu'elle se tourne vers autre chose. Le ''Charmide'' ne thématise pas cette distinction, mais il en ouvre le questionnement.
Socrate laisse la question ouverte pour l{{'}}''epistēmē''. Peut-être la connaissance, contrairement aux sensations et aux grandeurs, admet-elle la réflexivité ? Il reconnaît qu'une telle analyse exige un « grand homme » (169a) et « dépasse les limites du dialogue ». Il renvoie la résolution à un travail ultérieur : ce sera la « longue voie » de la ''République'' (435d). On peut voir dans cet ajournement l'aveu que la catégorialité rigoureuse déborde le dialogue vivant.
Pour relancer la discussion, Socrate propose une concession provisoire : supposons que la science de la science soit possible. Peut-elle procurer au sage ce qu'on attend de la σωφροσύνη, c'est-à-dire savoir ce qu'il sait et ne sait pas ?
=== 2. La contagion de l'aporie (169a à c) ===
À ce moment, Critias à son tour cède à l'embarras. Socrate l'observe avec humour : « voyant mes hésitations, Critias fit comme ceux qui voient des gens leur bâiller sous le nez et en font autant ; il me parut céder à la contagion, en proie au même embarras que moi » (169c). Le détail n'est pas cosmétique. Il renvoie au texte même qui, trois lignes plus haut, décrit Critias comme « honteux devant les assistants » et « refusant de concéder son incapacité à trancher ce qu'on demandait » (169c-d). Il parle alors « sans rien dire de clair », pour masquer sa gêne. Il y a ici, à un moment précis et localisable, une coïncidence remarquable entre l'argument et le drame. Critias, que la tradition aristocratique définit comme ''sōphrōn'', manifeste un défaut typique d{{'}}''aidōs'' mal orientée : la honte d'être pris en défaut l'empêche d'avouer son ignorance. C'est exactement le symptôme que la σωφροσύνη authentique devrait corriger : l'attachement à l'honneur immédiat au détriment de la recherche de la vérité. La dialectique socratique, en somme, produit et donne à voir, dans la conduite même de l'interlocuteur, le défaut de la vertu qu'il prétend théoriser. Ce passage confirme ainsi ''en acte'' la thèse que le prologue avait énoncée ''par métaphore'' : la σωφροσύνη se révèle et se produit par l'épreuve dialectique. Critias, qui reconnaît ne pas savoir mais refuse de l'admettre, est à cet instant précis l'image en creux de ce qui lui manque.
== VII. La question de l'utilité : le rêve socratique (169c à 175a) ==
=== 1. L'hypothèse et le problème de l'impuissance formelle ===
Socrate propose, pour faire avancer la discussion : admettons que la science de la science soit possible et qu'elle permette au sage de savoir ce qu'il sait et ne sait pas. Serait-elle pour autant ''utile'' ? Telle est la seconde question. Si la première était ontologique, celle-ci est pratique. L'enjeu est grave : Socrate lui-même, dans l{{'}}''Apologie'' (38a), déclare qu'une vie non réfléchie ne vaut pas la peine d'être vécue.
La démonstration socratique commence par une difficulté (170a-171c). La science de la science, si elle existe, ne peut que distinguer ce qui est science de ce qui ne l'est pas. Elle ne peut connaître les ''contenus'' des sciences particulières. Savoir ce qu'est la santé relève de la médecine, non de la science de la science. Savoir ce qui est juste relève de la politique. Si un homme possède la science de la science, il saura qu'il a une science, mais il ne saura pas ''quoi''. Il peut donc avoir les connaissances réflexives sans avoir les connaissances de premier ordre. Il est à même de distinguer formellement « savoir » de « non-savoir », mais il ne peut distinguer ''la science juste'' de ''la fausse science'' sans posséder lui-même la science de l'objet dont il est question. Le sage, dans cette configuration, est impuissant. La sagesse ainsi définie est formelle, vide, réduite à une sorte de métacognition sans substance.
Comme le note avec finesse L.-A. Dorion dans son introduction, la réfutation de 171c porte non pas sur la capacité de l'élenchos à éprouver le savoir moral et à produire la connaissance de soi, mais sur l'aptitude d'une science des sciences, dépourvue d'objet propre, à mettre à l'épreuve des connaissances particulières qui relèvent de savoirs particuliers. Ce point est important pour l'interprétation d'ensemble du dialogue : ce qui est réfuté, ce n'est pas l'ambition socratique de soumettre les autres savoirs à la question, mais la prétention d'une science purement réflexive à se substituer aux savoirs spécialisés.
Socrate sort personnellement de cette impasse par son renoncement à toute prétention dogmatique. Il n'affirme posséder aucune science et se contente d'interroger les prétendus savants sur la cohérence de leur discours. L'attitude socratique du questionnement n'est possible qu'à partir d'un tel renoncement.
=== 2. Le rêve d'omniscience (173a à 174b) ===
Socrate introduit cependant une hypothèse contrefactuelle. « Écoute donc mon songe, qu'il soit venu par la porte de corne ou par la porte d'ivoire » (173a), dit-il, faisant allusion à l{{'}}''Odyssée'' XIX, 562-567, où Pénélope évoque les deux portes des songes (ceux qui passent par l'ivoire sont trompeurs, ceux qui passent par la corne sont véridiques). L'allusion est significative : le rêve qui va suivre n'est pas présenté comme vérité certaine ; il est une vision dont on ignore si elle ouvre sur le vrai ou sur le trompeur. Socrate introduit donc son tableau avec une réserve herméneutique qui, rétroactivement, colore tout le développement d'une ambiguïté constitutive.
Dans ce rêve, Socrate explore ce que serait un monde où chacun ne ferait que ce qu'il sait faire, où la σωφροσύνη règnerait partout. Les imposteurs y seraient démasqués ; les médecins seraient de vrais médecins, les capitaines de vrais capitaines, les devins de vrais devins. Chacun serait à sa place, chacun agirait selon la science. On y vivrait plus sainement, préservés des dangers de la mer et de la guerre, ne traitant qu'avec de vrais professionnels. « Toutes choses seraient parfaitement réalisées du point de vue technique » (173b-c). Même la divination, cette « méta-science » prérationnelle, serait intégrée au régime scientifique. Le monde serait ordonné, transparent, maîtrisé.
On rapproche volontiers cette utopie de la cité idéale de la ''République''. Le rapprochement est légitime mais doit être nuancé : dans le ''Charmide'', la cité utopique n'est présentée que comme une hypothèse dans le cadre d'une interrogation sur la σωφροσύνη, et non comme un projet politique assumé. Socrate lui-même interrompt aussitôt le rêve : « qu'agir selon la science nous conduise à bien agir et à connaître le bonheur, cela, mon cher Critias, nous ne pouvons pas encore le savoir » (173d).
Le point est philosophiquement essentiel : ''agir selon la science ne suffit pas à bien agir''. Un monde parfaitement rationnel, maîtrisé, n'est pas nécessairement un monde heureux. Il peut être efficace et pourtant aveugle au bien. Le savoir n'est pas ''ipso facto'' valeur. B. Witte a souligné, dans une lecture forte, que cette correction socratique fonctionne comme une réfutation interne de l'utopie. Ce qui s'ouvrait comme un idéal se retourne en objection contre la définition de la σωφροσύνη comme science de la science. Car si un tel ordre n'engendrait pas le bonheur, la science qui le produit n'est pas la sagesse que nous cherchons.
Plus encore, un monde totalement maîtrisé a quelque chose d'inhumain : la liberté, donc la possibilité morale, y disparaîtraient. Sur ce point, on peut entendre la fin du dialogue comme un rappel de la condition humaine : la ''sophia'' est réservée à la divinité, l'homme est fait pour vivre dans les entre-deux. La σωφροσύνη est une vertu humaine, qui doit connaître sa place entre l'ignorance et le savoir, entre l'asservissement aux passions et la perfection divine.
=== 3. La science du bien et du mal (174a-c) ===
Quelle science, demande alors Socrate, assure le bonheur ? Est-ce la tactique ? la médecine ? le calcul ? À chaque fois, Critias répond par la négative. Socrate élimine méthodiquement toutes les sciences particulières (cordonnerie, travail du bois, divination, jeu de dés). Aucune, prise isolément, ne peut rendre heureux. Sommé de nommer la science qui rend heureux, Critias concède enfin : c'est « la science du bien et du mal » (ἡ ἐπιστήμη τοῦ ἀγαθοῦ καὶ κακοῦ, 174b).
Le coup de théâtre est considérable. Si c'est la science du bien et du mal qui produit l'utilité et le bonheur, et si la σωφροσύνη est la science de la science (qui n'inclut pas, par hypothèse, la science du bien particulier), alors la σωφροσύνη n'est ''pas'' la science qui nous est utile. Elle est autre chose que la science du bien et du mal. Elle est donc, conclut Socrate, inutile.
La portée de ce passage mérite une lecture prudente. L.-A. Dorion (introduction, p. 69-70) propose ici une interprétation forte qui permet de comprendre l'apparent paradoxe. L'assimilation de la sagesse à la connaissance du bien et du mal, observe-t-il, n'est pas une conclusion inattendue : plusieurs passages antérieurs l'anticipent explicitement. En 156e-157a, Socrate faisait déjà de la σωφροσύνη la source de tout bien dans le corps et dans l'homme ; en 160e-161a, il exigeait que la vertu soit toujours bonne ; en 163d-164a, Critias lui-même convenait que la σωφροσύνη est « faire le bien » et suppose la connaissance de ce bien. Ce que la fin du dialogue nomme n'est donc pas un élément extérieur à l'enquête, mais ce qui en formait silencieusement l'enjeu depuis le début. Plus décisif encore, Dorion suggère de distinguer deux conceptions de la « science des sciences » : celle de Critias, qui pense la sagesse comme une science universelle additionnant les savoirs particuliers, et celle que Socrate dessine en creux, un savoir ''architectonique'' qui, sans englober les objets des autres savoirs, fixe à chacun la finalité qu'il doit poursuivre. La connaissance du bien et du mal est architectonique en ce sens précis : elle détermine les fins auxquelles les autres sciences doivent être appliquées, mais elle n'a pas besoin, pour cela, d'être elle-même médecine ou architecture. Le parallèle avec la forme du Bien de la ''République'' (VI, 505a-b) vient naturellement à l'esprit, encore que le ''Charmide'' n'engage pas ici de discussion ontologique explicite.
Cette lecture donne une cohérence à l'ensemble du dialogue sans faire basculer le ''Charmide'' dans le simple rôle de propédeutique à la ''République''. Elle maintient que Socrate pointe, à la fin du dialogue, une conception substantielle de la sagesse (la connaissance du bien et du mal), tout en refusant de l'identifier formellement à la σωφροσύνη, car Critias s'obstine à définir celle-ci comme science des sciences, ce que Socrate ne peut accepter sans contradiction. Le texte maintient donc simultanément deux choses : que la connaissance du bien et du mal serait la bonne candidate, et que Critias ne parvient pas à en tirer la conséquence. B. Witte, dans sa lecture allemande influente, fait du ''Charmide'' une « propédeutique négative » désignant la science du bien comme science-limite ; la proposition est féconde, mais elle minore peut-être ce que le ''Charmide'' accomplit par lui-même. Le dialogue ne se contente pas de désigner un manque : il indique positivement que la σωφροσύνη véritable ne peut être une science-reine formelle, qu'elle doit se subordonner à une science substantielle du bien. Cela suffit à rendre compte de son échec apparent sans en faire une simple étape préparatoire.
== VIII. L'aporie finale et la scène de conclusion (175a à 176d) ==
=== 1. Le bilan de Socrate (175a à d) ===
Socrate dresse un bilan apparemment désastreux. Nous avons, dit-il, admis sans preuve plusieurs choses dans le raisonnement. Nous avons même concédé ce qui contredit la raison. Et malgré toutes ces complaisances, nous n'avons pas su trouver la nature de la σωφροσύνη. « Notre enquête n'a pas été davantage capable de trouver la vérité ; mais elle s'est si bien moquée de celle-ci que ce que nous avons jusqu'ici proposé comme définitions de la sagesse, à force de conventions et de combines, nous a montré celle-ci, provocation extrême, comme inutile » (175a-b).
C'est l'aporie explicite. Elle n'est pourtant pas un simple échec. Socrate n'en est pas trop affligé. Le bilan contient une correction manifeste : si la σωφροσύνη ''telle que nous l'avons définie'' s'est révélée inutile, cela ne signifie pas que la sagesse véritable le soit. Cela signifie que nous n'avons pas su la définir correctement.
Chaque définition rejetée a en effet indirectement révélé un aspect de la σωφροσύνη véritable. La tranquillité pose l'ordre (en dépit de l'échec de sa déclinaison physique). La pudeur pose le ressort intérieur (en dépit de son hétéronomie). « Faire ses propres affaires » pose l'adéquation à soi et la convenance. « Faire le bien » pose la normativité. La connaissance de soi pose la réflexivité. La science de la science pose la hauteur de la prétention philosophique. Au terme, la science du bien et du mal est nommée, sans être identifiée à la σωφροσύνη, mais comme sa condition éthique profonde.
=== 2. La scène finale : Charmide accepte l'incantation (175d à 176d) ===
Le dialogue ne s'achève pas sur l'aporie conceptuelle. Il revient à la scène dramatique initiale. Socrate, feignant d'être très affligé de son échec, s'adresse à Charmide. Il n'est pas trop chagriné pour lui-même, mais il l'est pour Charmide, « si, avec une telle beauté et l'esprit le plus sage, tu ne tires aucun fruit de cette sagesse ». Il s'irrite davantage d'avoir appris avec tant de soin la formule magique thrace, si elle n'a aucune valeur pratique. Non, conclut-il, « j'aime mieux penser que je suis un piètre chercheur, que la sagesse est un grand bien, et que, si tu la possèdes, tu es un heureux mortel ».
Charmide répond : « par Zeus, je ne sais pas, Socrate, si je la possède ou non. Comment en effet connaîtrais-je ce dont vous-mêmes n'êtes pas capables de déterminer la nature ? ». Il ajoute, touchant dans sa modestie : « pour ma part, je ne te crois guère, et je suis sûr que j'ai besoin de ta formule magique. Je ne vois aucun inconvénient, de mon côté, à me soumettre tous les jours à ton charme, jusqu'à ce que tu dises que c'est assez ».
Critias renchérit : « fais-le, Charmide. Ce sera pour moi la preuve que tu es sage, si tu te soumets au charme de Socrate et si tu ne le quittes plus d'un pas ». Charmide acquiesce : « je le suivrai et ne le quitterai pas, car j'agirais mal si je ne t'obéissais pas, à toi mon tuteur ». Et, quand Socrate plaisante sur le caractère contraignant de cette volonté, Charmide conclut : « alors ne résiste pas, toi non plus ».
La scène est remarquable. Dramatiquement, elle se déploie sur trois plans qu'il importe de distinguer.
Sur le plan pédagogique, la soumission de Charmide à Socrate témoigne du succès relatif de l'initiation dialectique. Le jeune homme reconnaît qu'il a besoin de la philosophie et accepte de suivre Socrate. L'échec conceptuel se convertit en succès pédagogique : Charmide, qui se flattait implicitement de la sagesse au début, reconnaît à la fin qu'il en a besoin. Telle est la direction que prend, dans le texte, l'élenchos socratique. Si l'on admet, avec l'édition Dorion, que l'incantation désigne métaphoriquement la réfutation dialectique, alors la scène finale confirme la thèse du prologue : la σωφροσύνη se produit dans l'âme par le travail dialectique, et la meilleure preuve en est le consentement final de Charmide à recevoir ce travail.
Sur le plan dramatique, cette lumière est indissociable d'une ombre. Le lecteur sait que cet adolescent, aujourd'hui docilement soumis à Critias, suivra son tuteur non dans l'école de Socrate, mais dans la tyrannie des Trente. Il mourra en 403 avec Critias. La promesse de « ne plus quitter Socrate d'un pas » ne sera pas tenue. La formule finale de Critias (« si tu te soumets au charme de Socrate et si tu ne le quittes plus d'un pas, ce sera la preuve que tu es sage ») énonce ainsi une dernière définition implicite : être sage, c'est tenir bon dans la compagnie de la philosophie. Mais ni Critias ni Charmide n'y parviendront. L'ironie tragique reste toutefois sous la surface du texte : c'est le lecteur, informé par l'histoire, qui l'y projette.
Sur le plan verbal, enfin, il faut noter l'emploi par Charmide du mot ''charisme'' (''charizesthai'') pour désigner ce à quoi il se soumet. Le terme désigne étymologiquement un don gratuit, une grâce, et fait écho à la tradition religieuse. Dans le ''Banquet'' de Xénophon (4, 14-15), Socrate se dit lui-même capable d'« ensorcellement » (''katepad-''). La clôture du ''Charmide'' confirme ainsi, dans le vocabulaire même, l'identification du discours socratique au chant incantatoire du prologue.
=== 3. L'ironie et la promesse ===
La scène finale accomplit ainsi trois choses. Elle confirme l'échec conceptuel : on n'a pas défini la σωφροσύνη. Elle révèle un succès pratique : l'élenchos opère, Charmide se tourne vers la philosophie. Elle porte, pour le lecteur averti, l'ombre historique : le succès pratique sera, dans les faits, révoqué.
Cette tension entre trois plans (conceptuel, pratique, historique) constitue une des singularités du ''Charmide''. Elle suggère que la philosophie, comme pur exercice de définition, ne suffit pas : elle doit engager l'existence, sans que cet engagement garantisse la fidélité. Peut-être est-ce en ce sens qu'on peut voir dans le ''Charmide'' une inquiétude qui annonce le programme de la ''République'' : ancrer la σωφροσύνη individuelle dans une cité, une ''paideia'' et une ontologie qui lui donnent un fondement stable.
== IX. Interprétation d'ensemble : la σωφροσύνη selon le ''Charmide'' ==
Au terme de cette lecture suivie, on peut tenter de ressaisir ce que le dialogue, malgré son aporie explicite, suggère sur la nature de la σωφροσύνη. La présentation qui suit est une synthèse interprétative, et doit être reçue comme telle.
En premier lieu, la σωφροσύνη est une vertu, mais non une valeur ascétique extérieure à l'individu. Elle situe le bien dans l'accomplissement de l'être propre et associe la vertu et le bonheur, le beau et le bon, le bien et l'utile. Elle est, en ce sens, profondément eudémoniste.
En deuxième lieu, cet accomplissement n'est pas abandon à soi, mais « maîtrise de soi » (''enkrateia'', ''République'' 430e). Toutefois, poussée jusqu'au bout, la maîtrise peut rendre l'humain inhumain : Socrate dans le prologue (presque trop maître de lui) et l'utopie du rêve (un monde totalement rationnel, donc invivable) en sont les deux figures. La sagesse exclut ainsi tant le schéma de la maîtrise que celui de la soumission. Platon lui-même, dans la ''République'' (430e-431a), qualifie la notion de maîtrise de soi de « ridicule » et de contradictoire : comment un même sujet peut-il être celui qui maîtrise et celui qui est maîtrisé ? La σωφροσύνη doit se penser autrement qu'en termes de domination.
En troisième lieu, cette vertu est connaissance, selon l'intellectualisme socratique (il suffit de savoir pour vouloir, et de vouloir pour faire). Elle tend à la vérité en la sachant inaccessible. Elle tend à l'unité en se sachant vouée à l'éparpillement. L'échec du ''Charmide'' à définir la sagesse comme science n'est pas l'échec de l'identification vertu-connaissance, mais l'échec d'une certaine conception de la connaissance : trop formelle, trop prétentieuse, trop coupée du bien.
En quatrième lieu, elle se développe surtout comme conscience critique de soi. Il ne s'agit pas d'introspection narcissique. La conscience de soi platonicienne est ouverture aux autres (comme le montre le dialogue) et ouverture au monde. Être conscient de soi, c'est se situer à sa place dans le tout.
En cinquième lieu, elle est vertu de l'entre-deux. Ni la bête ni le dieu n'ont besoin de la σωφροσύνη. La σωφροσύνη est proprement la vertu humaine, celle qui convient à un être capable de vouloir autrement qu'il ne sait.
On voit alors comment le ''Charmide'' articule la figure de Socrate à l'argument conceptuel. Socrate incarne l'attitude d'équilibre. Il désire et maîtrise son désir. Il sait des choses et surtout sait son ignorance. Il mène des discussions sans prétendre à aucune science propre. La sagesse se montre en lui plus qu'elle ne se dit dans les définitions. Le héros du dialogue est ainsi à la fois le locuteur principal, le narrateur et l'image exemplaire de ce qu'il cherche à définir. Cette coïncidence donne au ''Charmide'' une singularité remarquable dans le corpus.
== X. Actualité et portée philosophique ==
''Avertissement liminaire.'' Les remarques qui suivent sont de nature interprétative. Elles ne prétendent pas restituer le sens littéral du ''Charmide'', mais proposer des résonances entre le dialogue et certaines questions qui se posent encore aujourd'hui. Le lecteur voudra bien tenir ces prolongements pour ce qu'ils sont : des pistes offertes, non des conclusions tirées du texte.
=== 1. Une éthique du connaître ===
Le ''Charmide'' propose, en creux, une philosophie de la connaissance qui n'est pas une théorie abstraite du savoir, mais ce qu'on pourrait appeler une ''éthique du connaître''. Savoir ce que l'on sait et ne pas savoir ce que l'on ne sait pas, c'est-à-dire ne pas feindre de savoir ce qu'on ignore : cette « science de l'ignorance », dont Critias admet le principe sans en voir les conséquences, est proche du « je sais que je ne sais rien » de l{{'}}''Apologie''. Elle fait de la σωφροσύνη une disposition à la fois intellectuelle et morale. Il faut du courage pour reconnaître son ignorance ; de la pudeur pour ne pas feindre la science ; de l'humilité pour accepter que cette reconnaissance soit non un point d'arrivée, mais un point de départ.
=== 2. Une critique du rêve de maîtrise totale ===
Le rêve socratique de 173-174 peut résonner, prudemment, avec certaines critiques modernes des projets de rationalité totalisante. Mais ce rapprochement doit rester à sa place de prolongement, non être pris pour le sens du texte : Platon ne vise ni le positivisme, ni le technocratisme, ni la gouvernance algorithmique. Tout au plus peut-on observer que le dialogue met en garde, sur le mode hypothétique, contre un monde où tout serait accompli selon la science, et suggère qu'un tel monde ne serait pas nécessairement bon. L'interruption que Socrate oppose à sa propre vision (« qu'agir selon la science nous conduise à bien agir et à connaître le bonheur, cela, mon cher Critias, nous ne pouvons pas encore le savoir », 173d) est, à elle seule, le point qui autorise ces prolongements : la science sans le bien ne suffit pas. Platon paraît d'ailleurs reconnaître, dans le miroir de ce rêve, une ombre qui pèse aussi sur sa propre utopie (''République'').
=== 3. Une pédagogie par le dialogue ===
Sur le plan pédagogique, le ''Charmide'' fournit un modèle. Il montre comment Socrate conduit un jeune homme (Charmide), d'abord flatté et rassuré dans sa vertu supposée, à reconnaître qu'il ne sait pas ce qu'est cette vertu ; et comment il conduit un homme plus mûr (Critias), sûr de sa science, à éprouver lui-même la « contagion » de l'aporie. La pédagogie philosophique consiste moins à transmettre une doctrine qu'à éveiller le mouvement du questionnement. La figure de l'incantation thrace symbolise cette pédagogie, dont on retrouvera l'équivalent dans la maïeutique du ''Théétète''.
=== 4. L'ambivalence politique ===
Le choix des interlocuteurs (Critias, futur chef des Trente, et Charmide, son jeune pupille qui mourra à ses côtés) n'est certainement pas ornemental : il situe l'enquête sur la σωφροσύνη dans l'horizon de l'histoire athénienne connue du lecteur platonicien. Au-delà de ce constat, on peut proposer prudemment quelques prolongements. La formule « faire ses propres affaires », dans la bouche d'une élite qui s'arrogera le droit de « purger » la cité, change de sens. Une σωφροσύνη qui n'est pas adossée à la connaissance du bien risque, dès lors, de servir d'alibi à l'exclusion. C'est là un prolongement interprétatif, et non une affirmation explicite du texte : Platon ne tire pas cette conséquence ouvertement dans le ''Charmide''. Il reste toutefois significatif que le dialogue ne fasse réapparaître la connaissance du bien qu'au moment où l'aporie conduite par Critias se révèle sans issue. On entrevoit ainsi, en creux, la ligne de fuite que les ''Lois'' et la ''République'' développeront : la σωφροσύνη requiert d'être articulée à une ''paideia'' et à une ontologie du bien.
=== 5. La dimension existentielle ===
Enfin, on peut lire le ''Charmide'' comme une méditation sur le soin de l'âme (''epimeleia heautou''). L'appui textuel est ici plus net : le prologue thématise explicitement l'âme (sept occurrences de ''psukhē'' sur onze, selon le relevé de Dorion), et l'allégorie du médecin thrace fait du soin de l'âme la condition du soin du corps. On peut donc reconstruire un programme sans forcer le texte : on ne saurait soigner le corps sans soigner l'âme, ni soigner l'âme sans philosopher, ni philosopher sans s'examiner, ni s'examiner sans reconnaître les limites de sa prétendue sagesse. Le parcours du dialogue conduit Charmide, et le lecteur avec lui, de la satisfaction naïve de la vertu reçue à l'humilité requise pour devenir véritablement ''sōphrōn''. L'aporie, dans cette perspective, n'est pas un échec : elle est l'épreuve par laquelle la philosophie produit son effet.
== Conclusion ==
Le ''Charmide'' est un dialogue court, mais d'une densité rare. Sous la simplicité apparente d'une discussion sur la définition d'une vertu, il articule plusieurs enjeux : philosophique (qu'est-ce que la σωφροσύνη ? qu'est-ce qu'une science réflexive ? qu'est-ce que la connaissance de soi ?), politique (quelle est la vertu du bon gouvernant ? la science totalisante est-elle désirable ?), éthique (quel est le rapport du savoir à la vertu et au bonheur ?), pédagogique (comment conduit-on une âme à la philosophie ?), et existentiel (qu'est-ce que prendre soin de soi ?). Il conduit ces différents niveaux sans les dissocier.
Le lecteur qui referme le texte n'a pas reçu de définition de la σωφροσύνη. Mais il a été conduit, à travers six définitions successivement éprouvées, à comprendre pourquoi aucune ne suffit, et à entrevoir, derrière l'échec, l'esquisse d'une vertu tout humaine, proprement philosophique : équilibre entre savoir et ignorance, maîtrise qui n'est ni froideur ni crispation, adéquation à soi qui est ouverture à l'autre, humilité qui ne renonce pas à la vérité. Socrate incarne cette vertu sans la définir. Le pacte final entre Charmide et lui énonce silencieusement ce que les concepts n'ont pas réussi à dire : la σωφροσύνη se ''pratique'' avant de se ''dire''. Elle se cultive dans l'exercice dialectique et dans la fréquentation de celui qui en est l'image vivante.
On comprend alors la phrase ultime de Critias, qui clôt le dialogue sur une ambiguïté que le lecteur averti ne peut ignorer : « ce sera pour moi la preuve que tu es sage, Charmide, si tu te soumets au charme de Socrate et si tu ne le quittes plus d'un pas ». Cette phrase énonce une définition finale, implicite et pratique, de la σωφροσύνη : être sage, c'est tenir bon dans la compagnie de la philosophie. L'histoire montrera que ni Critias ni Charmide n'y parvinrent. Leur défaillance future, que Platon connaît et que son lecteur devine, donne au dialogue une gravité qu'il ne faudrait ni forcer ni négliger.
== Annexes ==
=== Tableau récapitulatif des six définitions ===
# ''Tranquillité'' (''hēsuchiotēs tis'', 159b) : Charmide. Réfutation par énumération de cas où la vitesse ou la vivacité sont plus belles que la lenteur. Échec dû à l'oubli de la dimension normative.
# ''Pudeur'' (''aidōs'', 160e) : Charmide. Réfutation par citation homérique (''Odyssée'' XVII, 347). La σωφροσύνη est toujours bonne ; la pudeur ne l'est pas ; donc la σωφροσύνη n'est pas la pudeur.
# ''Faire ses propres affaires'' (''to ta heautou prattein'', 161b) : Charmide, empruntant à Critias. Réfutation par ''reductio ad absurdum'' : l'artisan qui fait pour autrui ne serait pas ''sōphrōn''.
# ''Faire le bien'' (''ta agatha prattein'', 163e) : Critias. Reformulation par la distinction ''prattein''/''poiein'' et l'appel à Hésiode. Écartée pour défaut de conscience de ce que l'on fait.
# ''Se connaître soi-même'' (''to gignōskein heauton'', 164d) : Critias, d'après le Γνῶθι σεαυτόν de Delphes interprété comme salutation divine.
# ''Science d'elle-même et des autres sciences'' (''epistēmē heautēs kai tōn allōn epistēmōn'', 166e) : Critias. Double examen, ontologique et pragmatique. Échec au second examen : ce n'est pas elle, mais la « science du bien et du mal » (174b), qui serait véritablement utile.
=== Plan dramatique ===
* Prologue (153a-158e) : retour de Potidée, palestre de Tauréas, arrivée de Charmide, stratagème du mal de tête, médecin thrace et Zalmoxis.
* Trois définitions de Charmide (158e-162b) : tranquillité, pudeur, « faire ses propres affaires ».
* Reprise et quatrième définition par Critias (162b-164d) : distinction ''prattein''/''poiein'', citation d'Hésiode, « faire le bien ».
* Cinquième définition (164d-166c) : se connaître soi-même, la formule delphique.
* Sixième définition et examen critique (166c-175a) : la science de la science, question de sa possibilité, question de son utilité, rêve socratique, mention de la science du bien et du mal.
* Conclusion (175a-176d) : aporie bilan, soumission de Charmide, ironie tragique.
== Orientations bibliographiques ==
''Note sur la présentation.'' Les références sont ordonnées alphabétiquement dans chaque rubrique. Chaque entrée indique successivement le nom, le prénom abrégé, l'année entre parenthèses, le titre en italiques, le lieu de publication et l'éditeur ; les collections figurent entre guillemets, les rééditions et précisions entre crochets. La présente bibliographie est sélective. Pour une recension exhaustive, on consultera les bibliographies platoniciennes de référence : Cherniss, H. (1959-1960), « Plato 1950-1957 », ''Lustrum'' 4-5 ; Brisson, L. (1977, 1983, 1988, 1992), « Platon », ''Lustrum'' 20, 25, 30, 34 ; Brisson, L. et Plin, F. (1999), ''Platon 1990-1995 : bibliographie'', Paris, Vrin.
'''I. Éditions, traductions et commentaires'''
* Burnet, J. (1903), ''Platonis opera'', vol. III, Oxford, Clarendon Press.
* Chambry, É. (1967), ''Platon. Second Alcibiade, Hippias mineur, Premier Alcibiade, Euthyphron, Lachès, Charmide, Lysis, Hippias majeur, Ion'', traduction et notes, Paris, GF-Flammarion [première édition : 1937].
* Cooper, J. M. et Hutchinson, D. S. (éd.) (1997), ''Plato. Complete Works'', Indianapolis, Hackett Publishing Company.
* Croiset, A. (1921), ''Platon. Hippias majeur, Charmide, Lachès, Lysis'', texte et traduction, Paris, Les Belles Lettres [réimpression avec introduction et notes de J.-F. Pradeau, « Classiques en poche » 40, 1999].
* Dorion, L.-A. (2004), ''Platon. Charmide, Lysis'', traduction inédite, introduction et notes, Paris, GF-Flammarion.
* Hazebroucq, M.-F. (1997), ''La Folie humaine et ses remèdes. Platon : Charmide ou de la modération'', traduction et commentaire, Paris, Vrin.
* Robin, L. (1950), ''Platon. Œuvres complètes'', 2 vol., traduction et notes, Paris, Gallimard, « Bibliothèque de la Pléiade ».
* Sprague, R. K. (2018), ''Plato. Charmides'', Indianapolis, Hackett Publishing Company.
'''II. Commentaires monographiques consacrés au dialogue'''
* Chrétien, Cl. (1987), ''Platon. Charmide de la sagesse'', Paris, Hatier, « Profil philosophique » 725.
* Hyland, D. A. (1981), ''The Virtue of Philosophy. An Interpretation of Plato's Charmides'', Athens (Ohio), Ohio University Press.
* Schmid, W. T. (1998), ''Plato's Charmides and the Socratic Ideal of Rationality'', Albany, State University of New York Press.
* Tsouna, V. (2022), ''Plato's Charmides. An Interpretation'', Cambridge, Cambridge University Press.
* Tuckey, T. G. (1968), ''Plato's Charmides'', Amsterdam, Hakkert [première édition : Cambridge, Cambridge University Press, 1951].
* Tuozzo, T. M. (2011), ''Plato's Charmides. Positive Elenchus in a « Socratic » Dialogue'', Cambridge, Cambridge University Press.
* Van der Ben, N. (1985), ''The Charmides of Plato. Problems and Interpretations'', Amsterdam, B. R. Grüner.
* Witte, B. (1970), ''Die Wissenschaft vom Guten und Bösen. Interpretationen zu Platons Charmides'', Berlin, De Gruyter.
* Woolf, R. (2023), ''Plato's Charmides'', Cambridge, Cambridge University Press.
'''III. Études platoniciennes de cadre'''
* Brisson, L. et Robinson, T. M. (éd.) (2000), ''Plato. Euthydemus, Lysis, Charmides'' (Proceedings of the V Symposium Platonicum), Sankt Augustin, Academia Verlag.
* Goldschmidt, V. (1947), ''Les Dialogues de Platon. Structure et méthode dialectique'', Paris, Presses universitaires de France.
* Lampert, L. (2010), ''How Philosophy Became Socratic. A Study of Plato's Protagoras, Charmides, and Republic'', Chicago, University of Chicago Press.
* Méron, É. (1979), ''Les idées morales des interlocuteurs de Socrate dans les dialogues platoniciens de jeunesse'', Paris, Vrin.
* Pradeau, J.-F. (1999), « Introduction », dans Platon, ''Alcibiade'', Paris, GF-Flammarion.
* Robin, L. (1968), ''Platon'', Paris, Presses universitaires de France.
'''IV. Études et articles spécialisés cités'''
* Cairns, D. L. (1993), ''Aidōs. The Psychology and Ethics of Honour and Shame in Ancient Greek Literature'', Oxford, Clarendon Press.
* Dodds, E. R. (1951), ''The Greeks and the Irrational'', Berkeley, University of California Press.
* Iannucci, A. (2002), ''La parola e l'azione. I frammenti simposiali di Crizia'', Bologne, Nautilus.
* Planeaux, C. (1999), « The Date of Bellona's Temple at Rome and the Battle of Potidaea (''Charmides'' 153a-d) », ''Classical Journal'' 94/2, p. 165-183.
* Pohlenz, M. (1913), ''Aus Platons Werdezeit. Philologische Untersuchungen'', Berlin, Weidmann.
* Sedley, D. (2013), « The Atheist Underground », dans V. Harte et M. Lane (éd.), ''Politeia in Greek and Roman Philosophy'', Cambridge, Cambridge University Press, p. 329-348.
* Shapiro, H. A. (1986), « The Attic Deity Basile », ''Zeitschrift für Papyrologie und Epigraphik'' 63, p. 134-136.
* Wellman, R. R. (1964), « The Question Posed at ''Charmides'' 165a-166c », ''Phronesis'' 9, p. 107-113.
* Williams, B. (1993), ''Shame and Necessity'', Berkeley, University of California Press.
mfbzlodlews51dj6w10id5rxx4ltote
764630
764538
2026-04-23T10:55:31Z
PandaMystique
119061
764630
wikitext
text/x-wiki
{{sous-pages}}
== Introduction générale ==
=== Nature et place du dialogue ===
{{wikisource|Charmide|Charmide}}
Le ''Charmide'' appartient à ce groupe de dialogues dits « socratiques » que Platon composa, selon l'hypothèse la plus communément reçue, entre la mort de Socrate (399) et son premier voyage en Sicile (388-387). On ne saurait en serrer davantage la datation sans hypothèses arbitraires : Hazebroucq le situe entre 399 et 390, Kahn entre 386 et 380, Solère-Queval vers 388, Dušanić en 382. En l'absence d'arguments décisifs, la prudence invite à s'en tenir à la fourchette large.
Le dialogue appartient, dans la classification de Thrasylle (Diogène Laërce III, 57-61) reprise jusqu'au dix-neuvième siècle, à la cinquième tétralogie, avec le ''Lachès'', le ''Lysis'' et le ''Théagès''. Il pose une question de forme simple, « qu'est-ce que la σωφροσύνη ? », et s'achève dans une aporie avouée : ni Socrate, ni Critias, ni Charmide ne sont parvenus à définir cette vertu. Cette structure aporétique est commune à plusieurs dialogues de jeunesse, tels l{{'}}''Euthyphron'', l{{'}}''Hippias majeur'' ou le ''Lysis''.
Comment interpréter cet échec ? Plusieurs lectures s'offrent, dont aucune ne s'impose absolument. Une lecture classique, notamment développée par V. Goldschmidt (''Les Dialogues de Platon'') et C. Chrétien (''Platon, Charmide de la sagesse''), y reconnaît la trace d'un « parcours initiatique » : l'aporie évoquerait la régression rituelle qui conditionne la renaissance de l'initié, l'errance argumentative rappellerait l'épreuve imposée aux adolescents dans certaines sociétés archaïques. Cette lecture trouve son appui textuel dans le ''Banquet'' (221d-222a), où Alcibiade compare les discours de Socrate à des objets grotesques en surface mais remplis d'« images de vertu » à l'intérieur. Une autre lecture, plus sobre, voit dans l'aporie le signe d'une limite propre de la méthode socratique, que Platon s'emploiera plus tard à dépasser dans la ''République'' par l'élévation de l'âme au monde des Idées. Nous reviendrons plus loin sur cette alternative ; il suffit, pour commencer, de ne pas confondre la structure apparente du dialogue avec sa signification philosophique ultime.
=== Le sujet : la σωφροσύνη ===
Le mot grec est intraduisible en un seul terme français : il voisine tantôt avec « tempérance », tantôt avec « modération », « maîtrise de soi » ou « sagesse ». ''Sōphrosunē'' se décompose en ''sōs'' (sain) et ''phrēn'' (pensée) ; elle désigne littéralement la « santé de l'esprit ». Dans l'usage classique, le terme recouvre un faisceau de significations : modération dans l'action et dans les passions, pudeur sexuelle, retenue civique, respect des hiérarchies, conscience des limites humaines. Aristophane l'emploie tour à tour pour désigner le comportement ordonné (''Nuées'', 423), la stabilité civique (''Oiseaux'', 414), la réserve féminine (''Lysistrata'', 411) et le respect des lois (''Ploutos'', 388). Cette polysémie même fait la difficulté, et par là même l'intérêt, du dialogue.
Dans le corpus platonicien, la σωφροσύνη reçoit des traitements variés. Dans le ''Protagoras'' (332a), Socrate la glose comme le fait d'« agir correctement et utilement » et tente de la rapprocher de la sagesse (σοφία). Dans le ''Gorgias'' (506e-507d), elle nomme l'ordre de l'âme dans lequel consiste la vertu humaine. Dans la ''République'' (430d-432b), elle est « accord » (''homonoia'') entre ceux qui commandent et ceux qui obéissent, harmonie des cités comme des âmes. Les ''Lois'' (696b-697c) la poseront comme condition préalable de la justice. Le ''Charmide'' précède et prépare ces analyses en s'attachant d'abord à la question d'essence : qu'est-ce donc que cette vertu ?
Le sujet est politiquement chargé. Dans l'Athènes du cinquième siècle finissant, « gouverner avec σωφροσύνη » est presque un mot d'ordre oligarchique. Thucydide rapporte qu'à la fin de la guerre, Pisandre demandait devant l'Assemblée que l'on « gouverne avec plus de σωφροσύνη » et qu'on « confie les magistratures à un plus petit nombre » (8.53.3). Les milieux aristocratiques spartophiles s'en réclament contre la ''polypragmosynē'' démocratique. Le choix de Critias (futur chef des Trente) et de Charmide (futur membre des Dix du Pirée) comme interlocuteurs principaux confère ainsi à l'enquête une coloration politique que le lecteur moderne ne doit pas sous-estimer.
=== Les personnages ===
Socrate, qui narre tout le dialogue à un auditeur anonyme, rentre du front de Potidée. Le contexte historique précis est cependant controversé. La critique récente hésite entre deux identifications de la bataille mentionnée en 153b. L'hypothèse classique renvoie à la bataille de 432 devant Potidée, à laquelle Socrate participa et au cours de laquelle il sauva la vie d'Alcibiade (''Banquet'' 220d-e) ; mais, comme le note L.-A. Dorion dans son introduction à la traduction GF Flammarion, cette hypothèse est problématique, notamment parce que l'armée athénienne ne fut pas démantelée après la bataille de 432. Selon plusieurs commentateurs récents (Luckhurst 1934, McAvoy 1996, Planeaux 1999), il s'agirait plutôt de la bataille de mai 429 aux environs de Spartôlos, où les Athéniens essuyèrent une lourde défaite (Thucydide II, 79) ; cette hypothèse est compatible avec le retour à Athènes que le ''Charmide'' présuppose. La date dramatique du dialogue se situerait donc vers 429, soit quelque vingt-six ans avant la tyrannie des Trente (404-403). Ce que le lecteur, en tout état de cause, sait par avance, c'est la catastrophe que l'histoire réserve à deux des trois interlocuteurs.
Charmide, fils de Glaucon, est un adolescent à la beauté proverbiale, cousin et pupille de Critias, oncle maternel de Platon. Le ''Banquet'' (222b), situé en 415, le range parmi les anciens jeunes amis de Socrate qui s'en sont éloignés. Il périra en 403 à la bataille de Munychie, dans les rangs des oligarques.
Critias, fils de Callaischros (vers 460-403), est au moment de la scène un homme mûr. Poète et polymathe, familier d'Alcibiade, il entretient des sympathies spartiates. Les fragments conservés de son œuvre (DK 88 B6-7) attestent qu'il a théorisé la σωφροσύνη : une élégie loue la modération spartiate dans la boisson, y associe la « Santé, voisine de la Sainteté » et personnifie la Σωφροσύνη comme une déesse. Il retient par ailleurs la maxime attribuée au Spartiate Chilon, « rien de trop », et la rapproche d'une autre inscription delphique. Le choix de Critias comme interlocuteur principal dans le ''Charmide'' n'est donc pas ironique au sens où il serait aberrant : il est légitime qu'un homme qui a érigé la σωφροσύνη en idéal personnel et civique vienne débattre de sa définition. L'ironie, réelle, tient plutôt au contraste entre l'ambition théorique du personnage et la catastrophe politique que l'histoire lui réservera.
Critias fut en 404 l'un des chefs du régime oligarchique imposé par Sparte après la défaite athénienne : la tyrannie dite « des Trente », qui fit exécuter sans jugement près de mille cinq cents citoyens et chassa vers le Pirée plus de cinq mille autres (Isocrate 7, 67 ; pseudo-Aristote, ''Constitution d'Athènes'' 35, 4). Il mourut lui-même à la bataille de Munychie, aux côtés de son jeune pupille. La tradition postérieure, relayée par Xénophon (''Mémorables'' 1, 2, 12 ; ''Helléniques'' 2, 4, 19), en a fait le plus féroce des Trente. Il convient toutefois de ne pas réduire le personnage à une caricature noire, comme l'ont souligné Tuozzo et Tsouna : c'est dans les tensions du portrait, dans ses clairs-obscurs, que se joue l'interprétation platonicienne. Dans le ''Timée'' (20a) et dans le ''Critias'', Platon lui prêtera d'ailleurs un rôle positif et savant.
Chéréphon, enfin, est le familier enthousiaste de Socrate, présenté comme un ''manikos'' (153b), terme que l'on peut rendre par « exalté ». On sait par l{{'}}''Apologie'' (21a) que c'est Chéréphon qui interrogea la Pythie et reçut l'oracle déclarant qu'aucun homme n'était plus sage que Socrate : sa présence dès l'ouverture inscrit donc discrètement Delphes à l'horizon du texte.
=== Méthode et enjeux ===
Toute définition proposée sera réfutée. Mais l'échec des définitions successives n'exclut pas que le dialogue progresse, dans la mesure où chaque réfutation met en évidence un aspect de la vertu que la formule antérieure avait laissé échapper. Selon la ''Lettre VII'' (342a-b, 343e), la recherche de l'essence d'une réalité procède à la fois par l'analyse du nom, par la formulation de définitions et par l'examen des « images », c'est-à-dire des incarnations partielles. Le ''Charmide'' met en œuvre ces trois procédés : Charmide et Socrate, par leurs conduites respectives, offrent deux images vivantes de la σωφροσύνη, que les définitions successives viennent éprouver.
L'un des fils interprétatifs les plus probants a été dégagé par l'édition Dorion : l'incantation (''epōidē'') que Socrate apprend aux Thraces et qu'il propose d'administrer à Charmide désigne métaphoriquement l'élenchos, c'est-à-dire la réfutation dialectique. Elenchos et incantation sont rapprochés non par leur forme mais par leurs effets : l'un et l'autre ont pour propriété d'engourdir l'interlocuteur et de le rendre disponible à l'action de celui qui parle, de sorte que Socrate est parfois décrit, chez Platon lui-même, comme un « sorcier » (''Ménon'' 80a-b) ou comme une « raie torpille » (''Ménon'' 80a). Si cette hypothèse herméneutique est recevable, le prologue du ''Charmide'' ne vaut pas simple décor : il énonce déjà métaphoriquement la thèse selon laquelle la sagesse ne peut être produite dans l'âme que par l'exercice de la réfutation dialectique. La fin du dialogue, en consacrant Socrate comme dispensateur de ce « charme », confirmerait cette lecture.
== I. Le prologue (153a à 159a) ==
=== 1. Le retour de Potidée (153a-c) ===
« J'étais arrivé la veille au soir de l'armée de Potidée, et je m'empressai, après une si longue absence, de revoir les lieux que j'avais coutume de fréquenter. » Ainsi s'ouvre le récit. Socrate parle à la première personne à un auditeur muet, procédé qu'on retrouve dans le ''Lysis'', le ''Parménide'', la ''République'' et le ''Théétète''. Chéréphon, à peine Socrate est-il entré dans la palestre de Tauréas, s'enquiert des pertes : « l'engagement a été très rude et il y a péri beaucoup d'hommes de notre connaissance ». Socrate répond laconiquement : « le rapport est assez juste ». Il accepte ensuite de s'asseoir auprès de Critias.
Cette ouverture apparemment anecdotique mérite attention. Socrate, Athénien par excellence, n'a quitté sa cité que contraint par ses obligations militaires ; il rentre du front, où il vient d'assister à un combat sanglant, et se montre prêt à philosopher sans dramatisation. Cette placidité est déjà l'un des indices dramatiques de la σωφροσύνη que le dialogue s'apprête à interroger : Tsouna a bien noté que Socrate, à la différence du « manique » Chéréphon, paraît maître de lui-même, sans pour autant afficher d'héroïsme. La mention de la bataille inscrit cependant la scène sous un horizon plus grave que ne le laisserait penser son ton poli : le siège de Potidée fut, dans l'un ou l'autre de ses deux épisodes, un épisode meurtrier de la guerre du Péloponnèse.
Deux détails topographiques méritent mention. La palestre de Tauréas se trouve « en face du temple de Basilè ». L'identification de cette divinité n'est pas assurée. Plusieurs hypothèses ont été proposées : pour Witte (1970, p. 40-42), Basilè serait Perséphone, reine des Enfers, identifiée sur la base d'une inscription attique de 418 et du caractère chthonien supposé du sanctuaire ; pour Shapiro (1986), thèse que suit l'édition Dorion, Basilè serait la personnification de l'ancienne royauté (''basileia'') athénienne ; pour Rotondaro (2000), le temple de Basilè serait lié au soin de l'âme, par opposition à la palestre tournée vers le soin du corps. Tsouna, prudente, note que « l'identité de Basilè ne peut être inférée avec certitude », tout en penchant pour Perséphone. Il s'ensuit que les lectures qui font du temple de Basilè le signe d'une tonalité chthonienne et eschatologique de l'ensemble du dialogue reposent sur une identification discutée : elles relèvent de la conjecture herméneutique plus que du fait textuel.
L'autre détail significatif est moins incertain. Dans les premières lignes, le terme ''psukhē'' (âme) apparaît avec une fréquence que L.-A. Dorion a relevée : sept occurrences sur onze dans l'ensemble du dialogue se concentrent dans le prologue. Cette insistance est structurelle : le prologue établit un lien entre la sagesse et l'âme, lien que Critias, plus tard, oubliera en substituant à ''psukhē'' le terme plus intellectualiste de ''dianoia'' (pensée). L'ouverture dessine ainsi, sans le thématiser, le clivage qui départagera Socrate et Critias.
=== 2. L'entrée de Charmide et l'épreuve érotique (153d-155e) ===
Socrate s'enquiert auprès de Critias de l'état de la philosophie à Athènes et des jeunes gens qui s'y distinguent par la beauté ou par l'esprit. La double question n'est pas fortuite : elle signale que la qualité intellectuelle de la jeunesse mesure la santé spirituelle de la cité. Critias annonce l'arrivée imminente de son cousin Charmide : « celui qui paraîtra tout à l'heure sera bientôt réputé le plus beau » (''kallistos'', 154a). Charmide entre, escorté d'une bande d'admirateurs, et toute la palestre se tait.
Socrate se décrit d'abord comme une « mesure sans valeur » (''leukē stathmē''), une « règle blanche » en matière de beauté : presque tous les jeunes gens de cet âge lui paraissent beaux. La vue de Charmide modifie ce régime. Même les enfants, note-t-il, sont saisis. Et quand Critias fait approcher son cousin sous prétexte de le présenter au médecin, Socrate confesse son trouble : apercevant « ce qu'il y avait sous le manteau » (155d-e), il n'est plus « maître de lui-même », il « brûle », il se sent « comme une bête sauvage ». La tempête érotique est à son comble.
Il résiste pourtant. Là où les autres hommes se bousculent sur les bancs pour se rapprocher de l'adolescent, où l'un d'eux tombe même à la renverse, Socrate se ressaisit. On peut y lire, sans prétendre que Platon ait voulu ici dessiner un tableau continu, une préfiguration du mythe du ''Phèdre'' (253c-254e) : le cocher de l'âme conduit ses deux chevaux, l'un noble, l'autre sans frein, et c'est son redressement qui lui permet, apercevant « le visage du bien-aimé », d'être « porté par la réminiscence vers la nature même de la beauté » et de la voir « assise à côté de la Sagesse sur son trône vénérable ». Qu'il y ait analogie de structure ne signifie pas qu'il faille projeter ici la doctrine développée dans le ''Phèdre'' ; l'analogie, prudente, sert seulement à faire voir que la maîtrise érotique socratique est un fait dramatique signifiant.
Plus fondamentalement, le passage illustre ceci : avant que la σωφροσύνη ne soit thématisée comme objet de définition, elle est exemplifiée dans le héros. Socrate tient bon à la guerre et tient bon devant le bien-aimé. Cette exemplification n'est pas sans ambivalence. La maîtrise socratique peut se confondre avec de la froideur, voire avec du mépris pour ce qui émeut ordinairement les hommes. Alcibiade en fera le reproche dans le ''Banquet'' (215-222). Et dans l'ouverture même du ''Charmide'', une inquiétude discrète affleure : Socrate accepte de se prêter à une ruse, à un mensonge thérapeutique sur le mal de tête. Est-ce la conduite d'un sage ? La question orientera la suite du dialogue.
=== 3. Le stratagème du mal de tête (155b-156d) ===
Critias, complice, présente Socrate comme un guérisseur capable de soigner le mal de tête dont souffre Charmide le matin. Socrate accepte le rôle. Il prétend détenir un remède composé d'une certaine feuille et d'une incantation (''epōidē''), mais précise aussitôt que la feuille seule, sans l'incantation, ne guérit rien.
Pourquoi Socrate consent-il à ce mensonge thérapeutique ? La ''République'' (389c) fournit un principe : le mensonge est utile aux hommes sous forme de remède, à condition d'être réservé au médecin. Pour conduire autrui vers le bien, la ruse est parfois nécessaire, car le but lointain, la sagesse, a moins d'attrait immédiat que la séduction d'un soulagement physique. Nul ne peut désirer ce qu'il ne connaît pas. Le mensonge de Socrate est donc pédagogique : il parle à Charmide le seul langage que celui-ci puisse entendre, pour le conduire insensiblement au soin de l'âme. On pourra préférer, avec d'autres commentateurs, ne pas forcer la clef du « pieux mensonge » et voir plutôt dans le stratagème une ruse sociale : la consultation médicale est le cadre discret qui permet à Socrate d'aborder philosophiquement un jeune homme entouré d'admirateurs. Les deux lectures ne sont pas exclusives.
De quoi souffre Charmide ? D'un mal de tête matinal et chronique. Drew Hyland a suggéré qu'il pourrait s'agir d'une « gueule de bois » due à des excès nocturnes. L'hypothèse est possible mais spéculative, et peu compatible avec la réputation de réserve attachée au personnage. Plus sobrement, on peut observer que la métaphore du mal de tête et de son remède joue avec l'une des acceptions courantes du mot σωφροσύνη : « avoir bon sens », « être sain d'esprit ». Charmide souffre de la tête, et son remède sera la sagesse. La mise en scène dramatique est ainsi étroitement liée au jeu de mots sur la vertu.
=== 4. L'incantation thrace et la doctrine de Zalmoxis (156d-157c) ===
Voici le cœur du prologue. L'incantation, précise Socrate, il l'a apprise d'un médecin thrace, disciple de Zalmoxis, dieu honoré chez les Gètes. Le médecin thrace enseignait que les médecins grecs ont raison de dire qu'il ne faut pas soigner les yeux sans soigner la tête, ni la tête sans soigner le corps entier. Mais, ajoutait-il, Zalmoxis va plus loin : on ne peut soigner le corps sans soigner l'âme. « Et c'est pourquoi la plupart des maladies échappent aux médecins grecs : ils ignorent le tout dont il faut s'occuper, et le tout allant mal, il est impossible que la partie se porte bien ». L'âme est la source du bien et du mal pour le corps et pour l'homme. C'est elle qu'il faut soigner d'abord. Or, dit le Thrace, « on soigne l'âme par des incantations, et ces incantations sont les beaux discours (''hoi logoi hoi kaloi''). Ils font germer dans les âmes la sagesse (σωφροσύνη) ; et une fois qu'elle y est établie, il est facile de procurer la santé à la tête et au reste du corps ».
Ce développement, qu'on prendrait à tort pour une digression pittoresque, énonce plusieurs des thèses directrices du dialogue.
En premier lieu, la σωφροσύνη est identifiée à la santé de l'âme. Cette équivalence traverse la pensée grecque depuis Héraclite, chez qui on lit que « tous les hommes ont en partage de se connaître eux-mêmes et d'être ''sōphrones'' » (DK 22 B116 = D30 LM). Elle constitue, avec l'éloge traditionnel de l{{'}}''aidōs'', la toile de fond que les définitions ultérieures ne cesseront de solliciter.
En deuxième lieu, la philosophie est présentée comme une médecine. Les « beaux discours » sont le remède. L.-A. Dorion défend l'idée que l'incantation (''epōidē'') du ''Charmide'' fonctionne comme une désignation métaphorique de l'élenchos, c'est-à-dire de la réfutation dialectique. L'argument n'est pas arbitraire : il repose sur plusieurs convergences textuelles. D'une part, l'incantation socratique agit sur l'âme par la parole, comme la réfutation dialectique ; d'autre part, Socrate est comparé ailleurs par Platon lui-même à un sorcier et à une raie torpille qui engourdit son interlocuteur (''Ménon'' 80a-b), termes qui relèvent du même champ lexical que l'incantation thrace ; enfin, dans la scène finale (175e-176b), Charmide accepte de se soumettre quotidiennement à ce « charme » socratique, ce qui n'a guère de sens s'il s'agit d'une simple formule magique mais prend tout son sens si l'incantation désigne l'épreuve dialectique continue. Si l'on admet cette équivalence, le prologue énonce déjà métaphoriquement la thèse qui gouverne le dialogue entier : la sagesse ne se produit dans l'âme que par le travail de la réfutation. La scène finale ne fait alors que confirmer le prologue. On peut rapprocher cette lecture de ce que le ''Gorgias'' (464b-466a) dira bientôt : la médecine de l'âme est la véritable politique, par opposition à la rhétorique sophistique qui se contente de flatter.
En troisième lieu, le principe holistique du médecin thrace (le tout commande la partie) ouvre la polémique qui traversera tout le dialogue : celle de la subordination entre les savoirs spécialisés et un savoir englobant. Lorsque Critias définira plus loin la σωφροσύνη comme « science des sciences », il développera à sa manière cette intuition. On remarquera cependant que l'allégorie thrace n'est pas sans équivoque : si le corps est « la partie » et l'âme « le tout », dans quel sens l'âme est-elle le tout ? N'est-ce pas plutôt l'homme entier, âme et corps, qui constitue le tout ? L'indétermination, voulue ou non, pointe une difficulté qui ne sera jamais complètement résolue.
En quatrième lieu, la référence à Zalmoxis inscrit le soin de l'âme dans un horizon religieux. Hérodote (IV, 94-96) rapporte que les Gètes pratiquaient un culte de Zalmoxis associé à la croyance en l'immortalité de l'âme, et que les initiés étaient dits ''athanatizontes'', « ceux qui se rendent immortels ». On peut en déduire, avec certains commentateurs, que Platon suggère par là une portée eschatologique du soin de l'âme : soigner l'âme ne serait pas seulement viser le bien-être de cette vie, mais préparer l'âme à sa condition au-delà. Cette lecture n'est cependant pas explicitement soutenue par le texte. Elle se greffe sur l'analogie thrace sans que Socrate en thématise ici la dimension eschatologique. Il faut donc l'entendre comme une hypothèse herméneutique, laquelle trouve ses appuis davantage dans le ''Phédon'' (78a, où Socrate mentionne les « médecins-magiciens thraces » et les incantations comme remèdes à la peur de la mort) que dans le ''Charmide'' lui-même.
En cinquième lieu, Socrate insiste sur le serment qu'il a prêté au Thrace : ne jamais administrer le remède pour la tête sans avoir d'abord traité l'âme par l'incantation. Ce serment a une fonction dialectique précise. Il garantit à Socrate la maîtrise du dispositif : il ne « guérira » Charmide qu'à condition que celui-ci accepte d'abord de « soumettre son âme » à la philosophie. La consultation médicale est ainsi convertie en entretien dialectique.
En dernier lieu, la localisation thrace n'est sans doute pas arbitraire. La Thrace fonctionne chez Platon comme lieu emblématique d'une sagesse venue des confins, tournée vers les mystères (cf. encore ''Phédon'' 78a). Que Socrate rentre de Potidée, c'est-à-dire de Thrace, porteur d'une telle incantation, suggère que la campagne militaire a été en même temps, pour lui, un apprentissage philosophique, au moins métaphorique.
=== 5. Éloge de Charmide et première mise à l'épreuve (157d-159a) ===
Critias répond que Charmide n'a pas besoin qu'on lui inculque la σωφροσύνη, puisqu'il la possède déjà au plus haut point. Il passe, à Athènes, pour le plus ''sōphrōn'' des jeunes gens, tout en étant le plus beau. Socrate abonde : la noblesse de lignage de Charmide (par son père, famille de Dropidès, l'ami de Solon ; par sa mère, famille de Pyrilampe, liée à Périclès) laisse attendre, au jugement du discours aristocratique traditionnel, une qualité d'âme correspondante. Il attire cependant subtilement l'attention (154d-e, 158a) sur le fait que la beauté extérieure et la noblesse ne garantissent pas, à elles seules, que l'âme soit telle qu'elle doit être.
La proposition de Socrate d'examiner ensemble le cas de Charmide est d'abord accueillie avec un sourire imperceptible mais révélateur : Charmide rougit (158c). Ce rougissement est un signe de pudeur (''aidōs''), c'est-à-dire précisément de l'un des traits traditionnellement associés à la σωφροσύνη. La vertu est, avant d'être dite, visible dans le corps même de l'adolescent. Socrate le note : « il m'a paru plus beau que jamais ». Il y a là une beauté morale (''kallion'') superposée à la beauté physique.
Socrate demande alors à Charmide s'il possède la σωφροσύνη. Le jeune homme est pris dans une difficulté plus sociale encore que philosophique : s'il répond oui, il se fera taxer de présomption ; s'il répond non, il contredira ses admirateurs, et en particulier Critias, ce qui serait insolent. Il ne peut donc répondre. L'incapacité même est éloquente : Charmide ignore ce qu'il est, et il mesure d'abord les implications sociales de sa réponse avant d'en mesurer la portée intellectuelle. La σωφροσύνη qu'on lui prête se dérobe dès qu'on tente de la lui faire dire. Socrate fournit alors la procédure qui va orienter toute la discussion : « tu dois savoir, mieux que personne, si cette vertu habite en toi ; tu peux donc, en tournant ton regard vers toi-même, nous dire ce qu'elle t'apparaît être » (158e-159a). Cette procédure (''eis seauton apoblepsas'', « tourner le regard vers soi-même ») préfigure l'injonction delphique que Critias reprendra dans la cinquième définition.
== II. Les trois définitions de Charmide (159b à 162b) ==
Charmide propose successivement trois définitions : tranquillité, pudeur, faire ses propres affaires. Chacune révèle un aspect distinct de la σωφροσύνη traditionnelle. La première porte sur la manière extérieure d'agir ; la deuxième, sur le ressort intérieur de cette manière ; la troisième, sur le contenu moral et civique de l'action. Ensemble, elles décrivent la phénoménologie de la σωφροσύνη telle que la culture grecque classique la peint. Ensemble aussi, elles se révèlent incapables de saisir ce qui, dans cette vertu, est proprement normatif.
=== 1. Première définition : une sorte de tranquillité (159b à 160d) ===
Pressé par Socrate, Charmide répond, avec quelque hésitation, que la σωφροσύνη consiste « à faire toutes choses avec ordre et tranquillité : marcher dans les rues, discuter, et ainsi de tout le reste » ; en un mot, « une sorte d'état de tranquillité » (''hēsuchiotēs tis'', 159b3).
Le terme ''hēsuchia'' désigne le calme posé, la lenteur mesurée, le comportement sans précipitation. Xénophon décrit en ces termes la σωφροσύνη spartiate : « marcher dans la rue en gardant les mains près du corps, aller en silence, ne pas regarder partout » (''Constitution des Lacédémoniens'' 3, 4). Aristophane, dans les ''Nuées'' (962-984), loue les jeunes gens qui prennent soin de ne pas attirer l'attention sur leur beauté. La ''hēsuchia'' est aussi, chez Thucydide (3, 82, 4), l'opposé politique de la témérité ; elle caractérise l'aristocrate qui ne se mêle pas des affaires ni ne brigue le pouvoir. C'est la posture corporelle et sociale de l'homme bien né : silencieux, posé, retenu. Pindare la personnifie (''Pythique'' 8) comme la « bienveillante Hésychia », opposée à la violence de l'hubris.
Charmide lui-même, par sa manière d'entrer dans la palestre (retenu, distingué, à l'opposé de ses compagnons bruyants), incarne cette définition. Il décrit donc, sans en prendre conscience, sa propre manière d'être, ou plutôt l'image qu'on lui a donnée de lui-même et qu'il n'a pas examinée. La rapidité avec laquelle il formule et accepte la définition est déjà symptomatique. On notera toutefois la prudence du ''tis'' : la σωφροσύνη serait « une sorte » de tranquillité, ce qui pourrait laisser place à d'autres tranquillités moins dignes de ce nom.
La réfutation socratique est virtuose, presque sophistique. Elle se déroule en deux temps.
S'agissant des activités du corps, Socrate interroge : la σωφροσύνη est-elle une belle chose (''kalon'') ? Oui. Or, dans l'écriture, la lecture, le jeu de la cithare, la lutte, les sauts et toutes les activités corporelles, la vitesse et la vivacité sont plus belles que la lenteur. Il s'ensuit que, pour ces activités, la tranquillité n'est pas la σωφροσύνη.
S'agissant des activités de l'âme, même transposition : apprendre avec facilité est plus beau qu'apprendre péniblement ; apprendre avec facilité, c'est apprendre vite ; donc la vitesse est belle. Le même raisonnement vaut pour le rappel des souvenirs, la compréhension d'un discours, la recherche, la délibération.
Conclusion : la σωφροσύνη ne saurait être la tranquillité, puisque le contraire de la tranquillité est souvent plus beau.
La réfutation est brillante, mais elle est logiquement insuffisante à plusieurs titres. D'abord, l'antonyme propre de ''hēsuchia'' n'est pas la vitesse, mais la précipitation (''hybris''). Charmide n'a pas été invité à défendre la lenteur contre la vitesse, mais le calme mesuré contre la précipitation désordonnée. Ensuite, Socrate joue sur plusieurs glissements sémantiques : « facile » n'est pas « rapide », « irrésolution » n'est pas « lenteur ». Enfin, le raisonnement par accumulation d'exemples particuliers ne démontre pas qu'en ''toutes'' circonstances la vivacité soit préférable au calme. Une difficulté supplémentaire tient au ''tis'' : si la σωφροσύνη est ''une sorte'' de tranquillité, c'est-à-dire une espèce particulière, pour la réfuter, Socrate devrait montrer que certains cas de σωφροσύνη ne sont pas des cas de tranquillité ; or il procède en sens inverse.
La faiblesse même de la réfutation porte un enseignement. Charmide, s'il avait possédé la σωφροσύνη qu'il vient de décrire, aurait dû résister au rythme socratique, demander des précisions, discerner les glissements. Il acquiesce au contraire à chaque pas. Il démontre donc, par son comportement dans la discussion, qu'il ne possède pas la tranquillité réfléchie qu'il vient de revendiquer comme définition. La réfutation n'est pas d'abord une critique conceptuelle : elle est un examen éthique de l'interlocuteur.
Plus profondément, l'échec de la première définition tient à ce que Charmide a décrit une propriété phénoménale de certaines actions (le rythme lent), en oubliant la dimension normative qui ferait de cette propriété une vertu. La tranquillité n'est vertueuse que lorsqu'elle est orientée vers une fin bonne. Socrate, dans son résumé même (160b), réintroduit subtilement cette dimension normative en rappelant l'agir « avec ordre » (''kosmiōs'') que Charmide avait mentionné mais aussitôt oublié.
=== 2. Deuxième définition : la pudeur (160d à 161b) ===
Invité par Socrate à porter de nouveau son regard sur lui-même, Charmide propose : « la σωφροσύνη est ce qui fait qu'un homme a le sentiment de la honte et de la retenue ; elle est la même chose que la pudeur (''aidōs'') » (160e3-5).
La définition est plus profonde que la précédente. Là où la tranquillité décrivait un comportement extérieur, la pudeur en désigne le ressort intérieur. Charmide a cette fois réellement regardé en lui-même : il vient d'être l'objet d'une interrogation socialement délicate, il a rougi, et il sait que c'est précisément cette rougeur qui a paru, aux yeux de Socrate, manifester la σωφροσύνη. L'interlocuteur s'est donc rapproché de la procédure que Socrate lui avait prescrite.
La notion d{{'}}''aidōs'' occupe une place centrale dans l'éthique grecque traditionnelle. Elle recouvre à la fois la honte par anticipation (peur de faire ce qui disqualifierait aux yeux d'autrui) et le respect qu'on porte aux autres et à soi-même. E. R. Dodds a montré qu'elle constituait, dans la culture homérique, le principal ressort de la conscience morale. Bernard Williams a affiné l'analyse : l{{'}}''aidōs'' se distingue de la honte moderne par son ancrage dans un « regard imaginé » que l'agent a intériorisé. Dans le discours d'Archidamos chez Thucydide (1, 84), « nous sommes guerriers parce que la σωφροσύνη contient la pudeur comme son principal constituant, et la pudeur contient la bravoure ». Le mythe de Protagoras (322b-323a) présente Zeus distribuant ''aidōs'' et ''dikē'' à tous les hommes comme conditions de la vie en cité, et glisse de ''aidōs'' à σωφροσύνη avec si peu de transition qu'Aristote (''Éthique à Eudème'' III, 7, 1234a32-33) pourra noter que certains les identifient. Une inscription funéraire attique, à peu près contemporaine de la mort de Socrate, présente même la déesse Σωφροσύνη comme la fille de la « magnanime » Αἰδώς (IG II² 6859).
En définissant la σωφροσύνη comme pudeur, Charmide touche le cœur psychologique de la vertu telle que sa culture la pense. Il s'inscrit dans la lignée de l'éthique aristocratique dont il est le produit : sa modération n'est pas crainte des conséquences extérieures, mais attention au regard d'autrui. C'est l'éthique de l'élite athénienne traditionnelle, que Critias représente politiquement.
La réfutation socratique est brève mais subtile (160e-161b). Elle procède en trois pas. D'abord, la σωφροσύνη est belle (''kalon''), Charmide l'a admis. Elle rend ''bons'' ceux qu'elle habite, et rien ne peut rendre bon ceux qu'elle rendrait mauvais ; donc la σωφροσύνη est à la fois belle et ''bonne'' (''agathon''). Ensuite, Homère (''Odyssée'' XVII, 347) ne dit-il pas que « la pudeur n'est pas bonne pour l'homme dans le besoin » ? Charmide acquiesce : il croit Homère. L{{'}}''aidōs'' n'est donc pas toujours bonne ; elle est tantôt bonne, tantôt mauvaise. Or la σωφροσύνη est simplement bonne. Donc la σωφροσύνη n'est pas la pudeur.
La démarche de Socrate introduit une distinction essentielle : la σωφροσύνη n'est pas seulement belle (au sens du ''kalon'' : noble, admirable, convenable), elle est bonne, normativement bonne, partout et toujours. Cette exigence gouvernera toute la suite de la discussion. On remarquera le principe implicite, qui réapparaîtra plus loin : « le semblable produit le semblable », une bonne chose ne peut produire du mauvais.
Socrate réfute par ailleurs Charmide par son propre ressort. C'est par respect pour Homère, autorité poétique incontestable, que Charmide cède. Résister serait contraire à la pudeur. Charmide capitule donc par ''aidōs'' devant la réfutation de l{{'}}''aidōs'' : l'exemplification de sa définition se confond avec sa réfutation. Car un Charmide pleinement ''sōphrōn'', au sens où Socrate l'entend, aurait résisté à Homère pour peu qu'il eût eu de bonnes raisons de le faire. Il aurait remarqué que la phrase est prononcée par Eumée et reprise par Télémaque, qu'elle vise le besoin extrême du mendiant, que son sens contextuel est autre. Socrate, dans d'autres dialogues (''République'' III), manifestera lui-même des réserves à l'égard de l'autorité homérique en matière morale. L'argument est donc intentionnellement faible, et son acceptation par Charmide est une deuxième illustration du déficit de σωφροσύνη.
La citation d'Homère délivre par ailleurs un enseignement proprement socratique. Dans le contexte de l{{'}}''Odyssée'', Eumée recommande à Ulysse déguisé de ne pas se laisser retenir par la honte d'aller mendier chez les prétendants : il faut manger d'abord. Mais lu dans l'horizon du dialogue, le vers homérique prend un autre sens. Charmide, dans le besoin (d'apprendre, de s'examiner, d'accepter son ignorance), ne doit pas se laisser retenir par la honte. La vraie pudeur devrait porter non sur le fait de paraître ignorant, mais sur le fait de l'être sans le savoir. Ce qui est honteux, c'est de refuser d'apprendre (''Hippias mineur'' 372c : « j'ai une qualité qui me sauve : je n'ai pas honte d'apprendre »). Le renversement, implicite, est typique de l'ironie platonicienne.
=== 3. Troisième définition : faire ses propres affaires (161b à 162b) ===
Deux fois réfuté, Charmide se souvient avoir entendu quelqu'un dire que la σωφροσύνη est « faire ses propres affaires » (''to ta heautou prattein'', 161b6). Il tait l'attribution, mais Socrate, avec une malice transparente, soupçonne Critias. Socrate approuve toutefois la posture méthodologique : « il ne faut pas se demander qui a dit une chose, mais si elle est bien dite » (161c). Il reconnaît cependant que la formule tient d'un véritable « énigme » (''ainigma'', 161c9) qui demande exégèse.
La formule est chargée politiquement. Au cinquième siècle, « faire ses propres affaires » appartient au vocabulaire du camp oligarchique, aristocratique, spartophile. Chez Thucydide (1, 68, 1), les Spartiates sont ceux qui « ne s'occupent pas des affaires extérieures » et « font leurs propres affaires ». Dans l{{'}}''Électre'' de Sophocle (678), Clytemnestre ordonne à Électre de « faire ses propres affaires » et de cesser de pleurer son frère. Dans la ''Constitution des Lacédémoniens'' de Xénophon (7, 2), Lycurgue interdit aux citoyens les activités mercantiles, leur assignant comme « seule affaire propre » le service de la liberté civique. Le concept prend sens contre le terme adverse, ''polypragmosynē'', qui désigne, dans la polémique antidémocratique, la tendance athénienne à se mêler de tout. Entre la ''polypragmosynē'' et l{{'}}''apragmosynē'' (l'abstention pure), la formule « faire ses propres affaires » désigne une voie médiane : faire quelque chose, mais non les affaires des autres.
Cette troisième définition marque donc une rupture avec les précédentes : elle sort de la description phénoménologique pour entrer dans une détermination normative et sociale. Être ''sōphrōn'', c'est tenir sa place, remplir son rôle, ne pas empiéter sur celui des autres. Elle énonce, à un niveau préphilosophique, ce qui sera dans la ''République'' (433a-b) la définition de la ''justice'' : « faire chacun ses propres affaires ». On peut y voir, avec D. Hyland, l'indication que σωφροσύνη et δικαιοσύνη sont les deux faces d'une même vertu. La lecture reste toutefois hypothétique : la formule pourrait aussi bien n'être qu'une maxime traditionnelle reprise par Charmide sans en tirer de conséquence doctrinale.
La réfutation socratique (161d-162a) est un ''reductio ad absurdum''. Suivant la formule, le grammatiste, qui enseigne à écrire des noms (les siens comme ceux des autres), ne ferait pas « ses propres affaires » et ne serait donc pas ''sōphrōn''. Il en va de même pour tout artisan : le tisserand qui fait des vêtements pour autrui, le cordonnier qui fait des chaussures pour autrui, le médecin qui soigne les autres. Si l'on prend la formule au pied de la lettre, nulle division du travail ne peut subsister.
Charmide ne sait plus quoi répondre. Socrate l'en tire : peut-être Charmide ne comprend-il pas lui-même ce que veut dire la formule qu'il avance. Critias, qui ne peut supporter de voir sa propre formule maltraitée, entre alors en scène.
La mise en scène pédagogique est efficace. La « récitation » de Charmide, d'une pensée qu'il n'a pas faite sienne, est à l'image de « l'acteur qui récite mal les vers d'autrui » (162c-d). Charmide est resté étranger à la formule qu'il a prononcée. Il ne la possède pas, parce qu'il ne l'a pas examinée. Toute la transition, avec la comparaison de l'acteur et du poète, prépare la suite du dialogue, où Critias devra, lui, défendre ses propres thèses.
== III. La reprise par Critias : quatrième définition (162b à 164d) ==
Critias, piqué au vif, prend la relève. Il refuse la lecture littérale donnée par Socrate. La formule, soutient-il, ne dit pas que faire une chose pour soi ou pour autrui est décisif, mais qu'il faut faire les choses ''propres'' à soi, c'est-à-dire convenables, bienfaisantes. Sa défense s'appuie sur une distinction linguistique entre ''prattein'' (agir, faire au sens moral) et ''poiein'' (fabriquer, produire au sens technique).
=== 1. La distinction ''prattein''/''poiein'' ===
Critias invoque Hésiode (''Travaux et Jours'' 311 : « le travail n'est point honteux ; la honte est dans l'inaction ») pour soutenir qu'il existe des activités honteuses (simples ''poiēseis'') et d'autres qui sont nobles (véritables ''praxeis''). Le cordonnier qui vend du poisson salé (exemple que Critias choisit dans un mouvement de dédain aristocratique) « fabrique » mais ne « travaille » pas au sens noble. Seules les activités belles et utiles (''kalon kai ōphelimon'') méritent le nom de ''prattein''. Les œuvres propres à soi (''oikeia'') sont les bonnes œuvres ; les œuvres étrangères (''allotria''), les mauvaises.
La manœuvre est caractéristique de Critias : il s'adosse à une autorité poétique, décrète une distinction terminologique et attire le sens du mot vers la position qu'il veut défendre. Socrate ne manque pas de relever le procédé. Il rappelle que Prodicos, sophiste célèbre pour ses distinctions verbales, faisait « mille distinctions de ce genre » (''Charmide'' 163d ; cf. ''Protagoras'' 337a, 340a). Il propose alors une mise au point méthodologique décisive : « peu importe le sens fixé par convention, l'important est de voir ce que les mots désignent, quelle pensée ils traduisent, quelle réalité ils donnent à saisir » (163d). Le philosophe, à la différence du sophiste, cherche sous le mot l'idée et sous l'idée le réel. On peut lire, avec Tuckey, dans la technique argumentative de Critias un « goût sophistique pour les antithèses », qui trahit sa formation.
=== 2. Quatrième définition : faire le bien ===
Critias tire de ses distinctions la reformulation suivante : la σωφροσύνη est « faire ses propres affaires », entendu au sens où l'on fait les bonnes affaires, les affaires convenables et bienfaisantes. Autrement dit, la σωφροσύνη est « faire le bien » (''ta agatha prattein'', 163e). Socrate formule le même contenu en langage socratique : « faire des choses bonnes et profitables » équivaut à « agir bien » (''eu prattein''), formule qui, en grec, peut signifier aussi bien « bien agir » que « réussir sa vie ».
Socrate accepte provisoirement cette reformulation, tout en y décelant d'emblée une difficulté. Si la σωφροσύνη est « faire le bien », celui qui fait le bien par hasard, sans le savoir, sera ''sōphrōn'' sans le savoir. Le médecin qui soigne son patient peut ignorer si le traitement réussira. Cette objection met en lumière un point décisif : la σωφροσύνη, si elle est vertu authentique, doit inclure la ''connaissance'' du bien qu'elle fait. Si la vertu consistait à faire le bien sans qu'il faille le savoir, la σωφροσύνη serait indépendante de la conscience qu'on en a, ce qui contredit l'intuition selon laquelle la vertu engage la responsabilité du sujet.
Critias concède, et reformule une dernière fois : il faut connaître ce que l'on fait. L'enjeu devient épistémique. C'est précisément à partir de cette concession que Socrate peut conduire Critias vers la formule qui dominera la seconde partie du dialogue : la σωφροσύνη est une forme de savoir, et plus précisément un savoir portant sur soi-même.
== IV. Cinquième définition : se connaître soi-même (164d à 165b) ==
=== 1. Le discours de Critias sur l'inscription delphique ===
La discussion ayant montré que la vertu doit inclure la connaissance de ce que l'on fait, Critias reformule sa position. Il propose : la σωφροσύνη est « se connaître soi-même » (''to gignōskein heauton''). Il adosse sa définition à la célèbre inscription du temple d'Apollon à Delphes, Γνῶθι σεαυτόν, et prononce alors le discours le plus ambitieux et le plus étrange de tout le dialogue (164d-165a).
Cette formule, dit Critias, n'est pas une maxime morale parmi d'autres (comparable aux autres inscriptions delphiques : « rien de trop », ou « donne un gage, la ruine suit »). Ces deux-là ne sont que des conseils utiles (''symboulas chrēsimas'', 165a6-7), posés par ceux qui avaient mal compris la première inscription. « Connais-toi toi-même », au contraire, n'est pas un conseil : c'est une ''salutation'' (''prosrhēsis'') du dieu aux pèlerins qui entrent dans son temple. Cette salutation est la bonne, à la différence de la salutation humaine ordinaire « réjouis-toi » (''chaire''). Le dieu ne souhaite pas aux hommes qu'ils « se réjouissent » (vœu superficiel), mais qu'ils « soient sages » (''sōphronein'') : car c'est cela, être sage, que de se connaître soi-même. L'inscription signifie donc, en code, « sois ''sōphrōn'' » dit en guise de bonjour. La σωφροσύνη coïncide avec la connaissance de soi.
Le discours est remarquable. Il installe d'abord un rapport original entre l'homme et le dieu. La salutation est en principe un acte entre égaux, à la différence du conseil, qui suppose une asymétrie. En faisant de « connais-toi toi-même » une salutation, Critias suggère, plus ou moins consciemment, une relative parité entre le dieu et ceux qui entrent dans le temple. Cette audace a conduit certains commentateurs (L. Lampert notamment) à y lire l'ombre de l'athéisme que la tradition doxographique attribue à Critias, rangé avec Prodicos et Diagoras parmi les impies (le fameux fragment de ''Sisyphe'', DK 88 B25, présente les dieux comme une invention d'un homme habile pour contrôler les foules). D'autres lectures, plus nuancées (Tsouna, Tuozzo), observent que rien dans le discours lui-même ne nie l'existence des dieux : Critias suppose au contraire le dieu bienveillant. Ce qui demeure incontestable, c'est l'arrogance intellectuelle du propos : Critias se distingue de la foule des « ordinaires » qui n'ont rien compris, prétend déchiffrer le « langage énigmatique » du dieu, se pose en interprète autorisé. Cette prétention est ironiquement tout le contraire de la σωφροσύνη qu'il veut définir : elle est l'équivalent exact de la présomption que Socrate, dans l{{'}}''Apologie'' (21a-23b), récuse en revendiquant son ignorance.
La formule « connais-toi toi-même » est cependant authentiquement socratique. Dans l{{'}}''Apologie'' (21d), c'est par la reconnaissance de son ignorance que Socrate illustre la maxime delphique. Dans le ''Phèdre'' (230a), Socrate dit qu'il n'a pas le temps d'étudier les mythes, car il est occupé à s'examiner lui-même selon l'injonction delphique. Le ''Premier Alcibiade'' (127-134) développe par ailleurs longuement la thèse selon laquelle se connaître soi-même, c'est connaître son âme comme principe de l'homme. On notera toutefois que l'authenticité du ''Premier Alcibiade'' est disputée : contestée par Schleiermacher au début du dix-neuvième siècle, la critique moderne est partagée, certains (Pradeau dans sa traduction GF) le tenant pour authentique et caractéristique de la période moyenne, d'autres le classant parmi les dialogues d'école. Par prudence, on se contentera donc ici de renvoyer à l{{'}}''Apologie'' et au ''Phèdre'', dont l'authenticité n'est pas contestée, quitte à mentionner le ''Premier Alcibiade'' comme attestation indirecte.
La formule se laisse entendre en deux sens qui ouvrent une alternative. En un sens positif, se connaître soi-même, c'est connaître ce qu'est l'homme, sa nature propre, ce qui lui convient, et donc la vertu. Cette lecture rapproche la σωφροσύνη d'une ''sophia'' totalisante. En un sens négatif et critique, se connaître soi-même, c'est avoir conscience de sa propre ignorance. Telle est l'interprétation socratique la plus constante. Tuckey a défendu avec force cette seconde interprétation, en soulignant que la formule ''gnōthi seauton'' est, dans la tradition socratique, indissociable de l'aveu d'ignorance.
=== 2. Un moment de pause ===
Le passage est marqué par une certaine détente dramatique. Critias, jusque-là agressif et sûr de lui, paraît momentanément purgé de son arrogance (ou feint de l'être). Il accepte de reprendre l'enquête sur des bases nouvelles. Socrate y reconnaît l'énoncé d'une vérité essentielle, dont l'inspiration émane d'une source transcendante, en l'occurrence le dieu de Delphes.
Il faut cependant éviter ici d'interpréter trop vite cette scène comme le « moment crucial » d'un rituel d'initiation, sur le modèle proposé par Goldschmidt. L'hypothèse est séduisante, mais elle projette sur le texte une structure qui n'y est pas explicite. Plus sobrement, on se contentera de dire que l'énonciation de la formule delphique marque un tournant argumentatif, sans préjuger de sa signification symbolique plus large. Car Critias va aussitôt reformuler « se connaître soi-même » en termes de science réflexive, et non en termes de conscience critique. L'ambiguïté de la formule permet ce glissement, et c'est de là que naît la difficulté qui occupera toute la fin du dialogue.
== V. Sixième définition : la science d'elle-même et des autres sciences (165b à 166c) ==
=== 1. Du « connais-toi toi-même » à la « science de la science » ===
Socrate reprend la discussion. Si la σωφροσύνη est une forme de connaissance (''gignōskein ti''), elle est aussi une science (''epistēmē tis''), et toute science a un objet (165c4-6). La σωφροσύνη est-elle donc une science ? De quoi est-elle la science ? Quelle est son « œuvre » (''ergon'') ?
Les comparaisons que pose Socrate sont parlantes. La médecine est science de la santé, et son œuvre est la santé. L'architecture est science des constructions, et son œuvre est l'habitation. Il en va de même pour toutes les ''technai'' : chacune a un objet propre et produit une œuvre distincte du savoir lui-même. Si la σωφροσύνη est une science, elle devrait à son tour avoir un objet et produire une œuvre.
Critias répond d'abord que toutes les sciences ne se ressemblent pas : les mathématiques (le calcul, la géométrie) ne produisent aucune œuvre distincte d'elles-mêmes, et ce sont pourtant des sciences. Socrate concède la remarque, mais insiste : quel est alors l'objet de la σωφροσύνη ? Le calcul porte sur le pair et l'impair ; la géométrie, sur les grandeurs ; si la σωφροσύνη est une science, elle doit pareillement porter sur un objet déterminé.
C'est ici que Critias formule la sixième définition, la plus audacieuse du dialogue : la σωφροσύνη est ''la science d'elle-même et des autres sciences'' (ἐπιστήμη ἑαυτῆς καὶ τῶν ἄλλων ἐπιστημῶν, 166e). Elle est la seule, parmi toutes les sciences, à porter non sur un objet extérieur, mais sur le savoir lui-même. Socrate ajoute : « elle serait donc aussi science de l'ignorance » (''anepistēmosunē''), puisqu'il faut, pour connaître ce qui est su, savoir aussi ce qui ne l'est pas. Critias acquiesce. Socrate tire alors la conséquence : le sage, et lui seul, se connaîtra lui-même ; il saura ce qu'il sait et ce qu'il ne sait pas ; il pourra de même discerner chez autrui le savoir réel du savoir prétendu.
Le glissement par rapport à la définition précédente est subtil et profondément problématique. Au premier moment (« connais-toi toi-même »), l'objet semblait être la personne elle-même ; au second (« science d'elle-même et des autres sciences »), l'objet devient le savoir. La dimension personnelle et existentielle de la connaissance de soi s'efface au profit d'une métaconnaissance formelle. Le « soi » cède la place aux « sciences ». T. M. Tuozzo souligne que Socrate ne laissera pas Critias revenir en arrière : la réduction du « soi » au « savoir » est une pente, non un malentendu ponctuel. Sur la manière dont il faut comprendre ce glissement, les commentateurs divergent notablement. Pohlenz y voit une erreur flagrante que Platon signalerait pour la critiquer, tandis que Susemihl estime au contraire que « science d'elle-même » est simplement la reformulation technique de « connaissance de soi ». Selon Schirlitz, les deux notions s'impliquent. Selon von Arnim, elles marquent la confusion de Critias. Il n'est pas nécessaire ici de trancher. Ce qui importe, c'est que cette reformulation ouvre un examen conceptuel serré auquel Socrate va procéder.
=== 2. Trois lectures possibles de la « science des sciences » ===
La définition de Critias est d'une hauteur conceptuelle considérable. On y a vu, chez les commentateurs modernes, l'anticipation de la « subjectivité autonome » moderne (Oehler), de l'épistémologie critique kantienne, de l'ontologie aristotélicienne de l'être en tant qu'être, ou d'une encyclopédie du savoir. Sans préjuger de la portée que Platon lui donne, on peut proposer, pour la science des sciences, au moins trois lectures.
Dans une première lecture, elle serait science d'un objet englobant : elle porterait sur un être suprême qui inclurait ou fonderait tous les objets des autres sciences. On aurait affaire à une métaphysique ou à une théologie.
Dans une deuxième lecture, elle serait la science synthétique qui organise et totalise les autres savoirs : projet positiviste d'une science des sciences, ou encyclopédie hégélienne.
Dans une troisième lecture, enfin, elle serait une science formelle, dépourvue de contenu positif : une science critique des principes, des méthodes et des limites de tout savoir.
Critias ne précise pas laquelle de ces lectures il retient, et cette ambiguïté est peut-être la faille fondamentale de sa définition. Socrate avait attiré son attention sur la mention « science de l'ignorance », qui aurait pu orienter la discussion vers une lecture critique. Mais Critias, emporté par la grandeur de sa formule, l'entend plutôt comme une science totalisante. Tuckey a rapproché cette pente du « goût sophistique pour les antithèses » que le Critias historique partageait avec ses contemporains. L'attitude philosophique juste, celle qu'incarne Socrate, serait tout au contraire de reconnaître que la sagesse humaine est d'abord reconnaissance des limites du savoir, et non prétention à le totaliser.
== VI. Examen critique : la science de la science est-elle possible ? (166c à 169c) ==
Cette partie du dialogue, souvent tenue pour la plus aride, constitue en réalité l'un des exercices d'analyse conceptuelle les plus rigoureux de l'œuvre platonicienne. Socrate y soumet la définition de Critias à deux examens successifs : l'un ontologique (est-elle possible ?), l'autre pragmatique (serait-elle utile ?).
=== 1. Le problème de la réflexivité (167a à 168e) ===
Socrate propose : supposons que la σωφροσύνη soit la science qui a pour objet la science elle-même ; est-il seulement possible qu'une science se prenne elle-même pour objet ? Y a-t-il, dans les autres cas, des exemples de relations qui se portent sur elles-mêmes ?
L'examen est méthodique. Les entités que Socrate passe en revue sont toutes des « relatifs » (πρός τι), c'est-à-dire des réalités qui ne se définissent que par leur rapport à autre chose.
S'agissant des sensations : existe-t-il une vue qui verrait elle-même et les autres vues, mais qui ne verrait aucune couleur ? Or la vue est définie par son rapport à la couleur (objet propre), et si une « vue » ne voyait pas la couleur, elle ne serait pas une vue. De même, une audition qui n'entendrait aucun son ne serait pas une audition. Une capacité réflexive totale, qui ne porterait ''que'' sur elle-même, est absurde, car elle vide le relatif de son contenu propre.
S'agissant des désirs et des affects : un désir qui désirerait non aucun plaisir mais uniquement des désirs, une volonté qui ne voudrait aucun bien mais seulement d'autres volontés, un amour qui aimerait non le beau mais uniquement d'autres amours, une crainte qui ne craindrait aucun danger mais seulement des craintes ? L'absurdité est manifeste : chaque affect se définit par son objet caractéristique.
S'agissant des grandeurs relatives : existe-t-il un « plus grand » qui ne serait pas plus grand qu'un plus petit, mais plus grand que lui-même ? Pour être plus grand, il faut être plus grand qu'un plus petit ; or si ce « plus grand » est plus grand que lui-même, il est en même temps plus grand et plus petit que lui-même. Le relatif qui se prendrait lui-même pour objet hériterait simultanément des deux termes et tomberait dans la contradiction.
Dans les cas examinés, la réflexivité stricte (où un relatif ne porterait que sur soi) est soit absurde, soit contradictoire. Il faut distinguer deux types de réflexivité : la réflexivité totale (la science ne porterait que sur elle-même) et la réflexivité partielle (la science porterait sur soi ''et'' sur autre chose). La première semble inconcevable ; la seconde est plus prometteuse, mais exige une analyse serrée. Claude Chrétien a noté, à juste titre, que la conscience humaine présente précisément cette propriété étrange de pouvoir se retourner vers elle-même en même temps qu'elle se tourne vers autre chose. Le ''Charmide'' ne thématise pas cette distinction, mais il en ouvre le questionnement.
Socrate laisse la question ouverte pour l{{'}}''epistēmē''. Peut-être la connaissance, contrairement aux sensations et aux grandeurs, admet-elle la réflexivité ? Il reconnaît qu'une telle analyse exige un « grand homme » (169a) et « dépasse les limites du dialogue ». Il renvoie la résolution à un travail ultérieur : ce sera la « longue voie » de la ''République'' (435d). On peut voir dans cet ajournement l'aveu que la catégorialité rigoureuse déborde le dialogue vivant.
Pour relancer la discussion, Socrate propose une concession provisoire : supposons que la science de la science soit possible. Peut-elle procurer au sage ce qu'on attend de la σωφροσύνη, c'est-à-dire savoir ce qu'il sait et ne sait pas ?
=== 2. La contagion de l'aporie (169a à c) ===
À ce moment, Critias à son tour cède à l'embarras. Socrate l'observe avec humour : « voyant mes hésitations, Critias fit comme ceux qui voient des gens leur bâiller sous le nez et en font autant ; il me parut céder à la contagion, en proie au même embarras que moi » (169c). Le détail n'est pas cosmétique. Il renvoie au texte même qui, trois lignes plus haut, décrit Critias comme « honteux devant les assistants » et « refusant de concéder son incapacité à trancher ce qu'on demandait » (169c-d). Il parle alors « sans rien dire de clair », pour masquer sa gêne. Il y a ici, à un moment précis et localisable, une coïncidence remarquable entre l'argument et le drame. Critias, que la tradition aristocratique définit comme ''sōphrōn'', manifeste un défaut typique d{{'}}''aidōs'' mal orientée : la honte d'être pris en défaut l'empêche d'avouer son ignorance. C'est exactement le symptôme que la σωφροσύνη authentique devrait corriger : l'attachement à l'honneur immédiat au détriment de la recherche de la vérité. La dialectique socratique, en somme, produit et donne à voir, dans la conduite même de l'interlocuteur, le défaut de la vertu qu'il prétend théoriser. Ce passage confirme ainsi ''en acte'' la thèse que le prologue avait énoncée ''par métaphore'' : la σωφροσύνη se révèle et se produit par l'épreuve dialectique. Critias, qui reconnaît ne pas savoir mais refuse de l'admettre, est à cet instant précis l'image en creux de ce qui lui manque.
== VII. La question de l'utilité : le rêve socratique (169c à 175a) ==
=== 1. L'hypothèse et le problème de l'impuissance formelle ===
Socrate propose, pour faire avancer la discussion : admettons que la science de la science soit possible et qu'elle permette au sage de savoir ce qu'il sait et ne sait pas. Serait-elle pour autant ''utile'' ? Telle est la seconde question. Si la première était ontologique, celle-ci est pratique. L'enjeu est grave : Socrate lui-même, dans l{{'}}''Apologie'' (38a), déclare qu'une vie non réfléchie ne vaut pas la peine d'être vécue.
La démonstration socratique commence par une difficulté (170a-171c). La science de la science, si elle existe, ne peut que distinguer ce qui est science de ce qui ne l'est pas. Elle ne peut connaître les ''contenus'' des sciences particulières. Savoir ce qu'est la santé relève de la médecine, non de la science de la science. Savoir ce qui est juste relève de la politique. Si un homme possède la science de la science, il saura qu'il a une science, mais il ne saura pas ''quoi''. Il peut donc avoir les connaissances réflexives sans avoir les connaissances de premier ordre. Il est à même de distinguer formellement « savoir » de « non-savoir », mais il ne peut distinguer ''la science juste'' de ''la fausse science'' sans posséder lui-même la science de l'objet dont il est question. Le sage, dans cette configuration, est impuissant. La sagesse ainsi définie est formelle, vide, réduite à une sorte de métacognition sans substance.
Comme le note avec finesse L.-A. Dorion dans son introduction, la réfutation de 171c porte non pas sur la capacité de l'élenchos à éprouver le savoir moral et à produire la connaissance de soi, mais sur l'aptitude d'une science des sciences, dépourvue d'objet propre, à mettre à l'épreuve des connaissances particulières qui relèvent de savoirs particuliers. Ce point est important pour l'interprétation d'ensemble du dialogue : ce qui est réfuté, ce n'est pas l'ambition socratique de soumettre les autres savoirs à la question, mais la prétention d'une science purement réflexive à se substituer aux savoirs spécialisés.
Socrate sort personnellement de cette impasse par son renoncement à toute prétention dogmatique. Il n'affirme posséder aucune science et se contente d'interroger les prétendus savants sur la cohérence de leur discours. L'attitude socratique du questionnement n'est possible qu'à partir d'un tel renoncement.
=== 2. Le rêve d'omniscience (173a à 174b) ===
Socrate introduit cependant une hypothèse contrefactuelle. « Écoute donc mon songe, qu'il soit venu par la porte de corne ou par la porte d'ivoire » (173a), dit-il, faisant allusion à l{{'}}''Odyssée'' XIX, 562-567, où Pénélope évoque les deux portes des songes (ceux qui passent par l'ivoire sont trompeurs, ceux qui passent par la corne sont véridiques). L'allusion est significative : le rêve qui va suivre n'est pas présenté comme vérité certaine ; il est une vision dont on ignore si elle ouvre sur le vrai ou sur le trompeur. Socrate introduit donc son tableau avec une réserve herméneutique qui, rétroactivement, colore tout le développement d'une ambiguïté constitutive.
Dans ce rêve, Socrate explore ce que serait un monde où chacun ne ferait que ce qu'il sait faire, où la σωφροσύνη règnerait partout. Les imposteurs y seraient démasqués ; les médecins seraient de vrais médecins, les capitaines de vrais capitaines, les devins de vrais devins. Chacun serait à sa place, chacun agirait selon la science. On y vivrait plus sainement, préservés des dangers de la mer et de la guerre, ne traitant qu'avec de vrais professionnels. « Toutes choses seraient parfaitement réalisées du point de vue technique » (173b-c). Même la divination, cette « méta-science » prérationnelle, serait intégrée au régime scientifique. Le monde serait ordonné, transparent, maîtrisé.
On rapproche volontiers cette utopie de la cité idéale de la ''République''. Le rapprochement est légitime mais doit être nuancé : dans le ''Charmide'', la cité utopique n'est présentée que comme une hypothèse dans le cadre d'une interrogation sur la σωφροσύνη, et non comme un projet politique assumé. Socrate lui-même interrompt aussitôt le rêve : « qu'agir selon la science nous conduise à bien agir et à connaître le bonheur, cela, mon cher Critias, nous ne pouvons pas encore le savoir » (173d).
Le point est philosophiquement essentiel : ''agir selon la science ne suffit pas à bien agir''. Un monde parfaitement rationnel, maîtrisé, n'est pas nécessairement un monde heureux. Il peut être efficace et pourtant aveugle au bien. Le savoir n'est pas ''ipso facto'' valeur. B. Witte a souligné, dans une lecture forte, que cette correction socratique fonctionne comme une réfutation interne de l'utopie. Ce qui s'ouvrait comme un idéal se retourne en objection contre la définition de la σωφροσύνη comme science de la science. Car si un tel ordre n'engendrait pas le bonheur, la science qui le produit n'est pas la sagesse que nous cherchons.
Plus encore, un monde totalement maîtrisé a quelque chose d'inhumain : la liberté, donc la possibilité morale, y disparaîtraient. Sur ce point, on peut entendre la fin du dialogue comme un rappel de la condition humaine : la ''sophia'' est réservée à la divinité, l'homme est fait pour vivre dans les entre-deux. La σωφροσύνη est une vertu humaine, qui doit connaître sa place entre l'ignorance et le savoir, entre l'asservissement aux passions et la perfection divine.
=== 3. La science du bien et du mal (174a-c) ===
Quelle science, demande alors Socrate, assure le bonheur ? Est-ce la tactique ? la médecine ? le calcul ? À chaque fois, Critias répond par la négative. Socrate élimine méthodiquement toutes les sciences particulières (cordonnerie, travail du bois, divination, jeu de dés). Aucune, prise isolément, ne peut rendre heureux. Sommé de nommer la science qui rend heureux, Critias concède enfin : c'est « la science du bien et du mal » (ἡ ἐπιστήμη τοῦ ἀγαθοῦ καὶ κακοῦ, 174b).
Le coup de théâtre est considérable. Si c'est la science du bien et du mal qui produit l'utilité et le bonheur, et si la σωφροσύνη est la science de la science (qui n'inclut pas, par hypothèse, la science du bien particulier), alors la σωφροσύνη n'est ''pas'' la science qui nous est utile. Elle est autre chose que la science du bien et du mal. Elle est donc, conclut Socrate, inutile.
La portée de ce passage mérite une lecture prudente. L.-A. Dorion (introduction, p. 69-70) propose ici une interprétation forte qui permet de comprendre l'apparent paradoxe. L'assimilation de la sagesse à la connaissance du bien et du mal, observe-t-il, n'est pas une conclusion inattendue : plusieurs passages antérieurs l'anticipent explicitement. En 156e-157a, Socrate faisait déjà de la σωφροσύνη la source de tout bien dans le corps et dans l'homme ; en 160e-161a, il exigeait que la vertu soit toujours bonne ; en 163d-164a, Critias lui-même convenait que la σωφροσύνη est « faire le bien » et suppose la connaissance de ce bien. Ce que la fin du dialogue nomme n'est donc pas un élément extérieur à l'enquête, mais ce qui en formait silencieusement l'enjeu depuis le début. Plus décisif encore, Dorion suggère de distinguer deux conceptions de la « science des sciences » : celle de Critias, qui pense la sagesse comme une science universelle additionnant les savoirs particuliers, et celle que Socrate dessine en creux, un savoir ''architectonique'' qui, sans englober les objets des autres savoirs, fixe à chacun la finalité qu'il doit poursuivre. La connaissance du bien et du mal est architectonique en ce sens précis : elle détermine les fins auxquelles les autres sciences doivent être appliquées, mais elle n'a pas besoin, pour cela, d'être elle-même médecine ou architecture. Le parallèle avec la forme du Bien de la ''République'' (VI, 505a-b) vient naturellement à l'esprit, encore que le ''Charmide'' n'engage pas ici de discussion ontologique explicite.
Cette lecture donne une cohérence à l'ensemble du dialogue sans faire basculer le ''Charmide'' dans le simple rôle de propédeutique à la ''République''. Elle maintient que Socrate pointe, à la fin du dialogue, une conception substantielle de la sagesse (la connaissance du bien et du mal), tout en refusant de l'identifier formellement à la σωφροσύνη, car Critias s'obstine à définir celle-ci comme science des sciences, ce que Socrate ne peut accepter sans contradiction. Le texte maintient donc simultanément deux choses : que la connaissance du bien et du mal serait la bonne candidate, et que Critias ne parvient pas à en tirer la conséquence. B. Witte, dans sa lecture allemande influente, fait du ''Charmide'' une « propédeutique négative » désignant la science du bien comme science-limite ; la proposition est féconde, mais elle minore peut-être ce que le ''Charmide'' accomplit par lui-même. Le dialogue ne se contente pas de désigner un manque : il indique positivement que la σωφροσύνη véritable ne peut être une science-reine formelle, qu'elle doit se subordonner à une science substantielle du bien. Cela suffit à rendre compte de son échec apparent sans en faire une simple étape préparatoire.
== VIII. L'aporie finale et la scène de conclusion (175a à 176d) ==
=== 1. Le bilan de Socrate (175a à d) ===
Socrate dresse un bilan apparemment désastreux. Nous avons, dit-il, admis sans preuve plusieurs choses dans le raisonnement. Nous avons même concédé ce qui contredit la raison. Et malgré toutes ces complaisances, nous n'avons pas su trouver la nature de la σωφροσύνη. « Notre enquête n'a pas été davantage capable de trouver la vérité ; mais elle s'est si bien moquée de celle-ci que ce que nous avons jusqu'ici proposé comme définitions de la sagesse, à force de conventions et de combines, nous a montré celle-ci, provocation extrême, comme inutile » (175a-b).
C'est l'aporie explicite. Elle n'est pourtant pas un simple échec. Socrate n'en est pas trop affligé. Le bilan contient une correction manifeste : si la σωφροσύνη ''telle que nous l'avons définie'' s'est révélée inutile, cela ne signifie pas que la sagesse véritable le soit. Cela signifie que nous n'avons pas su la définir correctement.
Chaque définition rejetée a en effet indirectement révélé un aspect de la σωφροσύνη véritable. La tranquillité pose l'ordre (en dépit de l'échec de sa déclinaison physique). La pudeur pose le ressort intérieur (en dépit de son hétéronomie). « Faire ses propres affaires » pose l'adéquation à soi et la convenance. « Faire le bien » pose la normativité. La connaissance de soi pose la réflexivité. La science de la science pose la hauteur de la prétention philosophique. Au terme, la science du bien et du mal est nommée, sans être identifiée à la σωφροσύνη, mais comme sa condition éthique profonde.
=== 2. La scène finale : Charmide accepte l'incantation (175d à 176d) ===
Le dialogue ne s'achève pas sur l'aporie conceptuelle. Il revient à la scène dramatique initiale. Socrate, feignant d'être très affligé de son échec, s'adresse à Charmide. Il n'est pas trop chagriné pour lui-même, mais il l'est pour Charmide, « si, avec une telle beauté et l'esprit le plus sage, tu ne tires aucun fruit de cette sagesse ». Il s'irrite davantage d'avoir appris avec tant de soin la formule magique thrace, si elle n'a aucune valeur pratique. Non, conclut-il, « j'aime mieux penser que je suis un piètre chercheur, que la sagesse est un grand bien, et que, si tu la possèdes, tu es un heureux mortel ».
Charmide répond : « par Zeus, je ne sais pas, Socrate, si je la possède ou non. Comment en effet connaîtrais-je ce dont vous-mêmes n'êtes pas capables de déterminer la nature ? ». Il ajoute, touchant dans sa modestie : « pour ma part, je ne te crois guère, et je suis sûr que j'ai besoin de ta formule magique. Je ne vois aucun inconvénient, de mon côté, à me soumettre tous les jours à ton charme, jusqu'à ce que tu dises que c'est assez ».
Critias renchérit : « fais-le, Charmide. Ce sera pour moi la preuve que tu es sage, si tu te soumets au charme de Socrate et si tu ne le quittes plus d'un pas ». Charmide acquiesce : « je le suivrai et ne le quitterai pas, car j'agirais mal si je ne t'obéissais pas, à toi mon tuteur ». Et, quand Socrate plaisante sur le caractère contraignant de cette volonté, Charmide conclut : « alors ne résiste pas, toi non plus ».
La scène est remarquable. Dramatiquement, elle se déploie sur trois plans qu'il importe de distinguer.
Sur le plan pédagogique, la soumission de Charmide à Socrate témoigne du succès relatif de l'initiation dialectique. Le jeune homme reconnaît qu'il a besoin de la philosophie et accepte de suivre Socrate. L'échec conceptuel se convertit en succès pédagogique : Charmide, qui se flattait implicitement de la sagesse au début, reconnaît à la fin qu'il en a besoin. Telle est la direction que prend, dans le texte, l'élenchos socratique. Si l'on admet, avec l'édition Dorion, que l'incantation désigne métaphoriquement la réfutation dialectique, alors la scène finale confirme la thèse du prologue : la σωφροσύνη se produit dans l'âme par le travail dialectique, et la meilleure preuve en est le consentement final de Charmide à recevoir ce travail.
Sur le plan dramatique, cette lumière est indissociable d'une ombre. Le lecteur sait que cet adolescent, aujourd'hui docilement soumis à Critias, suivra son tuteur non dans l'école de Socrate, mais dans la tyrannie des Trente. Il mourra en 403 avec Critias. La promesse de « ne plus quitter Socrate d'un pas » ne sera pas tenue. La formule finale de Critias (« si tu te soumets au charme de Socrate et si tu ne le quittes plus d'un pas, ce sera la preuve que tu es sage ») énonce ainsi une dernière définition implicite : être sage, c'est tenir bon dans la compagnie de la philosophie. Mais ni Critias ni Charmide n'y parviendront. L'ironie tragique reste toutefois sous la surface du texte : c'est le lecteur, informé par l'histoire, qui l'y projette.
Sur le plan verbal, enfin, il faut noter l'emploi par Charmide du mot ''charisme'' (''charizesthai'') pour désigner ce à quoi il se soumet. Le terme désigne étymologiquement un don gratuit, une grâce, et fait écho à la tradition religieuse. Dans le ''Banquet'' de Xénophon (4, 14-15), Socrate se dit lui-même capable d'« ensorcellement » (''katepad-''). La clôture du ''Charmide'' confirme ainsi, dans le vocabulaire même, l'identification du discours socratique au chant incantatoire du prologue.
=== 3. L'ironie et la promesse ===
La scène finale accomplit ainsi trois choses. Elle confirme l'échec conceptuel : on n'a pas défini la σωφροσύνη. Elle révèle un succès pratique : l'élenchos opère, Charmide se tourne vers la philosophie. Elle porte, pour le lecteur averti, l'ombre historique : le succès pratique sera, dans les faits, révoqué.
Cette tension entre trois plans (conceptuel, pratique, historique) constitue une des singularités du ''Charmide''. Elle suggère que la philosophie, comme pur exercice de définition, ne suffit pas : elle doit engager l'existence, sans que cet engagement garantisse la fidélité. Peut-être est-ce en ce sens qu'on peut voir dans le ''Charmide'' une inquiétude qui annonce le programme de la ''République'' : ancrer la σωφροσύνη individuelle dans une cité, une ''paideia'' et une ontologie qui lui donnent un fondement stable.
== IX. Interprétation d'ensemble : la σωφροσύνη selon le ''Charmide'' ==
Au terme de cette lecture suivie, on peut tenter de ressaisir ce que le dialogue, malgré son aporie explicite, suggère sur la nature de la σωφροσύνη. La présentation qui suit est une synthèse interprétative, et doit être reçue comme telle.
En premier lieu, la σωφροσύνη est une vertu, mais non une valeur ascétique extérieure à l'individu. Elle situe le bien dans l'accomplissement de l'être propre et associe la vertu et le bonheur, le beau et le bon, le bien et l'utile. Elle est, en ce sens, profondément eudémoniste.
En deuxième lieu, cet accomplissement n'est pas abandon à soi, mais « maîtrise de soi » (''enkrateia'', ''République'' 430e). Toutefois, poussée jusqu'au bout, la maîtrise peut rendre l'humain inhumain : Socrate dans le prologue (presque trop maître de lui) et l'utopie du rêve (un monde totalement rationnel, donc invivable) en sont les deux figures. La sagesse exclut ainsi tant le schéma de la maîtrise que celui de la soumission. Platon lui-même, dans la ''République'' (430e-431a), qualifie la notion de maîtrise de soi de « ridicule » et de contradictoire : comment un même sujet peut-il être celui qui maîtrise et celui qui est maîtrisé ? La σωφροσύνη doit se penser autrement qu'en termes de domination.
En troisième lieu, cette vertu est connaissance, selon l'intellectualisme socratique (il suffit de savoir pour vouloir, et de vouloir pour faire). Elle tend à la vérité en la sachant inaccessible. Elle tend à l'unité en se sachant vouée à l'éparpillement. L'échec du ''Charmide'' à définir la sagesse comme science n'est pas l'échec de l'identification vertu-connaissance, mais l'échec d'une certaine conception de la connaissance : trop formelle, trop prétentieuse, trop coupée du bien.
En quatrième lieu, elle se développe surtout comme conscience critique de soi. Il ne s'agit pas d'introspection narcissique. La conscience de soi platonicienne est ouverture aux autres (comme le montre le dialogue) et ouverture au monde. Être conscient de soi, c'est se situer à sa place dans le tout.
En cinquième lieu, elle est vertu de l'entre-deux. Ni la bête ni le dieu n'ont besoin de la σωφροσύνη. La σωφροσύνη est proprement la vertu humaine, celle qui convient à un être capable de vouloir autrement qu'il ne sait.
On voit alors comment le ''Charmide'' articule la figure de Socrate à l'argument conceptuel. Socrate incarne l'attitude d'équilibre. Il désire et maîtrise son désir. Il sait des choses et surtout sait son ignorance. Il mène des discussions sans prétendre à aucune science propre. La sagesse se montre en lui plus qu'elle ne se dit dans les définitions. Le héros du dialogue est ainsi à la fois le locuteur principal, le narrateur et l'image exemplaire de ce qu'il cherche à définir. Cette coïncidence donne au ''Charmide'' une singularité remarquable dans le corpus.
== X. Actualité et portée philosophique ==
''Avertissement liminaire.'' Les remarques qui suivent sont de nature interprétative. Elles ne prétendent pas restituer le sens littéral du ''Charmide'', mais proposer des résonances entre le dialogue et certaines questions qui se posent encore aujourd'hui. Le lecteur voudra bien tenir ces prolongements pour ce qu'ils sont : des pistes offertes, non des conclusions tirées du texte.
=== 1. Une éthique du connaître ===
Le ''Charmide'' propose, en creux, une philosophie de la connaissance qui n'est pas une théorie abstraite du savoir, mais ce qu'on pourrait appeler une ''éthique du connaître''. Savoir ce que l'on sait et ne pas savoir ce que l'on ne sait pas, c'est-à-dire ne pas feindre de savoir ce qu'on ignore : cette « science de l'ignorance », dont Critias admet le principe sans en voir les conséquences, est proche du « je sais que je ne sais rien » de l{{'}}''Apologie''. Elle fait de la σωφροσύνη une disposition à la fois intellectuelle et morale. Il faut du courage pour reconnaître son ignorance ; de la pudeur pour ne pas feindre la science ; de l'humilité pour accepter que cette reconnaissance soit non un point d'arrivée, mais un point de départ.
=== 2. Une critique du rêve de maîtrise totale ===
Le rêve socratique de 173-174 peut résonner, prudemment, avec certaines critiques modernes des projets de rationalité totalisante. Mais ce rapprochement doit rester à sa place de prolongement, non être pris pour le sens du texte : Platon ne vise ni le positivisme, ni le technocratisme, ni la gouvernance algorithmique. Tout au plus peut-on observer que le dialogue met en garde, sur le mode hypothétique, contre un monde où tout serait accompli selon la science, et suggère qu'un tel monde ne serait pas nécessairement bon. L'interruption que Socrate oppose à sa propre vision (« qu'agir selon la science nous conduise à bien agir et à connaître le bonheur, cela, mon cher Critias, nous ne pouvons pas encore le savoir », 173d) est, à elle seule, le point qui autorise ces prolongements : la science sans le bien ne suffit pas. Platon paraît d'ailleurs reconnaître, dans le miroir de ce rêve, une ombre qui pèse aussi sur sa propre utopie (''République'').
=== 3. Une pédagogie par le dialogue ===
Sur le plan pédagogique, le ''Charmide'' fournit un modèle. Il montre comment Socrate conduit un jeune homme (Charmide), d'abord flatté et rassuré dans sa vertu supposée, à reconnaître qu'il ne sait pas ce qu'est cette vertu ; et comment il conduit un homme plus mûr (Critias), sûr de sa science, à éprouver lui-même la « contagion » de l'aporie. La pédagogie philosophique consiste moins à transmettre une doctrine qu'à éveiller le mouvement du questionnement. La figure de l'incantation thrace symbolise cette pédagogie, dont on retrouvera l'équivalent dans la maïeutique du ''Théétète''.
=== 4. L'ambivalence politique ===
Le choix des interlocuteurs (Critias, futur chef des Trente, et Charmide, son jeune pupille qui mourra à ses côtés) n'est certainement pas ornemental : il situe l'enquête sur la σωφροσύνη dans l'horizon de l'histoire athénienne connue du lecteur platonicien. Au-delà de ce constat, on peut proposer prudemment quelques prolongements. La formule « faire ses propres affaires », dans la bouche d'une élite qui s'arrogera le droit de « purger » la cité, change de sens. Une σωφροσύνη qui n'est pas adossée à la connaissance du bien risque, dès lors, de servir d'alibi à l'exclusion. C'est là un prolongement interprétatif, et non une affirmation explicite du texte : Platon ne tire pas cette conséquence ouvertement dans le ''Charmide''. Il reste toutefois significatif que le dialogue ne fasse réapparaître la connaissance du bien qu'au moment où l'aporie conduite par Critias se révèle sans issue. On entrevoit ainsi, en creux, la ligne de fuite que les ''Lois'' et la ''République'' développeront : la σωφροσύνη requiert d'être articulée à une ''paideia'' et à une ontologie du bien.
=== 5. La dimension existentielle ===
Enfin, on peut lire le ''Charmide'' comme une méditation sur le soin de l'âme (''epimeleia heautou''). L'appui textuel est ici plus net : le prologue thématise explicitement l'âme (sept occurrences de ''psukhē'' sur onze, selon le relevé de Dorion), et l'allégorie du médecin thrace fait du soin de l'âme la condition du soin du corps. On peut donc reconstruire un programme sans forcer le texte : on ne saurait soigner le corps sans soigner l'âme, ni soigner l'âme sans philosopher, ni philosopher sans s'examiner, ni s'examiner sans reconnaître les limites de sa prétendue sagesse. Le parcours du dialogue conduit Charmide, et le lecteur avec lui, de la satisfaction naïve de la vertu reçue à l'humilité requise pour devenir véritablement ''sōphrōn''. L'aporie, dans cette perspective, n'est pas un échec : elle est l'épreuve par laquelle la philosophie produit son effet.
== Conclusion ==
Le ''Charmide'' est un dialogue court, mais d'une densité rare. Sous la simplicité apparente d'une discussion sur la définition d'une vertu, il articule plusieurs enjeux : philosophique (qu'est-ce que la σωφροσύνη ? qu'est-ce qu'une science réflexive ? qu'est-ce que la connaissance de soi ?), politique (quelle est la vertu du bon gouvernant ? la science totalisante est-elle désirable ?), éthique (quel est le rapport du savoir à la vertu et au bonheur ?), pédagogique (comment conduit-on une âme à la philosophie ?), et existentiel (qu'est-ce que prendre soin de soi ?). Il conduit ces différents niveaux sans les dissocier.
Le lecteur qui referme le texte n'a pas reçu de définition de la σωφροσύνη. Mais il a été conduit, à travers six définitions successivement éprouvées, à comprendre pourquoi aucune ne suffit, et à entrevoir, derrière l'échec, l'esquisse d'une vertu tout humaine, proprement philosophique : équilibre entre savoir et ignorance, maîtrise qui n'est ni froideur ni crispation, adéquation à soi qui est ouverture à l'autre, humilité qui ne renonce pas à la vérité. Socrate incarne cette vertu sans la définir. Le pacte final entre Charmide et lui énonce silencieusement ce que les concepts n'ont pas réussi à dire : la σωφροσύνη se ''pratique'' avant de se ''dire''. Elle se cultive dans l'exercice dialectique et dans la fréquentation de celui qui en est l'image vivante.
On comprend alors la phrase ultime de Critias, qui clôt le dialogue sur une ambiguïté que le lecteur averti ne peut ignorer : « ce sera pour moi la preuve que tu es sage, Charmide, si tu te soumets au charme de Socrate et si tu ne le quittes plus d'un pas ». Cette phrase énonce une définition finale, implicite et pratique, de la σωφροσύνη : être sage, c'est tenir bon dans la compagnie de la philosophie. L'histoire montrera que ni Critias ni Charmide n'y parvinrent. Leur défaillance future, que Platon connaît et que son lecteur devine, donne au dialogue une gravité qu'il ne faudrait ni forcer ni négliger.
== Annexes ==
=== Tableau récapitulatif des six définitions ===
# ''Tranquillité'' (''hēsuchiotēs tis'', 159b) : Charmide. Réfutation par énumération de cas où la vitesse ou la vivacité sont plus belles que la lenteur. Échec dû à l'oubli de la dimension normative.
# ''Pudeur'' (''aidōs'', 160e) : Charmide. Réfutation par citation homérique (''Odyssée'' XVII, 347). La σωφροσύνη est toujours bonne ; la pudeur ne l'est pas ; donc la σωφροσύνη n'est pas la pudeur.
# ''Faire ses propres affaires'' (''to ta heautou prattein'', 161b) : Charmide, empruntant à Critias. Réfutation par ''reductio ad absurdum'' : l'artisan qui fait pour autrui ne serait pas ''sōphrōn''.
# ''Faire le bien'' (''ta agatha prattein'', 163e) : Critias. Reformulation par la distinction ''prattein''/''poiein'' et l'appel à Hésiode. Écartée pour défaut de conscience de ce que l'on fait.
# ''Se connaître soi-même'' (''to gignōskein heauton'', 164d) : Critias, d'après le Γνῶθι σεαυτόν de Delphes interprété comme salutation divine.
# ''Science d'elle-même et des autres sciences'' (''epistēmē heautēs kai tōn allōn epistēmōn'', 166e) : Critias. Double examen, ontologique et pragmatique. Échec au second examen : ce n'est pas elle, mais la « science du bien et du mal » (174b), qui serait véritablement utile.
=== Plan dramatique ===
* Prologue (153a-158e) : retour de Potidée, palestre de Tauréas, arrivée de Charmide, stratagème du mal de tête, médecin thrace et Zalmoxis.
* Trois définitions de Charmide (158e-162b) : tranquillité, pudeur, « faire ses propres affaires ».
* Reprise et quatrième définition par Critias (162b-164d) : distinction ''prattein''/''poiein'', citation d'Hésiode, « faire le bien ».
* Cinquième définition (164d-166c) : se connaître soi-même, la formule delphique.
* Sixième définition et examen critique (166c-175a) : la science de la science, question de sa possibilité, question de son utilité, rêve socratique, mention de la science du bien et du mal.
* Conclusion (175a-176d) : aporie bilan, soumission de Charmide, ironie tragique.
== Orientations bibliographiques ==
''Note sur la présentation.'' Les références sont ordonnées alphabétiquement dans chaque rubrique. Chaque entrée indique successivement le nom, le prénom abrégé, l'année entre parenthèses, le titre en italiques, le lieu de publication et l'éditeur ; les collections figurent entre guillemets, les rééditions et précisions entre crochets. La présente bibliographie est sélective. Pour une recension exhaustive, on consultera les bibliographies platoniciennes de référence : Cherniss, H. (1959-1960), « Plato 1950-1957 », ''Lustrum'' 4-5 ; Brisson, L. (1977, 1983, 1988, 1992), « Platon », ''Lustrum'' 20, 25, 30, 34 ; Brisson, L. et Plin, F. (1999), ''Platon 1990-1995 : bibliographie'', Paris, Vrin.
'''I. Éditions, traductions et commentaires'''
* Burnet, J. (1903), ''Platonis opera'', vol. III, Oxford, Clarendon Press.
* Chambry, É. (1967), ''Platon. Second Alcibiade, Hippias mineur, Premier Alcibiade, Euthyphron, Lachès, Charmide, Lysis, Hippias majeur, Ion'', traduction et notes, Paris, GF-Flammarion [première édition : 1937].
* Cooper, J. M. et Hutchinson, D. S. (éd.) (1997), ''Plato. Complete Works'', Indianapolis, Hackett Publishing Company.
* Croiset, A. (1921), ''Platon. Hippias majeur, Charmide, Lachès, Lysis'', texte et traduction, Paris, Les Belles Lettres [réimpression avec introduction et notes de J.-F. Pradeau, « Classiques en poche » 40, 1999].
* Dorion, L.-A. (2004), ''Platon. Charmide, Lysis'', traduction inédite, introduction et notes, Paris, GF-Flammarion.
* Hazebroucq, M.-F. (1997), ''La Folie humaine et ses remèdes. Platon : Charmide ou de la modération'', traduction et commentaire, Paris, Vrin.
* Robin, L. (1950), ''Platon. Œuvres complètes'', 2 vol., traduction et notes, Paris, Gallimard, « Bibliothèque de la Pléiade ».
* Sprague, R. K. (2018), ''Plato. Charmides'', Indianapolis, Hackett Publishing Company.
'''II. Commentaires monographiques consacrés au dialogue'''
* Chrétien, Cl. (1987), ''Platon. Charmide de la sagesse'', Paris, Hatier, « Profil philosophique » 725.
* Hyland, D. A. (1981), ''The Virtue of Philosophy. An Interpretation of Plato's Charmides'', Athens (Ohio), Ohio University Press.
* Schmid, W. T. (1998), ''Plato's Charmides and the Socratic Ideal of Rationality'', Albany, State University of New York Press.
* Tsouna, V. (2022), ''Plato's Charmides. An Interpretation'', Cambridge, Cambridge University Press.
* Tuckey, T. G. (1968), ''Plato's Charmides'', Amsterdam, Hakkert [première édition : Cambridge, Cambridge University Press, 1951].
* Tuozzo, T. M. (2011), ''Plato's Charmides. Positive Elenchus in a « Socratic » Dialogue'', Cambridge, Cambridge University Press.
* Van der Ben, N. (1985), ''The Charmides of Plato. Problems and Interpretations'', Amsterdam, B. R. Grüner.
* Witte, B. (1970), ''Die Wissenschaft vom Guten und Bösen. Interpretationen zu Platons Charmides'', Berlin, De Gruyter.
* Woolf, R. (2023), ''Plato's Charmides'', Cambridge, Cambridge University Press.
'''III. Études platoniciennes de cadre'''
* Brisson, L. et Robinson, T. M. (éd.) (2000), ''Plato. Euthydemus, Lysis, Charmides'' (Proceedings of the V Symposium Platonicum), Sankt Augustin, Academia Verlag.
* Goldschmidt, V. (1947), ''Les Dialogues de Platon. Structure et méthode dialectique'', Paris, Presses universitaires de France.
* Lampert, L. (2010), ''How Philosophy Became Socratic. A Study of Plato's Protagoras, Charmides, and Republic'', Chicago, University of Chicago Press.
* Méron, É. (1979), ''Les idées morales des interlocuteurs de Socrate dans les dialogues platoniciens de jeunesse'', Paris, Vrin.
* Pradeau, J.-F. (1999), « Introduction », dans Platon, ''Alcibiade'', Paris, GF-Flammarion.
* Robin, L. (1968), ''Platon'', Paris, Presses universitaires de France.
'''IV. Études et articles spécialisés cités'''
* Cairns, D. L. (1993), ''Aidōs. The Psychology and Ethics of Honour and Shame in Ancient Greek Literature'', Oxford, Clarendon Press.
* Dodds, E. R. (1951), ''The Greeks and the Irrational'', Berkeley, University of California Press.
* Iannucci, A. (2002), ''La parola e l'azione. I frammenti simposiali di Crizia'', Bologne, Nautilus.
* Planeaux, C. (1999), « The Date of Bellona's Temple at Rome and the Battle of Potidaea (''Charmides'' 153a-d) », ''Classical Journal'' 94/2, p. 165-183.
* Pohlenz, M. (1913), ''Aus Platons Werdezeit. Philologische Untersuchungen'', Berlin, Weidmann.
* Sedley, D. (2013), « The Atheist Underground », dans V. Harte et M. Lane (éd.), ''Politeia in Greek and Roman Philosophy'', Cambridge, Cambridge University Press, p. 329-348.
* Shapiro, H. A. (1986), « The Attic Deity Basile », ''Zeitschrift für Papyrologie und Epigraphik'' 63, p. 134-136.
* Wellman, R. R. (1964), « The Question Posed at ''Charmides'' 165a-166c », ''Phronesis'' 9, p. 107-113.
* Williams, B. (1993), ''Shame and Necessity'', Berkeley, University of California Press.
dqjda0tzpk9tezm73a7keycgv13sfh8
Pour lire Platon/Bibliographie
0
31168
764611
674224
2026-04-23T05:34:37Z
PandaMystique
119061
764611
wikitext
text/x-wiki
<noinclude>{{sous-pages}}</noinclude>
Cette bibliographie est une bibliographie commentée : les commentaires ont pour but de permettre au lecteur de se faire un avis sur les livres qu'il peut lire sur Platon en fonction de ses besoins. Si les commentaires comportent inévitablement une part de subjectivité, nous aurons toujours à l'esprit qu'il s'agit de dire ce qu'apporte un livre pour la lecture de notre auteur. On ne vise pas à fournir une bibliographie très fournie qui serait inutile et décourageante pour un lecteur débutant.
Commencer par un ouvrage qui regroupe les textes de Platon à l'aide d'un fil conducteur peut donner à comprendre que chaque philosophe traite avant tout d'un problème dont il hérite ou qu'il met en place;
* Louis Guillermit, '''Platon par lui-même,''' choix de textes, Flammarion, 1994 ([http://www.persee.fr/doc/phlou_0035-3841_1995_num_93_4_6963_t1_0619_0000_2 compte-rendu])
* Alexandre Koyré, '''Introduction à la lecture de Platon''', Gallimard, 1962. Un livre simplement écrit et qui est très éclairant.
* '''Une conférence de l'Université Conventionnelle''' en audio peut être aussi à conseiller car elle donne un fil conducteur à l'ensemble de l’œuvre : http://www.univ-conventionnelle.com/lireplaton/La-vie-apres-la-mort-et-la-vie-pendant-la-vie-12-06-14_a46.html
* Brisson, Luc et Francesco Fronterotta, sous la direction de, ''Lire Platon'', Quadrige, Presses Universitaires de France, Paris, 2006
*:Ce livre couvre de nombreux domaines, des influences sur Platon à sa philosophie politique. Les articles sont clairs et directs. Cette diversité de sujets est très utile pour acquérir une bonne représentation générale de la pensée platonicienne. De ce point de vue, c'est une introduction idéale.
*Brisson, Luc et Pradeau, Jean-François, ''Le Vocabulaire de Platon'', Ellipses, 1998
*:Un ouvrage qui permet d'apprendre la pensée de Platon de manière synthétique. Une méthode pour l'utiliser est de lire les notions relatives à un même thème (morale, cosmologie, par exemple). On peut toutefois regretter que les articles ne paraissent pas toujours très bien structurés.
* Goldschmidt, V., ''Les Dialogues de Platon'', PUF, 1935, Paris
* Pradeau, Jean-François (coordonné par), ''Platon : les formes intelligibles'', PUF, Paris, 2001
*:Un recueil d'articles sur la théorie des formes. Certains articles sont très spécialisés et arides, mais toujours clairs et instructifs. Incontournable pour approfondir la théorie fondamentale du platonisme.
* Richard H. Kraut (ed.), ''The Cambridge Companion to Plato'', New York Cambridge (Univ. Press), 1992
* Robin, Léon, ''Platon'', PUF, 1935 (rééd. 1997)
[[Catégorie:Classe 1 - Philosophie et psychologie]]
1ajie8d1t08l3jtc62k2pz7guk3v8mp
764612
764611
2026-04-23T05:35:13Z
PandaMystique
119061
764612
wikitext
text/x-wiki
<noinclude>{{sous-pages}}</noinclude>
Cette bibliographie est une bibliographie commentée : les commentaires ont pour but de permettre au lecteur de se faire un avis sur les livres qu'il peut lire sur Platon en fonction de ses besoins. Si les commentaires comportent inévitablement une part de subjectivité, nous aurons toujours à l'esprit qu'il s'agit de dire ce qu'apporte un livre pour la lecture de notre auteur. On ne vise pas à fournir une bibliographie très fournie qui serait inutile et décourageante pour un lecteur débutant.
Commencer par un ouvrage qui regroupe les textes de Platon à l'aide d'un fil conducteur peut donner à comprendre que chaque philosophe traite avant tout d'un problème dont il hérite ou qu'il met en place;
* Louis Guillermit, '''Platon par lui-même,''' choix de textes, Flammarion, 1994 ([http://www.persee.fr/doc/phlou_0035-3841_1995_num_93_4_6963_t1_0619_0000_2 compte-rendu])
* Brisson, Luc et Francesco Fronterotta, sous la direction de, ''Lire Platon'', Quadrige, Presses Universitaires de France, Paris, 2006
*:Ce livre couvre de nombreux domaines, des influences sur Platon à sa philosophie politique. Les articles sont clairs et directs. Cette diversité de sujets est très utile pour acquérir une bonne représentation générale de la pensée platonicienne. De ce point de vue, c'est une introduction idéale.
*Brisson, Luc et Pradeau, Jean-François, ''Le Vocabulaire de Platon'', Ellipses, 1998
*:Un ouvrage qui permet d'apprendre la pensée de Platon de manière synthétique. Une méthode pour l'utiliser est de lire les notions relatives à un même thème (morale, cosmologie, par exemple). On peut toutefois regretter que les articles ne paraissent pas toujours très bien structurés.
* Goldschmidt, V., ''Les Dialogues de Platon'', PUF, 1935, Paris
* Pradeau, Jean-François (coordonné par), ''Platon : les formes intelligibles'', PUF, Paris, 2001
*:Un recueil d'articles sur la théorie des formes. Certains articles sont très spécialisés et arides, mais toujours clairs et instructifs. Incontournable pour approfondir la théorie fondamentale du platonisme.
* Richard H. Kraut (ed.), ''The Cambridge Companion to Plato'', New York Cambridge (Univ. Press), 1992
* Robin, Léon, ''Platon'', PUF, 1935 (rééd. 1997)
* Alexandre Koyré, '''Introduction à la lecture de Platon''', Gallimard, 1962. Un livre simplement écrit et qui est très éclairant.
[[Catégorie:Classe 1 - Philosophie et psychologie]]
aqv3pi6h3ppl1t09l4vap1898rikmsw
764613
764612
2026-04-23T05:35:24Z
PandaMystique
119061
764613
wikitext
text/x-wiki
<noinclude>{{sous-pages}}</noinclude>
Cette bibliographie est une bibliographie commentée : les commentaires ont pour but de permettre au lecteur de se faire un avis sur les livres qu'il peut lire sur Platon en fonction de ses besoins. Si les commentaires comportent inévitablement une part de subjectivité, nous aurons toujours à l'esprit qu'il s'agit de dire ce qu'apporte un livre pour la lecture de notre auteur. On ne vise pas à fournir une bibliographie très fournie qui serait inutile et décourageante pour un lecteur débutant.
Commencer par un ouvrage qui regroupe les textes de Platon à l'aide d'un fil conducteur peut donner à comprendre que chaque philosophe traite avant tout d'un problème dont il hérite ou qu'il met en place;
* Louis Guillermit, ''Platon par lui-même,'' choix de textes, Flammarion, 1994 ([http://www.persee.fr/doc/phlou_0035-3841_1995_num_93_4_6963_t1_0619_0000_2 compte-rendu])
* Brisson, Luc et Francesco Fronterotta, sous la direction de, ''Lire Platon'', Quadrige, Presses Universitaires de France, Paris, 2006
*:Ce livre couvre de nombreux domaines, des influences sur Platon à sa philosophie politique. Les articles sont clairs et directs. Cette diversité de sujets est très utile pour acquérir une bonne représentation générale de la pensée platonicienne. De ce point de vue, c'est une introduction idéale.
*Brisson, Luc et Pradeau, Jean-François, ''Le Vocabulaire de Platon'', Ellipses, 1998
*:Un ouvrage qui permet d'apprendre la pensée de Platon de manière synthétique. Une méthode pour l'utiliser est de lire les notions relatives à un même thème (morale, cosmologie, par exemple). On peut toutefois regretter que les articles ne paraissent pas toujours très bien structurés.
* Goldschmidt, V., ''Les Dialogues de Platon'', PUF, 1935, Paris
* Pradeau, Jean-François (coordonné par), ''Platon : les formes intelligibles'', PUF, Paris, 2001
*:Un recueil d'articles sur la théorie des formes. Certains articles sont très spécialisés et arides, mais toujours clairs et instructifs. Incontournable pour approfondir la théorie fondamentale du platonisme.
* Richard H. Kraut (ed.), ''The Cambridge Companion to Plato'', New York Cambridge (Univ. Press), 1992
* Robin, Léon, ''Platon'', PUF, 1935 (rééd. 1997)
* Alexandre Koyré, '''Introduction à la lecture de Platon''', Gallimard, 1962. Un livre simplement écrit et qui est très éclairant.
[[Catégorie:Classe 1 - Philosophie et psychologie]]
syobufub50h4d5u411l289j7vzrx08b
764614
764613
2026-04-23T05:36:11Z
PandaMystique
119061
764614
wikitext
text/x-wiki
<noinclude>{{sous-pages}}</noinclude>
Cette bibliographie est une bibliographie commentée : les commentaires ont pour but de permettre au lecteur de se faire un avis sur les livres qu'il peut lire sur Platon en fonction de ses besoins. Si les commentaires comportent inévitablement une part de subjectivité, nous aurons toujours à l'esprit qu'il s'agit de dire ce qu'apporte un livre pour la lecture de notre auteur. On ne vise pas à fournir une bibliographie très fournie qui serait inutile et décourageante pour un lecteur débutant.
Commencer par un ouvrage qui regroupe les textes de Platon à l'aide d'un fil conducteur peut donner à comprendre que chaque philosophe traite avant tout d'un problème dont il hérite ou qu'il met en place;
* Louis Guillermit, ''Platon par lui-même,'' choix de textes, Flammarion, 1994 ([http://www.persee.fr/doc/phlou_0035-3841_1995_num_93_4_6963_t1_0619_0000_2 compte-rendu])
* Brisson, Luc et Francesco Fronterotta, sous la direction de, ''Lire Platon'', Quadrige, Presses Universitaires de France, Paris, 2006
*:Ce livre couvre de nombreux domaines, des influences sur Platon à sa philosophie politique. Les articles sont clairs et directs. Cette diversité de sujets est très utile pour acquérir une bonne représentation générale de la pensée platonicienne. De ce point de vue, c'est une introduction idéale.
*Brisson, Luc et Pradeau, Jean-François, ''Le Vocabulaire de Platon'', Ellipses, 1998
*:Un ouvrage qui permet d'apprendre la pensée de Platon de manière synthétique. Une méthode pour l'utiliser est de lire les notions relatives à un même thème (morale, cosmologie, par exemple). On peut toutefois regretter que les articles ne paraissent pas toujours très bien structurés.
* Goldschmidt, V., ''Les Dialogues de Platon'', PUF, 1935, Paris
* Pradeau, Jean-François (coordonné par), ''Platon : les formes intelligibles'', PUF, Paris, 2001
*:Un recueil d'articles sur la théorie des formes. Certains articles sont très spécialisés et arides, mais toujours clairs et instructifs. Incontournable pour approfondir la théorie fondamentale du platonisme.
* Richard H. Kraut (ed.), ''The Cambridge Companion to Plato'', New York Cambridge (Univ. Press), 1992
* Robin, Léon, ''Platon'', PUF, 1935 (rééd. 1997)
* Alexandre Koyré, ''Introduction à la lecture de Platon'', Gallimard, 1962. Un livre simplement écrit et qui est très éclairant.
[[Catégorie:Classe 1 - Philosophie et psychologie]]
q6dvdkqbr9n6q46rrzlsyc18odsgvvq
764615
764614
2026-04-23T05:36:41Z
PandaMystique
119061
764615
wikitext
text/x-wiki
<noinclude>{{sous-pages}}</noinclude>
Cette bibliographie est une bibliographie commentée : les commentaires ont pour but de permettre au lecteur de se faire un avis sur les livres qu'il peut lire sur Platon en fonction de ses besoins. Si les commentaires comportent inévitablement une part de subjectivité, nous aurons toujours à l'esprit qu'il s'agit de dire ce qu'apporte un livre pour la lecture de notre auteur. On ne vise pas à fournir une bibliographie très fournie qui serait inutile et décourageante pour un lecteur débutant.
Commencer par un ouvrage qui regroupe les textes de Platon à l'aide d'un fil conducteur peut donner à comprendre que chaque philosophe traite avant tout d'un problème dont il hérite ou qu'il met en place;
* Louis Guillermit, ''Platon par lui-même,'' choix de textes, Flammarion, 1994 ([http://www.persee.fr/doc/phlou_0035-3841_1995_num_93_4_6963_t1_0619_0000_2 compte-rendu])
* Brisson, Luc et Francesco Fronterotta, sous la direction de, ''Lire Platon'', Quadrige, Presses Universitaires de France, Paris, 2006
*:Ce livre couvre de nombreux domaines, des influences sur Platon à sa philosophie politique. Les articles sont clairs et directs. Cette diversité de sujets est très utile pour acquérir une bonne représentation générale de la pensée platonicienne. De ce point de vue, c'est une introduction idéale.
*Brisson, Luc et Pradeau, Jean-François, ''Le Vocabulaire de Platon'', Ellipses, 1998
*:Un ouvrage qui permet d'apprendre la pensée de Platon de manière synthétique. Une méthode pour l'utiliser est de lire les notions relatives à un même thème (morale, cosmologie, par exemple). On peut toutefois regretter que les articles ne paraissent pas toujours très bien structurés.
* Goldschmidt, V., ''Les Dialogues de Platon'', PUF, 1935, Paris
* Pradeau, Jean-François (coordonné par), ''Platon : les formes intelligibles'', PUF, Paris, 2001
*:Un recueil d'articles sur la théorie des formes. Certains articles sont très spécialisés et arides, mais toujours clairs et instructifs. Incontournable pour approfondir la théorie fondamentale du platonisme.
* Richard H. Kraut (ed.), ''The Cambridge Companion to Plato'', New York Cambridge (Univ. Press), 1992
* Robin, Léon, ''Platon'', PUF, 1935 (rééd. 1997)
* Alexandre Koyré, ''Introduction à la lecture de Platon'', Gallimard, 1962.
*:Un livre simplement écrit et qui est très éclairant.
[[Catégorie:Classe 1 - Philosophie et psychologie]]
96k6q04khv6uvcubn63zn8a5p921end
764616
764615
2026-04-23T05:38:10Z
PandaMystique
119061
764616
wikitext
text/x-wiki
<noinclude>{{sous-pages}}</noinclude>
Cette bibliographie est une bibliographie commentée : les commentaires ont pour but de permettre au lecteur de se faire un avis sur les livres qu'il peut lire sur Platon en fonction de ses besoins. Si les commentaires comportent inévitablement une part de subjectivité, nous aurons toujours à l'esprit qu'il s'agit de dire ce qu'apporte un livre pour la lecture de notre auteur. On ne vise pas à fournir une bibliographie très fournie qui serait inutile et décourageante pour un lecteur débutant.
* Brisson, Luc et Francesco Fronterotta, sous la direction de, ''Lire Platon'', Quadrige, Presses Universitaires de France, Paris, 2006
*:Ce livre couvre de nombreux domaines, des influences sur Platon à sa philosophie politique. Les articles sont clairs et directs. Cette diversité de sujets est très utile pour acquérir une bonne représentation générale de la pensée platonicienne. De ce point de vue, c'est une introduction idéale.
*Brisson, Luc et Pradeau, Jean-François, ''Le Vocabulaire de Platon'', Ellipses, 1998
*:Un ouvrage qui permet d'apprendre la pensée de Platon de manière synthétique. Une méthode pour l'utiliser est de lire les notions relatives à un même thème (morale, cosmologie, par exemple). On peut toutefois regretter que les articles ne paraissent pas toujours très bien structurés.
* Goldschmidt, V., ''Les Dialogues de Platon'', PUF, 1935, Paris
* Guillermit, Louis, ''Platon par lui-même,'' choix de textes, Flammarion, 1994 ([http://www.persee.fr/doc/phlou_0035-3841_1995_num_93_4_6963_t1_0619_0000_2 compte-rendu])
*:Commencer par un ouvrage qui regroupe les textes de Platon à l'aide d'un fil conducteur peut donner à comprendre que chaque philosophe traite avant tout d'un problème dont il hérite ou qu'il met en place
* Koyré, Alexandre, ''Introduction à la lecture de Platon'', Gallimard, 1962.
*:Un livre simplement écrit et qui est très éclairant.
* Pradeau, Jean-François (coordonné par), ''Platon : les formes intelligibles'', PUF, Paris, 2001
*:Un recueil d'articles sur la théorie des formes. Certains articles sont très spécialisés et arides, mais toujours clairs et instructifs. Incontournable pour approfondir la théorie fondamentale du platonisme.
* Richard H. Kraut (ed.), ''The Cambridge Companion to Plato'', New York Cambridge (Univ. Press), 1992
* Robin, Léon, ''Platon'', PUF, 1935 (rééd. 1997)
[[Catégorie:Classe 1 - Philosophie et psychologie]]
ru640x2e6o6gme25lu0pgfqwreis0mk
Fonctionnement d'un ordinateur/Contrôleur mémoire externe
0
65796
764412
764403
2026-04-22T12:05:52Z
Mewtow
31375
/* L'interface d'un contrôleur de DRAM asynchrone */
764412
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM simple, asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, chacun étant appelé une '''banque'''. Cela permettait de faire passer de 4 kibioctets à 16 kibioctets de RAM maximum. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour cela, le 8202 dispose de deux bits BO et B1 pour sélectionner la banque adéquate, ainsi que 4 sorties RAS pour activer la banque adéquate. Lors du transfert d'une adresse haute, seul le signal RAS de la banque sélectionnée est activé, les autres restent à 0. Les deux bits de banque peuvent être vus comme deux bits de poids fort de l'adresse complète, sélection de la banque incluse. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
Comme pour les contrôleurs des DRAM asynchrones, un contrôleur de SDRAM regroupe toujours un '''séquenceur mémoire''' et une '''interface physique'''. Le séquenceur mémoire est souvent combiné avec un circuit pour le rafraichissement mémoire et un circuit d'arbitrage.
Parfois, juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
===Les ''wait state'' et la fréquence de la SDRAM===
Les processeurs modernes sont beaucoup plus rapides que la mémoire RAM. Et ce n'est pas quelque chose qui est apparu récemment : c'était déjà un problème au temps du 486 et du premier Pentium d'Intel. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. De nos jours, ces ''wait state'' ont cependant disparu, grâce à de nombreuses optimisations.
La présence d'un contrôleur mémoire a permet d'éliminer les ''wait state'', dans une certaine mesure. Lors d'un ''wait state'', le processeur doit maintenir l'adresse et la donnée sur le bus mémoire pendant tout l'accès mémoire. Avec un contrôleur mémoire, le processeur envoie l'adresse, et c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. Précisons cependant que si la présence d'un contrôleur mémoire n'est pas nécessaire, le processeur peut faire la même chose sans. Mais ça aide !
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
qk6cs0fserozmguphyeq42ia79yoqmf
764413
764412
2026-04-22T12:06:27Z
Mewtow
31375
/* Exemple : l'Intel 8202-8203 */
764413
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM simple, asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, chacun étant appelé une '''banque'''. Cela permettait de faire passer de 4 kibioctets à 16 kibioctets de RAM maximum. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour cela, le 8202 dispose de deux bits BO et B1 pour sélectionner la banque adéquate, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. Lors du transfert d'une adresse haute, seul le signal RAS de la banque sélectionnée est activé, les autres restent à 0. Les deux bits de banque peuvent être vus comme deux bits de poids fort de l'adresse complète, sélection de la banque incluse. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
Comme pour les contrôleurs des DRAM asynchrones, un contrôleur de SDRAM regroupe toujours un '''séquenceur mémoire''' et une '''interface physique'''. Le séquenceur mémoire est souvent combiné avec un circuit pour le rafraichissement mémoire et un circuit d'arbitrage.
Parfois, juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
===Les ''wait state'' et la fréquence de la SDRAM===
Les processeurs modernes sont beaucoup plus rapides que la mémoire RAM. Et ce n'est pas quelque chose qui est apparu récemment : c'était déjà un problème au temps du 486 et du premier Pentium d'Intel. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. De nos jours, ces ''wait state'' ont cependant disparu, grâce à de nombreuses optimisations.
La présence d'un contrôleur mémoire a permet d'éliminer les ''wait state'', dans une certaine mesure. Lors d'un ''wait state'', le processeur doit maintenir l'adresse et la donnée sur le bus mémoire pendant tout l'accès mémoire. Avec un contrôleur mémoire, le processeur envoie l'adresse, et c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. Précisons cependant que si la présence d'un contrôleur mémoire n'est pas nécessaire, le processeur peut faire la même chose sans. Mais ça aide !
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
0ipguhmgszyk3dr2trkt1q9hgyhq72r
764414
764413
2026-04-22T12:09:52Z
Mewtow
31375
/* Le contrôleur mémoire d'une SDRAM ou d'une DDR */
764414
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM simple, asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, chacun étant appelé une '''banque'''. Cela permettait de faire passer de 4 kibioctets à 16 kibioctets de RAM maximum. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour cela, le 8202 dispose de deux bits BO et B1 pour sélectionner la banque adéquate, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. Lors du transfert d'une adresse haute, seul le signal RAS de la banque sélectionnée est activé, les autres restent à 0. Les deux bits de banque peuvent être vus comme deux bits de poids fort de l'adresse complète, sélection de la banque incluse. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
Comme pour les contrôleurs des DRAM asynchrones, un contrôleur de SDRAM regroupe toujours un '''séquenceur mémoire''' et une '''interface physique'''. Le séquenceur mémoire est souvent combiné avec un circuit pour le rafraichissement mémoire et un circuit d'arbitrage.
Parfois, juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
Les mémoires SDRAM et DDR disposent d'une entrée ''Chip Select'', ainsi que d'un signal ''Output Enable'', ce qui facilite grandement le décodage d'adresse. La sélection d'une banque ou d'un chip de DRAM est grandement simplifiée, même s'il a fallu ajouter des broches sur le boitier pour cela.
===Les ''wait state'' et la fréquence de la SDRAM===
Les processeurs modernes sont beaucoup plus rapides que la mémoire RAM. Et ce n'est pas quelque chose qui est apparu récemment : c'était déjà un problème au temps du 486 et du premier Pentium d'Intel. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. De nos jours, ces ''wait state'' ont cependant disparu, grâce à de nombreuses optimisations.
La présence d'un contrôleur mémoire a permet d'éliminer les ''wait state'', dans une certaine mesure. Lors d'un ''wait state'', le processeur doit maintenir l'adresse et la donnée sur le bus mémoire pendant tout l'accès mémoire. Avec un contrôleur mémoire, le processeur envoie l'adresse, et c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. Précisons cependant que si la présence d'un contrôleur mémoire n'est pas nécessaire, le processeur peut faire la même chose sans. Mais ça aide !
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
j1idplifx3b9bkcszvs0l1anxg3tk20
764429
764414
2026-04-22T13:13:21Z
Mewtow
31375
/* Le contrôleur mémoire d'une SDRAM ou d'une DDR */
764429
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM simple, asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, chacun étant appelé une '''banque'''. Cela permettait de faire passer de 4 kibioctets à 16 kibioctets de RAM maximum. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour cela, le 8202 dispose de deux bits BO et B1 pour sélectionner la banque adéquate, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. Lors du transfert d'une adresse haute, seul le signal RAS de la banque sélectionnée est activé, les autres restent à 0. Les deux bits de banque peuvent être vus comme deux bits de poids fort de l'adresse complète, sélection de la banque incluse. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
Comme pour les contrôleurs des DRAM asynchrones, un contrôleur de SDRAM regroupe toujours un '''séquenceur mémoire''' et une '''interface physique'''. Le séquenceur mémoire est souvent combiné avec un circuit pour le rafraichissement mémoire et un circuit d'arbitrage.
Parfois, juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
===Les signaux de ''Chip Select''===
Les mémoires SDRAM et DDR disposent d'une entrée ''Chip Select'', ainsi que d'un signal ''Output Enable'', ce qui facilite grandement le décodage d'adresse. La sélection d'une banque ou d'un chip de DRAM est grandement simplifiée, même s'il a fallu ajouter des broches sur le boitier pour cela.
Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
===Les ''wait state'' et la fréquence de la SDRAM===
Les processeurs modernes sont beaucoup plus rapides que la mémoire RAM. Et ce n'est pas quelque chose qui est apparu récemment : c'était déjà un problème au temps du 486 et du premier Pentium d'Intel. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. De nos jours, ces ''wait state'' ont cependant disparu, grâce à de nombreuses optimisations.
La présence d'un contrôleur mémoire a permet d'éliminer les ''wait state'', dans une certaine mesure. Lors d'un ''wait state'', le processeur doit maintenir l'adresse et la donnée sur le bus mémoire pendant tout l'accès mémoire. Avec un contrôleur mémoire, le processeur envoie l'adresse, et c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. Précisons cependant que si la présence d'un contrôleur mémoire n'est pas nécessaire, le processeur peut faire la même chose sans. Mais ça aide !
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
cibg6i6a5sginb77tc392f8w3ljs7xz
764506
764429
2026-04-22T18:59:07Z
Mewtow
31375
/* Le contrôleur d'une DRAM simple, asynchrone */
764506
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, chacun étant appelé une '''banque'''. Cela permettait de faire passer de 4 kibioctets à 16 kibioctets de RAM maximum. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour cela, le 8202 dispose de deux bits BO et B1 pour sélectionner la banque adéquate, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. Lors du transfert d'une adresse haute, seul le signal RAS de la banque sélectionnée est activé, les autres restent à 0. Les deux bits de banque peuvent être vus comme deux bits de poids fort de l'adresse complète, sélection de la banque incluse. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
Comme pour les contrôleurs des DRAM asynchrones, un contrôleur de SDRAM regroupe toujours un '''séquenceur mémoire''' et une '''interface physique'''. Le séquenceur mémoire est souvent combiné avec un circuit pour le rafraichissement mémoire et un circuit d'arbitrage.
Parfois, juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
===Les signaux de ''Chip Select''===
Les mémoires SDRAM et DDR disposent d'une entrée ''Chip Select'', ainsi que d'un signal ''Output Enable'', ce qui facilite grandement le décodage d'adresse. La sélection d'une banque ou d'un chip de DRAM est grandement simplifiée, même s'il a fallu ajouter des broches sur le boitier pour cela.
Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
===Les ''wait state'' et la fréquence de la SDRAM===
Les processeurs modernes sont beaucoup plus rapides que la mémoire RAM. Et ce n'est pas quelque chose qui est apparu récemment : c'était déjà un problème au temps du 486 et du premier Pentium d'Intel. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. De nos jours, ces ''wait state'' ont cependant disparu, grâce à de nombreuses optimisations.
La présence d'un contrôleur mémoire a permet d'éliminer les ''wait state'', dans une certaine mesure. Lors d'un ''wait state'', le processeur doit maintenir l'adresse et la donnée sur le bus mémoire pendant tout l'accès mémoire. Avec un contrôleur mémoire, le processeur envoie l'adresse, et c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. Précisons cependant que si la présence d'un contrôleur mémoire n'est pas nécessaire, le processeur peut faire la même chose sans. Mais ça aide !
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
3twcc5yjhuxdi20hlgi4kxma3x516we
764508
764506
2026-04-22T19:04:47Z
Mewtow
31375
/* Exemple : l'Intel 8202-8203 */
764508
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le controleur mémoire gére aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. Activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, chacun étant appelé une '''banque'''. Cela permettait de faire passer de 4 kibioctets à 16 kibioctets de RAM maximum. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour cela, le 8202 dispose de deux bits BO et B1 pour sélectionner la banque adéquate, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. Lors du transfert d'une adresse haute, seul le signal RAS de la banque sélectionnée est activé, les autres restent à 0. Les deux bits de banque peuvent être vus comme deux bits de poids fort de l'adresse complète, sélection de la banque incluse. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
Comme pour les contrôleurs des DRAM asynchrones, un contrôleur de SDRAM regroupe toujours un '''séquenceur mémoire''' et une '''interface physique'''. Le séquenceur mémoire est souvent combiné avec un circuit pour le rafraichissement mémoire et un circuit d'arbitrage.
Parfois, juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
===Les signaux de ''Chip Select''===
Les mémoires SDRAM et DDR disposent d'une entrée ''Chip Select'', ainsi que d'un signal ''Output Enable'', ce qui facilite grandement le décodage d'adresse. La sélection d'une banque ou d'un chip de DRAM est grandement simplifiée, même s'il a fallu ajouter des broches sur le boitier pour cela.
Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
===Les ''wait state'' et la fréquence de la SDRAM===
Les processeurs modernes sont beaucoup plus rapides que la mémoire RAM. Et ce n'est pas quelque chose qui est apparu récemment : c'était déjà un problème au temps du 486 et du premier Pentium d'Intel. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. De nos jours, ces ''wait state'' ont cependant disparu, grâce à de nombreuses optimisations.
La présence d'un contrôleur mémoire a permet d'éliminer les ''wait state'', dans une certaine mesure. Lors d'un ''wait state'', le processeur doit maintenir l'adresse et la donnée sur le bus mémoire pendant tout l'accès mémoire. Avec un contrôleur mémoire, le processeur envoie l'adresse, et c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. Précisons cependant que si la présence d'un contrôleur mémoire n'est pas nécessaire, le processeur peut faire la même chose sans. Mais ça aide !
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
127l1rsb2q8rgvdnvmn37xgx38dkijt
764509
764508
2026-04-22T19:07:09Z
Mewtow
31375
/* Le décodage d'adresse */
764509
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, chacun étant appelé une '''banque'''. Cela permettait de faire passer de 4 kibioctets à 16 kibioctets de RAM maximum. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour cela, le 8202 dispose de deux bits BO et B1 pour sélectionner la banque adéquate, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. Lors du transfert d'une adresse haute, seul le signal RAS de la banque sélectionnée est activé, les autres restent à 0. Les deux bits de banque peuvent être vus comme deux bits de poids fort de l'adresse complète, sélection de la banque incluse. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
Comme pour les contrôleurs des DRAM asynchrones, un contrôleur de SDRAM regroupe toujours un '''séquenceur mémoire''' et une '''interface physique'''. Le séquenceur mémoire est souvent combiné avec un circuit pour le rafraichissement mémoire et un circuit d'arbitrage.
Parfois, juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
===Les signaux de ''Chip Select''===
Les mémoires SDRAM et DDR disposent d'une entrée ''Chip Select'', ainsi que d'un signal ''Output Enable'', ce qui facilite grandement le décodage d'adresse. La sélection d'une banque ou d'un chip de DRAM est grandement simplifiée, même s'il a fallu ajouter des broches sur le boitier pour cela.
Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
===Les ''wait state'' et la fréquence de la SDRAM===
Les processeurs modernes sont beaucoup plus rapides que la mémoire RAM. Et ce n'est pas quelque chose qui est apparu récemment : c'était déjà un problème au temps du 486 et du premier Pentium d'Intel. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. De nos jours, ces ''wait state'' ont cependant disparu, grâce à de nombreuses optimisations.
La présence d'un contrôleur mémoire a permet d'éliminer les ''wait state'', dans une certaine mesure. Lors d'un ''wait state'', le processeur doit maintenir l'adresse et la donnée sur le bus mémoire pendant tout l'accès mémoire. Avec un contrôleur mémoire, le processeur envoie l'adresse, et c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. Précisons cependant que si la présence d'un contrôleur mémoire n'est pas nécessaire, le processeur peut faire la même chose sans. Mais ça aide !
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
po00lm3dukmex4mftbyopueu3i3udbw
764510
764509
2026-04-22T19:46:32Z
Mewtow
31375
/* Exemple : l'Intel 8202-8203 */
764510
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
Comme pour les contrôleurs des DRAM asynchrones, un contrôleur de SDRAM regroupe toujours un '''séquenceur mémoire''' et une '''interface physique'''. Le séquenceur mémoire est souvent combiné avec un circuit pour le rafraichissement mémoire et un circuit d'arbitrage.
Parfois, juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
===Les signaux de ''Chip Select''===
Les mémoires SDRAM et DDR disposent d'une entrée ''Chip Select'', ainsi que d'un signal ''Output Enable'', ce qui facilite grandement le décodage d'adresse. La sélection d'une banque ou d'un chip de DRAM est grandement simplifiée, même s'il a fallu ajouter des broches sur le boitier pour cela.
Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
===Les ''wait state'' et la fréquence de la SDRAM===
Les processeurs modernes sont beaucoup plus rapides que la mémoire RAM. Et ce n'est pas quelque chose qui est apparu récemment : c'était déjà un problème au temps du 486 et du premier Pentium d'Intel. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. De nos jours, ces ''wait state'' ont cependant disparu, grâce à de nombreuses optimisations.
La présence d'un contrôleur mémoire a permet d'éliminer les ''wait state'', dans une certaine mesure. Lors d'un ''wait state'', le processeur doit maintenir l'adresse et la donnée sur le bus mémoire pendant tout l'accès mémoire. Avec un contrôleur mémoire, le processeur envoie l'adresse, et c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. Précisons cependant que si la présence d'un contrôleur mémoire n'est pas nécessaire, le processeur peut faire la même chose sans. Mais ça aide !
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
eqkv3puuiiztbd5hmkg2kwhshmhig7t
764511
764510
2026-04-22T19:55:32Z
Mewtow
31375
/* La politique de gestion du tampon de ligne */
764511
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
Comme pour les contrôleurs des DRAM asynchrones, un contrôleur de SDRAM regroupe toujours un '''séquenceur mémoire''' et une '''interface physique'''. Le séquenceur mémoire est souvent combiné avec un circuit pour le rafraichissement mémoire et un circuit d'arbitrage.
Parfois, juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
===Les signaux de ''Chip Select''===
Les mémoires SDRAM et DDR disposent d'une entrée ''Chip Select'', ainsi que d'un signal ''Output Enable'', ce qui facilite grandement le décodage d'adresse. La sélection d'une banque ou d'un chip de DRAM est grandement simplifiée, même s'il a fallu ajouter des broches sur le boitier pour cela.
Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
===Les ''wait state'' et la fréquence de la SDRAM===
Les processeurs modernes sont beaucoup plus rapides que la mémoire RAM. Et ce n'est pas quelque chose qui est apparu récemment : c'était déjà un problème au temps du 486 et du premier Pentium d'Intel. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. De nos jours, ces ''wait state'' ont cependant disparu, grâce à de nombreuses optimisations.
La présence d'un contrôleur mémoire a permet d'éliminer les ''wait state'', dans une certaine mesure. Lors d'un ''wait state'', le processeur doit maintenir l'adresse et la donnée sur le bus mémoire pendant tout l'accès mémoire. Avec un contrôleur mémoire, le processeur envoie l'adresse, et c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. Précisons cependant que si la présence d'un contrôleur mémoire n'est pas nécessaire, le processeur peut faire la même chose sans. Mais ça aide !
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===L'entrelacement mémoire avec un tampon de lignes===
Le contrôleur mémoire gère aussi l''''entrelacement'''. Pour rappel, cela veut dire qu'il prend en compte la présence de plusieurs banques à l'intérieur de la mémoire DRAM. Avec l'entrelacement simple, le contrôleur de mémoire distribue des adresses consécutives dans des banques différentes. Cela accélère les accès en rafale, vu qu'on peut accéder à plusieurs banques en même temps, et donc à plusieurs adresses consécutives en même temps.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Mais avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
44lyj75q61xd7g8gz8m98vcsy5q73k0
764512
764511
2026-04-22T20:05:14Z
Mewtow
31375
/* L'entrelacement mémoire avec un tampon de lignes */
764512
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
Comme pour les contrôleurs des DRAM asynchrones, un contrôleur de SDRAM regroupe toujours un '''séquenceur mémoire''' et une '''interface physique'''. Le séquenceur mémoire est souvent combiné avec un circuit pour le rafraichissement mémoire et un circuit d'arbitrage.
Parfois, juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
===Les signaux de ''Chip Select''===
Les mémoires SDRAM et DDR disposent d'une entrée ''Chip Select'', ainsi que d'un signal ''Output Enable'', ce qui facilite grandement le décodage d'adresse. La sélection d'une banque ou d'un chip de DRAM est grandement simplifiée, même s'il a fallu ajouter des broches sur le boitier pour cela.
Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
===Les ''wait state'' et la fréquence de la SDRAM===
Les processeurs modernes sont beaucoup plus rapides que la mémoire RAM. Et ce n'est pas quelque chose qui est apparu récemment : c'était déjà un problème au temps du 486 et du premier Pentium d'Intel. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. De nos jours, ces ''wait state'' ont cependant disparu, grâce à de nombreuses optimisations.
La présence d'un contrôleur mémoire a permet d'éliminer les ''wait state'', dans une certaine mesure. Lors d'un ''wait state'', le processeur doit maintenir l'adresse et la donnée sur le bus mémoire pendant tout l'accès mémoire. Avec un contrôleur mémoire, le processeur envoie l'adresse, et c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. Précisons cependant que si la présence d'un contrôleur mémoire n'est pas nécessaire, le processeur peut faire la même chose sans. Mais ça aide !
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===L'entrelacement mémoire avec un tampon de lignes===
Le contrôleur mémoire gère aussi l''''entrelacement'''. Pour rappel, cela veut dire qu'il prend en compte la présence de plusieurs banques à l'intérieur de la mémoire DRAM. Avec l'entrelacement simple, le contrôleur de mémoire distribue des adresses consécutives dans des banques différentes. Cela accélère les accès en rafale, vu que deux accès à des adresses consécutives se feront dans deux banques différentes et peuvent se faire "en même temps".
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Mais avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
2mcu51hgjvjhbv83x6n224xlcstn2qr
764513
764512
2026-04-22T20:05:24Z
Mewtow
31375
/* L'entrelacement mémoire avec un tampon de lignes */
764513
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
Comme pour les contrôleurs des DRAM asynchrones, un contrôleur de SDRAM regroupe toujours un '''séquenceur mémoire''' et une '''interface physique'''. Le séquenceur mémoire est souvent combiné avec un circuit pour le rafraichissement mémoire et un circuit d'arbitrage.
Parfois, juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
===Les signaux de ''Chip Select''===
Les mémoires SDRAM et DDR disposent d'une entrée ''Chip Select'', ainsi que d'un signal ''Output Enable'', ce qui facilite grandement le décodage d'adresse. La sélection d'une banque ou d'un chip de DRAM est grandement simplifiée, même s'il a fallu ajouter des broches sur le boitier pour cela.
Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
===Les ''wait state'' et la fréquence de la SDRAM===
Les processeurs modernes sont beaucoup plus rapides que la mémoire RAM. Et ce n'est pas quelque chose qui est apparu récemment : c'était déjà un problème au temps du 486 et du premier Pentium d'Intel. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. De nos jours, ces ''wait state'' ont cependant disparu, grâce à de nombreuses optimisations.
La présence d'un contrôleur mémoire a permet d'éliminer les ''wait state'', dans une certaine mesure. Lors d'un ''wait state'', le processeur doit maintenir l'adresse et la donnée sur le bus mémoire pendant tout l'accès mémoire. Avec un contrôleur mémoire, le processeur envoie l'adresse, et c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. Précisons cependant que si la présence d'un contrôleur mémoire n'est pas nécessaire, le processeur peut faire la même chose sans. Mais ça aide !
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===L'entrelacement mémoire des SDRAM===
Le contrôleur mémoire gère aussi l''''entrelacement'''. Pour rappel, cela veut dire qu'il prend en compte la présence de plusieurs banques à l'intérieur de la mémoire DRAM. Avec l'entrelacement simple, le contrôleur de mémoire distribue des adresses consécutives dans des banques différentes. Cela accélère les accès en rafale, vu que deux accès à des adresses consécutives se feront dans deux banques différentes et peuvent se faire "en même temps".
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Mais avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
i1nw4tl7edvpq1jo1tg1yfwlg7kiima
764514
764513
2026-04-22T20:08:47Z
Mewtow
31375
/* L'entrelacement mémoire des SDRAM */
764514
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
Comme pour les contrôleurs des DRAM asynchrones, un contrôleur de SDRAM regroupe toujours un '''séquenceur mémoire''' et une '''interface physique'''. Le séquenceur mémoire est souvent combiné avec un circuit pour le rafraichissement mémoire et un circuit d'arbitrage.
Parfois, juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
===Les signaux de ''Chip Select''===
Les mémoires SDRAM et DDR disposent d'une entrée ''Chip Select'', ainsi que d'un signal ''Output Enable'', ce qui facilite grandement le décodage d'adresse. La sélection d'une banque ou d'un chip de DRAM est grandement simplifiée, même s'il a fallu ajouter des broches sur le boitier pour cela.
Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
===Les ''wait state'' et la fréquence de la SDRAM===
Les processeurs modernes sont beaucoup plus rapides que la mémoire RAM. Et ce n'est pas quelque chose qui est apparu récemment : c'était déjà un problème au temps du 486 et du premier Pentium d'Intel. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. De nos jours, ces ''wait state'' ont cependant disparu, grâce à de nombreuses optimisations.
La présence d'un contrôleur mémoire a permet d'éliminer les ''wait state'', dans une certaine mesure. Lors d'un ''wait state'', le processeur doit maintenir l'adresse et la donnée sur le bus mémoire pendant tout l'accès mémoire. Avec un contrôleur mémoire, le processeur envoie l'adresse, et c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. Précisons cependant que si la présence d'un contrôleur mémoire n'est pas nécessaire, le processeur peut faire la même chose sans. Mais ça aide !
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===L'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Cela accélère les accès en rafale, vu que deux accès à des adresses consécutives se feront dans deux banques différentes et peuvent se faire "en même temps".
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Mais avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
8ces0vvu6qcmubpyq8ogq42s24la3gr
764515
764514
2026-04-22T20:15:02Z
Mewtow
31375
/* Le contrôleur mémoire d'une SDRAM ou d'une DDR */
764515
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
Comme pour les contrôleurs des DRAM asynchrones, un contrôleur de SDRAM regroupe toujours un '''séquenceur mémoire''' et une '''interface physique'''. Le séquenceur mémoire est souvent combiné avec un circuit pour le rafraichissement mémoire et un circuit d'arbitrage.
Les mémoires SDRAM et DDR disposent d'une entrée ''Chip Select'', ainsi que d'un signal ''Output Enable'', ce qui facilite grandement le décodage d'adresse. La sélection d'une banque ou d'un chip de DRAM est grandement simplifiée, même s'il a fallu ajouter des broches sur le boitier pour cela.
Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
===Les ''wait state'' et la fréquence de la SDRAM===
Les processeurs modernes sont beaucoup plus rapides que la mémoire RAM. Et ce n'est pas quelque chose qui est apparu récemment : c'était déjà un problème au temps du 486 et du premier Pentium d'Intel. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. De nos jours, ces ''wait state'' ont cependant disparu, grâce à de nombreuses optimisations.
La présence d'un contrôleur mémoire a permet d'éliminer les ''wait state'', dans une certaine mesure. Lors d'un ''wait state'', le processeur doit maintenir l'adresse et la donnée sur le bus mémoire pendant tout l'accès mémoire. Avec un contrôleur mémoire, le processeur envoie l'adresse, et c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. Précisons cependant que si la présence d'un contrôleur mémoire n'est pas nécessaire, le processeur peut faire la même chose sans. Mais ça aide !
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===L'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Cela accélère les accès en rafale, vu que deux accès à des adresses consécutives se feront dans deux banques différentes et peuvent se faire "en même temps".
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Mais avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
Juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
8whskcvon4sbsuc8p2s3sxb6dw2t36m
764516
764515
2026-04-22T20:17:35Z
Mewtow
31375
/* Le contrôleur mémoire d'une SDRAM ou d'une DDR */
764516
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal, de même que ce que fait le séquenceur mémoire.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Les ''wait state'' et la fréquence de la SDRAM===
Les processeurs modernes sont beaucoup plus rapides que la mémoire RAM. Et ce n'est pas quelque chose qui est apparu récemment : c'était déjà un problème au temps du 486 et du premier Pentium d'Intel. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. De nos jours, ces ''wait state'' ont cependant disparu, grâce à de nombreuses optimisations.
La présence d'un contrôleur mémoire a permet d'éliminer les ''wait state'', dans une certaine mesure. Lors d'un ''wait state'', le processeur doit maintenir l'adresse et la donnée sur le bus mémoire pendant tout l'accès mémoire. Avec un contrôleur mémoire, le processeur envoie l'adresse, et c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. Précisons cependant que si la présence d'un contrôleur mémoire n'est pas nécessaire, le processeur peut faire la même chose sans. Mais ça aide !
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===L'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Cela accélère les accès en rafale, vu que deux accès à des adresses consécutives se feront dans deux banques différentes et peuvent se faire "en même temps".
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Mais avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
Juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
bndi6aetzy5uurxhybjvmwuqhq7tzar
764517
764516
2026-04-22T20:18:35Z
Mewtow
31375
/* Les wait state et la fréquence de la SDRAM */
764517
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal, de même que ce que fait le séquenceur mémoire.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===L'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Cela accélère les accès en rafale, vu que deux accès à des adresses consécutives se feront dans deux banques différentes et peuvent se faire "en même temps".
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Mais avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
Juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
46moqfmgmufbs5yefx15hbqmgqey8mn
764519
764517
2026-04-22T20:21:54Z
Mewtow
31375
/* Les contrôleurs mémoire synchrone */
764519
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal, de même que ce que fait le séquenceur mémoire.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===L'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Cela accélère les accès en rafale, vu que deux accès à des adresses consécutives se feront dans deux banques différentes et peuvent se faire "en même temps".
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Mais avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
Juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
goh12hb2hvxh8otsie8qokyzaq1stek
764520
764519
2026-04-22T20:23:17Z
Mewtow
31375
/* Le contrôleur mémoire d'une SDRAM ou d'une DDR */
764520
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal, de même que ce que fait le séquenceur mémoire.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===L'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Cela accélère les accès en rafale, vu que deux accès à des adresses consécutives se feront dans deux banques différentes et peuvent se faire "en même temps".
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Mais avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
Juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
hk3dy6qs5u0e52l0pwidtkishix9kql
764521
764520
2026-04-22T20:23:44Z
Mewtow
31375
/* Le contrôleur mémoire d'une SDRAM ou d'une DDR */
764521
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal, de même que ce que fait le séquenceur mémoire.
===L'interface avec la SDRAM est différente===
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===L'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Cela accélère les accès en rafale, vu que deux accès à des adresses consécutives se feront dans deux banques différentes et peuvent se faire "en même temps".
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Mais avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
Juste avant le séquenceur mémoire, se trouve un circuit pour gérer l'entrelacement. Ce circuit intervertit certains bits de l'adresse lors des accès mémoires. Rappelons qu'avec l'entrelacement, des adresses consécutives sont placées dans des mémoires séparées, ce qui demande de jouer avec les bits d'adresse, chose qui est dévolue à l'étape de traduction d'adresse du contrôleur mémoire.
On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
22t3jqhq046lwl4luidpgtn9rehr1vm
764522
764521
2026-04-22T20:24:30Z
Mewtow
31375
/* L'entrelacement mémoire des SDRAM */
764522
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal, de même que ce que fait le séquenceur mémoire.
===L'interface avec la SDRAM est différente===
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===L'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Cela accélère les accès en rafale, vu que deux accès à des adresses consécutives se feront dans deux banques différentes et peuvent se faire "en même temps".
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Mais avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
awq0s7ra8hu3ps05tg6k1yro5dhcwg5
764524
764522
2026-04-22T20:28:28Z
Mewtow
31375
/* L'entrelacement mémoire des SDRAM */
764524
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal, de même que ce que fait le séquenceur mémoire.
===L'interface avec la SDRAM est différente===
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===L'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
eki0tr80df3rjvfwxb3wkgm9g9lbmji
764525
764524
2026-04-22T20:29:14Z
Mewtow
31375
/* L'entrelacement mémoire des SDRAM */
764525
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
===Les succès et défauts de page avec une plusieurs banques===
Maintenant, qu'en est-il si le contrôleur mémoire est relié à plusieurs mémoires FPM, plusieurs banques ? Dans ce cas, il ne suffit pas de mémoriser l'adresse de ligne, il faut aussi vérifier les numéros de banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal, de même que ce que fait le séquenceur mémoire.
===L'interface avec la SDRAM est différente===
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
ewnctvzhl36gd3olu7m8ovshhgy3lk5
764526
764525
2026-04-22T20:29:49Z
Mewtow
31375
/* Les succès et défauts de page avec une plusieurs banques */
764526
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal, de même que ce que fait le séquenceur mémoire.
===L'interface avec la SDRAM est différente===
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
buiy85tltqf1fpxnw7di8kqlh7gunpu
764527
764526
2026-04-22T20:31:46Z
Mewtow
31375
/* Les banques et l'entrelacement mémoire des SDRAM */
764527
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal, de même que ce que fait le séquenceur mémoire.
===L'interface avec la SDRAM est différente===
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
sgukf2s5wj38kps0cvkreo58r10ghak
764528
764527
2026-04-22T20:32:06Z
Mewtow
31375
/* Le contrôleur mémoire d'une SDRAM ou d'une DDR */
764528
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal, de même que ce que fait le séquenceur mémoire.
===L'interface avec la SDRAM est différente===
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
tluk2hj6pvgasypa1l629r4b9fhewac
764529
764528
2026-04-22T20:32:23Z
Mewtow
31375
/* Le contrôleur mémoire d'une SDRAM ou d'une DDR */
764529
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
oo67xmei58706cv88tu3ngcfmjtccv7
764530
764529
2026-04-22T20:34:18Z
Mewtow
31375
/* Les banques et l'entrelacement mémoire des SDRAM */
764530
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
La présence de banques séparées est aussi une source d'optimisation. Le fait que les banques soient totalement indépendantes, fait qu'on peut accéder à plusieurs banques en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. mais pour exploiter cette possibilité, il faut ajouter quelques optimisations supplémentaires.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le controleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l'''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
fmfnr1xwyhn0hspw3fnuoecxtdi4vih
764531
764530
2026-04-22T20:40:11Z
Mewtow
31375
/* Les banques et l'entrelacement mémoire des SDRAM */
764531
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
La présence de banques séparées est aussi une source d'optimisation. Le fait que les banques soient totalement indépendantes, fait qu'on peut accéder à plusieurs banques en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. Mais pour exploiter cette possibilité, il faut ajouter quelques optimisations supplémentaires.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatres blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="5" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|-
| colspan="5" |
|-
! colspan="5" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
a2tk4xqzjmptvr57hqvaakqegz9r39b
764532
764531
2026-04-22T20:41:38Z
Mewtow
31375
/* Les banques et l'entrelacement mémoire des SDRAM */
764532
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
La présence de banques séparées est aussi une source d'optimisation. Le fait que les banques soient totalement indépendantes, fait qu'on peut accéder à plusieurs banques en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. Mais pour exploiter cette possibilité, il faut ajouter quelques optimisations supplémentaires.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatres blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="5" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Octet dans 64 bits
|-
| colspan="5" |
|-
! colspan="5" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Octet dans 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
faimb7nni5bci1xtu6qwt88r5mve23h
764533
764532
2026-04-22T20:42:03Z
Mewtow
31375
/* Les banques et l'entrelacement mémoire des SDRAM */
764533
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
La présence de banques séparées est aussi une source d'optimisation. Le fait que les banques soient totalement indépendantes, fait qu'on peut accéder à plusieurs banques en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. Mais pour exploiter cette possibilité, il faut ajouter quelques optimisations supplémentaires.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatres blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="5" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="5" |
|-
! colspan="5" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
0r7da3748m2d3mey8jhj2vup65o5pdq
764534
764533
2026-04-22T20:42:17Z
Mewtow
31375
/* Les banques et l'entrelacement mémoire des SDRAM */
764534
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
===Les succès et défauts de page avec une seule banque===
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
La présence de banques séparées est aussi une source d'optimisation. Le fait que les banques soient totalement indépendantes, fait qu'on peut accéder à plusieurs banques en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. Mais pour exploiter cette possibilité, il faut ajouter quelques optimisations supplémentaires.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
k80ao4g9rii04ph2kwcdfor6rt7z19z
764535
764534
2026-04-22T20:43:15Z
Mewtow
31375
/* Les succès et défauts de page avec une seule banque */
764535
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
La présence de banques séparées est aussi une source d'optimisation. Le fait que les banques soient totalement indépendantes, fait qu'on peut accéder à plusieurs banques en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. Mais pour exploiter cette possibilité, il faut ajouter quelques optimisations supplémentaires.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
3luwnp1gsdawgvp7w569bzim4fhilrb
764539
764535
2026-04-22T21:36:34Z
Mewtow
31375
/* Les banques et l'entrelacement mémoire des SDRAM */
764539
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les DDR2 et 3 relaxent cependant ces contraintes avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande ACT et 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 SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). La machine à état tient compte de cette possibilité.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
La présence de banques séparées est aussi une source d'optimisation. Le fait que les banques soient totalement indépendantes, fait qu'on peut accéder à plusieurs banques en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. Mais pour exploiter cette possibilité, il faut ajouter quelques optimisations supplémentaires.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
2ymmpkze3ukvk6cej8kyw6fiigw6ufs
764544
764539
2026-04-22T21:52:14Z
Mewtow
31375
/* Le séquenceurs mémoire pour les SDRAM/DDR */
764544
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). Il s'agit d'une forme très limitée de pipeline, qui ne mérite pas d'être détaillée ici, mais il faut préciser que la machine à état tient compte de cette possibilité. L'exploiter demande d'avoir plusieurs accès mémoire simultanés à une même ligne, ce qui arrive quand on échange des données entre mémoire et cache. Les transferts entre cache et RAM se font par blocs qui demandent de faire plusieurs accès en rafale succesifs, ce qui fait que l'on peut alors avoir de tels "commandes anticipées".
[[File:EDO RAM.png|centre|vignette|upright=2|Pipelining sur une mémoire SDRAM, très similaire à celle d'une mémoire EDO.]]
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 ACT et 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.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
La présence de banques séparées est aussi une source d'optimisation. Le fait que les banques soient totalement indépendantes, fait qu'on peut accéder à plusieurs banques en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. Mais pour exploiter cette possibilité, il faut ajouter quelques optimisations supplémentaires.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
dcc3jlzjnzwszr1kaqfcwm4vavna5lq
764545
764544
2026-04-22T21:52:21Z
Mewtow
31375
/* Le séquenceurs mémoire pour les SDRAM/DDR */
764545
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). Il s'agit d'une forme très limitée de pipeline, qui ne mérite pas d'être détaillée ici, mais il faut préciser que la machine à état tient compte de cette possibilité. L'exploiter demande d'avoir plusieurs accès mémoire simultanés à une même ligne, ce qui arrive quand on échange des données entre mémoire et cache. Les transferts entre cache et RAM se font par blocs qui demandent de faire plusieurs accès en rafale succesifs, ce qui fait que l'on peut alors avoir de tels "commandes anticipées".
[[File:EDO RAM.png|centre|vignette|upright=3|Pipelining sur une mémoire SDRAM, très similaire à celle d'une mémoire EDO.]]
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 ACT et 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.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
La présence de banques séparées est aussi une source d'optimisation. Le fait que les banques soient totalement indépendantes, fait qu'on peut accéder à plusieurs banques en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. Mais pour exploiter cette possibilité, il faut ajouter quelques optimisations supplémentaires.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
e8zy6u21hnkmgteduhzpojja1wlqejj
764546
764545
2026-04-22T22:00:51Z
Mewtow
31375
/* Le séquenceurs mémoire pour les SDRAM/DDR */
764546
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les SDRAM sont capables d'envoyer une commande ACT pendant que l'accès précédent envoie des données sur le bus de données (un cycle après une commande READ, par exemple). Il s'agit d'une forme très limitée de pipeline, qui ne mérite pas d'être détaillée ici, mais il faut préciser que la machine à état tient compte de cette possibilité. L'exploiter demande d'avoir plusieurs accès mémoire simultanés à une même ligne, ce qui arrive quand on échange des données entre mémoire et cache. Les transferts entre cache et RAM se font par blocs qui demandent de faire plusieurs accès en rafale succesifs, ce qui fait que l'on peut alors avoir de tels "commandes anticipées".
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | 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 ACT et 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.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
La présence de banques séparées est aussi une source d'optimisation. Le fait que les banques soient totalement indépendantes, fait qu'on peut accéder à plusieurs banques en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. Mais pour exploiter cette possibilité, il faut ajouter quelques optimisations supplémentaires.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
2w5eibwepee6lxw79zlwipwpy0zv046
764547
764546
2026-04-22T22:03:17Z
Mewtow
31375
/* Le séquenceurs mémoire pour les SDRAM/DDR */
764547
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
Les SDRAM sont parfois capables de traiter une commande pendant que la commande précédente est en cours de traitement. Concrètement, pendant que la commande précédente envoie des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Il s'agit d'une forme très limitée de pipeline, qui ne mérite pas d'être détaillée ici, mais il faut préciser que la machine à état tient compte de cette possibilité. L'exploiter demande d'avoir plusieurs accès mémoire simultanés à une même ligne, ce qui arrive quand on échange des données entre mémoire et cache. Les transferts entre cache et RAM se font par blocs qui demandent de faire plusieurs accès en rafale succesifs, ce qui fait que l'on peut alors avoir de tels "commandes anticipées".
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 ACT et 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.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
La présence de banques séparées est aussi une source d'optimisation. Le fait que les banques soient totalement indépendantes, fait qu'on peut accéder à plusieurs banques en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. Mais pour exploiter cette possibilité, il faut ajouter quelques optimisations supplémentaires.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
3h7y0pdzvr1jmzb16ilsr4bfuwhlmig
764550
764547
2026-04-22T22:17:06Z
Mewtow
31375
/* Le séquenceurs mémoire pour les SDRAM/DDR */
764550
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
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 des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Il s'agit d'une forme très limitée de pipeline, qui ne mérite pas d'être détaillée ici, mais il faut préciser que la machine à état tient compte de cette possibilité. L'exploiter demande d'avoir plusieurs accès mémoire simultanés à une même ligne, ce qui arrive quand on échange des données entre mémoire et cache. Les transferts entre cache et RAM se font par blocs qui demandent de faire plusieurs accès en rafale successifs, ce qui fait que le contrôleur mémoire peut utiliser de tels "commandes anticipées".
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 ACT et 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.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
La présence de banques séparées est aussi une source d'optimisation. Le fait que les banques soient totalement indépendantes, fait qu'on peut accéder à plusieurs banques en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. Mais pour exploiter cette possibilité, il faut ajouter quelques optimisations supplémentaires.
L''''entrelacement''' est une optimisation qui consiste à placer des adresses consécutives dans des banques différentes. Nous en avons parlé dans le chapitre sur les mémoires évoluées, mais nous n'allons pas faire de rappels, pour une raison simple : ce qu'on a vu dans ce chapitre est inapplicable pour les SDRAM. En effet, avec les DRAM, le tout est compliqué par le fait que les DRAM incorporent un tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Tout cela complexifie grandement l'entrelacement.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée.
Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
2k76hcrh5pcs741y0q8yxgflradu6tj
764564
764550
2026-04-22T23:03:34Z
Mewtow
31375
/* Les banques et l'entrelacement mémoire des SDRAM */
764564
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
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 des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Il s'agit d'une forme très limitée de pipeline, qui ne mérite pas d'être détaillée ici, mais il faut préciser que la machine à état tient compte de cette possibilité. L'exploiter demande d'avoir plusieurs accès mémoire simultanés à une même ligne, ce qui arrive quand on échange des données entre mémoire et cache. Les transferts entre cache et RAM se font par blocs qui demandent de faire plusieurs accès en rafale successifs, ce qui fait que le contrôleur mémoire peut utiliser de tels "commandes anticipées".
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 ACT et 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.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
La présence de banques séparées est aussi une source d'optimisation. Le fait que les banques soient totalement indépendantes, fait qu'on peut accéder à plusieurs banques en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. Mais pour exploiter cette possibilité, il faut ajouter quelques optimisations supplémentaires.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
d2hfew4zkatcwvl0y1n4tm7b0jioyes
764565
764564
2026-04-22T23:04:38Z
Mewtow
31375
/* Les banques et l'entrelacement mémoire des SDRAM */
764565
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'était pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
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 des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Il s'agit d'une forme très limitée de pipeline, qui ne mérite pas d'être détaillée ici, mais il faut préciser que la machine à état tient compte de cette possibilité. L'exploiter demande d'avoir plusieurs accès mémoire simultanés à une même ligne, ce qui arrive quand on échange des données entre mémoire et cache. Les transferts entre cache et RAM se font par blocs qui demandent de faire plusieurs accès en rafale successifs, ce qui fait que le contrôleur mémoire peut utiliser de tels "commandes anticipées".
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 ACT et 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.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
9s4452fp5q7m9lldcamxsjjb8yei61r
764572
764565
2026-04-22T23:26:55Z
Mewtow
31375
/* Les contrôleurs mémoires multiports */
764572
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
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 des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Il s'agit d'une forme très limitée de pipeline, qui ne mérite pas d'être détaillée ici, mais il faut préciser que la machine à état tient compte de cette possibilité. L'exploiter demande d'avoir plusieurs accès mémoire simultanés à une même ligne, ce qui arrive quand on échange des données entre mémoire et cache. Les transferts entre cache et RAM se font par blocs qui demandent de faire plusieurs accès en rafale successifs, ce qui fait que le contrôleur mémoire peut utiliser de tels "commandes anticipées".
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 ACT et 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.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
mddjtxq455h2eq0gcnbqtxz5lj9j2a2
764585
764572
2026-04-23T00:05:51Z
Mewtow
31375
/* Le séquenceurs mémoire pour les SDRAM/DDR */
764585
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
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 des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours. Il s'agit d'une forme très limitée de pipeline, qui ne mérite pas d'être détaillée ici, mais il faut préciser que la machine à état tient compte de cette possibilité.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Par contre, il y a une contrainte majeure : deux accès simultanés ne peuvent pas accéder au bus en même temps. Je rappelle que quand on démarre une lecture, il se passe quelques cycles d'horloge avant que la donnée atterrissent sur le bus de données. Le temps en question est fixe, mais sa durée n'est pas la même selon que la lecture fasse un succès de page ou un défaut de page. Le séquence mémoire doit en tenir compte avant de démarrer une lecture ou une écriture. Le séquenceur doit donc détecter les succès de page, et déterminer si le bus de donnée sera libre au moment où la lecture terminera. Si c'est le cas, il peut lancer a commande.
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 ACT et 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.
Le séquenceur peut aussi profiter du fait que des accès simultanés peuvent se faire de préférence se faire dans des banques différentes. Prenons l'exemple d'une mémoire partagée entre plusieurs processeurs. Les deux processeurs ou cœurs exécutent deux programmes différents : le premier processeur exécute le navigateur web, alors que le second lit de la musique. Dans ce cas, les deux processeurs accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple), qui sont potentiellement dans des banques séparées.
Le contrôleur mémoire reçoit des requêtes mémoires des deux processeurs, mais il les exécute sur la SDRAM. Il détecte alors si les accès mémoire tombent dans des banques séparées ou non. Si c'est le cas, il lance des commandes séparées sur des banques séparée. Concrètement, dans l'exemple plus haut, les requêtes du premier processeur tomberont dans la banque numéro 5, alors que l'autre processeur accédera à la banque numéro 205. Le contrôleur mémoire peut alors lancer deux commandes presque en même temps : la première atterrit dans une banque, la seconde atterrit dans une autre banque.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10
|-
! Bus de commande/adresse
| || bgcolor="#A0FFFF" | Lecture (CPU 1) || bgcolor="#FFA0FF" | Lecture (CPU 2) || || bgcolor="#A0FFFF" | Lecture (CPU 1) || || bgcolor="#FFA0FF" | Lecture (CPU 2) || ||
|-
! Bus de données
| || || || bgcolor="#A0FFFF" | Donnée lue CPU 1 || bgcolor="#FFA0FF" | Donnée lue CPU 2 || || bgcolor="#A0FFFF" | Donnée lue CPU 1 || ||bgcolor="#FFA0FF" | Donnée lue CPU 2
|}
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
gu0u2povk941at2yuvic53ffaaaeabb
764586
764585
2026-04-23T00:07:38Z
Mewtow
31375
/* Le séquenceurs mémoire pour les SDRAM/DDR */
764586
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
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 des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours. Il s'agit d'une forme très limitée de pipeline, qui ne mérite pas d'être détaillée ici, mais il faut préciser que la machine à état tient compte de cette possibilité.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Le séquenceur peut aussi profiter du fait que des accès simultanés peuvent se faire de préférence se faire dans des banques différentes. Prenons l'exemple d'une mémoire partagée entre plusieurs processeurs. Les deux processeurs ou cœurs exécutent deux programmes différents : le premier processeur exécute le navigateur web, alors que le second lit de la musique. Dans ce cas, les deux processeurs accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple), qui sont potentiellement dans des banques séparées.
Par contre, il y a une contrainte majeure : deux accès simultanés ne peuvent pas accéder au bus en même temps. Je rappelle que quand on démarre une lecture, il se passe quelques cycles d'horloge avant que la donnée atterrissent sur le bus de données. Le temps en question est fixe, mais sa durée n'est pas la même selon que la lecture fasse un succès de page ou un défaut de page. Le séquence mémoire doit en tenir compte avant de démarrer une lecture ou une écriture. Le séquenceur doit donc détecter les succès de page, et déterminer si le bus de donnée sera libre au moment où la lecture terminera. Si c'est le cas, il peut lancer a commande.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10
|-
! Bus de commande/adresse
| || bgcolor="#A0FFFF" | Lecture (CPU 1) || bgcolor="#FFA0FF" | Lecture (CPU 2) || || bgcolor="#A0FFFF" | Lecture (CPU 1) || || bgcolor="#FFA0FF" | Lecture (CPU 2) || ||
|-
! Bus de données
| || || || bgcolor="#A0FFFF" | Donnée lue CPU 1 || bgcolor="#FFA0FF" | Donnée lue CPU 2 || || bgcolor="#A0FFFF" | Donnée lue CPU 1 || ||bgcolor="#FFA0FF" | Donnée lue CPU 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 ACT et 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.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
dqhupqqo5rsrhjfj6zmmky6el58b4s8
764587
764586
2026-04-23T00:10:50Z
Mewtow
31375
/* Le séquenceurs mémoire pour les SDRAM/DDR */
764587
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
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 des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours. Il s'agit d'une forme très limitée de pipeline, qui ne mérite pas d'être détaillée ici, mais il faut préciser que la machine à état tient compte de cette possibilité.
{|class="wikitable"
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Le séquenceur peut aussi profiter du fait que des accès simultanés peuvent se faire de préférence se faire dans des banques différentes. Prenons l'exemple d'une mémoire partagée entre plusieurs processeurs. Les deux processeurs ou cœurs exécutent deux programmes différents : le premier processeur exécute le navigateur web, alors que le second lit de la musique. Dans ce cas, les deux processeurs accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple), qui sont potentiellement dans des banques séparées.
Par contre, il y a une contrainte majeure : deux accès simultanés ne peuvent pas accéder au bus en même temps. Je rappelle que quand on démarre une lecture, il se passe quelques cycles d'horloge avant que la donnée atterrissent sur le bus de données. Le temps en question est fixe, mais sa durée n'est pas la même selon que la lecture fasse un succès de page ou un défaut de page. Le séquence mémoire doit en tenir compte avant de démarrer une lecture ou une écriture. Le séquenceur doit donc détecter les succès de page, et déterminer si le bus de donnée sera libre au moment où la lecture terminera. Si c'est le cas, il peut lancer a commande.
{|class="wikitable"
|+ Exemple où deux processeurs accèdent à une SDRAM en même temps
|-
! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10
|-
! rowspan="2" | Requêtes mémoires
| bgcolor="#A0FFFF" | CPU 1 || || || bgcolor="#A0FFFF" | CPU 1 || || || || || ||
|-
| bgcolor="#FFA0FF" | CPU 2 || || || || || bgcolor="#FFA0FF" | CPU 2 || || || ||
|-
|-
! Bus de commande/adresse
| || bgcolor="#A0FFFF" | Lecture (CPU 1) || bgcolor="#FFA0FF" | Lecture (CPU 2) || || bgcolor="#A0FFFF" | Lecture (CPU 1) || || bgcolor="#FFA0FF" | Lecture (CPU 2) || ||
|-
! Bus de données
| || || || bgcolor="#A0FFFF" | Donnée lue CPU 1 || bgcolor="#FFA0FF" | Donnée lue CPU 2 || || bgcolor="#A0FFFF" | Donnée lue CPU 1 || || bgcolor="#FFA0FF" | Donnée lue CPU 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 ACT et 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.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
mq6zsyrkgw7ivzkk6wef5b9rctjc0f8
764588
764587
2026-04-23T00:11:10Z
Mewtow
31375
/* Le séquenceurs mémoire pour les SDRAM/DDR */
764588
wikitext
text/x-wiki
Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM.
Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Il est placé sur la carte mère ou dans le processeur, et ne doit pas être confondu avec le contrôleur mémoire intégré dans la mémoire.
Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. Aussi, il y a aura une différence entre un contrôleur pour une DRAM asynchrone et un contrôleur pour une mémoire EDO, une mémoire SDRAM, etc. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR.
==Le contrôleur d'une DRAM asynchrone==
Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données.
===L'interface d'un contrôleur de DRAM asynchrone===
L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système.
Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous.
[[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]]
Un point important est que les DRAM asynchrones 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''.
Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion.
Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone.
Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM.
===Le générateur de ''timings'' et la traduction d'adresse===
Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides.
Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures.
[[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]]
Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne.
La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''.
[[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]]
Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives.
===Le rafraichissement mémoire===
La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements.
Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0.
Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant.
Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement.
[[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]]
Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci.
[[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]]
Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse.
===Le décodage d'adresse===
Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'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. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===Exemple : l'Intel 8202-8203===
L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée.
Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante :
[[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]]
Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''.
Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur.
Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse).
Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée.
: Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour.
L'intel 8202 était un contrôleur mémoire basique. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Il avait plusieurs fonctionnalités en plus du 8202/8203. Les adresses d'entrée étaient mémorisées dans des registres pour de meilleures performances. Il pouvait gérer jusqu'à 256 kibioctets de DRAM. Mais auèdelà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Voyons comment cela était possible.
===Les contrôleurs mémoire synchrone===
Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour.
[[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]]
Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire.
[[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]]
: Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone.
Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''.
Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur.
===La gestion de l'ECC===
L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur.
[[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]]
Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela.
[[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]]
La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire.
Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu.
===Les contrôleurs mémoires multiports===
Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure.
Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente.
Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité.
Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement.
==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''==
Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne.
Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne.
[[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]]
==Le contrôleur mémoire d'une SDRAM ou d'une DDR==
l'intérieur d'un contrôleur de SDRAM ne change pas significativement d'un controleur de RAM asynchrone. Il regroupe toujours un séquenceur mémoire et une interface physique, un circuit pour le rafraichissement mémoire et un circuit d'arbitrage. Par contre, ses sorties changent pas mal.
Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela.
: Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur.
Pour le décodage d'adresse, tout est plus simple sur les SDRAM, DDR inclues. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou 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, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite.
===Le séquenceurs mémoire pour les SDRAM/DDR===
Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe.
Pour rappel, une requête de lecture/écriture se fait en trois étapes : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et il faut tenir compte des timings mémoire, à savoir le fait que ces commandes sont séparées par des temps d'attentes bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des ''timings'' rend la conception du séquenceur plus complexe.
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 des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours. Il s'agit d'une forme très limitée de pipeline, qui ne mérite pas d'être détaillée ici, mais il faut préciser que la machine à état tient compte de cette possibilité.
{|class="wikitable"
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Le séquenceur peut aussi profiter du fait que des accès simultanés peuvent se faire de préférence se faire dans des banques différentes. Prenons l'exemple d'une mémoire partagée entre plusieurs processeurs. Les deux processeurs ou cœurs exécutent deux programmes différents : le premier processeur exécute le navigateur web, alors que le second lit de la musique. Dans ce cas, les deux processeurs accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple), qui sont potentiellement dans des banques séparées.
Par contre, il y a une contrainte majeure : deux accès simultanés ne peuvent pas accéder au bus en même temps. Je rappelle que quand on démarre une lecture, il se passe quelques cycles d'horloge avant que la donnée atterrissent sur le bus de données. Le temps en question est fixe, mais sa durée n'est pas la même selon que la lecture fasse un succès de page ou un défaut de page. Le séquence mémoire doit en tenir compte avant de démarrer une lecture ou une écriture. Le séquenceur doit donc détecter les succès de page, et déterminer si le bus de donnée sera libre au moment où la lecture terminera. Si c'est le cas, il peut lancer a commande. Sinon, il doit la retarder.
{|class="wikitable"
|+ Exemple où deux processeurs accèdent à une SDRAM en même temps
|-
! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10
|-
! rowspan="2" | Requêtes mémoires
| bgcolor="#A0FFFF" | CPU 1 || || || bgcolor="#A0FFFF" | CPU 1 || || || || || ||
|-
| bgcolor="#FFA0FF" | CPU 2 || || || || || bgcolor="#FFA0FF" | CPU 2 || || || ||
|-
|-
! Bus de commande/adresse
| || bgcolor="#A0FFFF" | Lecture (CPU 1) || bgcolor="#FFA0FF" | Lecture (CPU 2) || || bgcolor="#A0FFFF" | Lecture (CPU 1) || || bgcolor="#FFA0FF" | Lecture (CPU 2) || ||
|-
! Bus de données
| || || || bgcolor="#A0FFFF" | Donnée lue CPU 1 || bgcolor="#FFA0FF" | Donnée lue CPU 2 || || bgcolor="#A0FFFF" | Donnée lue CPU 1 || || bgcolor="#FFA0FF" | Donnée lue CPU 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 ACT et 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.
===La politique de gestion du tampon de ligne===
Plus haut, nous avons parlé des mémoires FPM, qui ont introduit quelques optimisations pour utiliser au mieux le tampon de ligne. Il se trouve que les SDRAM conservent ces optimisations. Il y a toujours cette notion de succès de page et de défaut de page, suivant que deux accès se font dans la même ligne ou dans deux lignes différentes. Du moins, c'est le cas si le séquenceur mémoire est coopératif. En effet, il peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent.
Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''.
Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Son seul avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page.
De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE.
A l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est.
Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents.
Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps.
Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. La méthode la plus simple attend un temps prédéterminé avant de fermer la ligne. Une autre solution regarde le tout dernier accès. On peut très bien décider de laisser la ligne ouverte si l'accès mémoire précédent était une rafale, et fermer sinon.
Une solution plus complexe mémorise les N derniers accès et en déduit s'il faut fermer ou non la prochaine ligne. On peut mémoriser si l'accès en question a causé la fermeture d'une ligne avec un bit. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une solution simple fait la moyenne des bits à 1 dans ce registre : si plus de la moitié des bits est à 1, on laisse la ligne ouverte et on ferme sinon. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes.
: Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque.
===Les banques et l'entrelacement mémoire des SDRAM===
Les SDRAM incorporent plusieurs banques à l'intérieur de leurs circuits. Pour rappel, une banque est une sous-mémoire, avec ses propres décodeurs, son tampon de ligne, ses multiplexeurs de colonnes, etc. Pour le dire autrement, une SDRAM regroupe plusieurs mémoires séparées dans un même circuit intégré, les mémoires en question étant des banques.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
La présence de plusieurs banques impacte la gestion des lignes ouvertes/fermées. En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''.
Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon.
[[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires RAM dynamiques (DRAM)
| prevText=Les mémoires RAM dynamiques (DRAM)
| next=Les mémoires associatives
| nextText=Les mémoires associatives
}}
</noinclude>
l9p2kyryestbv8oshzynw6lfnslzpw3
Fonctionnement d'un ordinateur/Mémoires évoluées
0
65800
764457
748631
2026-04-22T15:16:12Z
Mewtow
31375
/* L'entrelacement basique */
764457
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule, ce qui libère le processeur durant quelques cycles et lui économise du travail. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les banques et rangées==
Sur certaines puces mémoires, un seul boitier peut contenir plusieurs mémoires indépendantes regroupées pour former une mémoire unique plus grosse. Chaque sous-mémoire indépendante est appelée une '''banque''', ou encore un banc mémoire. La mémoire obtenue par combinaison de plusieurs banques est appelée une mémoire multi-banques. Cette technique peut servir à améliorer les performances, la consommation d'énergie, et j'en passe. Par exemple, cela permet de faciliter le rafraichissement d'une mémoire DRAM : on peut rafraichir chaque sous-mémoire en parallèle, indépendamment des autres. Mais cette technique est principalement utilisée pour doubler le nombre d'adresses, doubler la taille d'un mot mémoire, ou faire les deux.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2|Mémoire multi-banques.]]
===L'arrangement horizontal===
L''''arrangement horizontal''' utilise plusieurs banques pour augmenter la taille d'un mot mémoire sans changer le nombre d'adresses. Chaque banc mémoire contient une partie du mot mémoire final. Avec cette organisation, on accède à tous les bancs en parallèle à chaque accès, avec la même adresse.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour l'exemple, les barrettes de mémoires SDRAM ou DDR-RAM des PC actuels possèdent un mot mémoire de 64 bits, mais sont en réalité composées de 8 sous-mémoires ayant un mot mémoire de 8 bits. Cela permet de répartir la production de chaleur sur la barrette : la production de chaleur est répartie entre plusieurs puces, au lieu d'être concentrée dans la puce en cours d'accès.
===L'arrangement vertical===
L''''arrangement vertical''' rassemble plusieurs boitiers de mémoires pour augmenter la capacité sans changer la taille d'un mot mémoire. On utilisera un boitier pour une partie de la mémoire, un autre boitier pour une autre, et ainsi de suite. Toutes les banques sont reliées au bus de données, qui a la même largeur que les sorties des banques. Une partie de l'adresse est utilisée pour choisir à quelle banque envoyer les bits restants de l'adresse. Les autres banques sont désactivées. Mais un arrangement vertical peut se mettre en œuvre de plusieurs manières différentes.
La première méthode consiste à connecter la bonne banque et déconnecter toutes les autres. Pour cela, on utilise la broche CS, qui connecte ou déconnecte la mémoire du bus. Cette broche est commandée par un décodeur, qui prend les bits de poids forts de l'adresse en entrée.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Une autre solution est d'ajouter un multiplexeur/démultiplexeur en sortie des banques et de commander celui-ci convenablement avec les bits de poids forts. Le multiplexeur sert pur les lectures, le démultiplexeur pour les écritures.
[[File:Circuits d'une mémoire interleaved par rafale.png|centre|vignette|upright=2|Circuits d'une mémoire interleaved par rafale.]]
Sans la technique dite de l'entrelacement, qu'on verra dans la section suivante, on utilise les bits de poids forts pour sélectionner la banque, ce qui fait que les adresses sont réparties comme illustré dans le schéma ci-dessous. Un défaut de cette organisation est que, si on souhaite lire/écrire deux mots mémoires consécutifs, on devra attendre que l'accès au premier mot soit fini avant de pouvoir accéder au suivant (vu que ceux-ci sont dans la même banque).
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Si on mélange l'arrangement vertical et l'arrangement horizontal, on obtient ce que l'on appelle une rangée. Sur ces mémoires, les adresses sont découpées en trois morceaux, un pour sélectionner la rangée, un autre la banque, puis la ligne et la colonne.
==L'entrelacement (''interleaving'')==
La technique de l''''entrelacement''' utilise un arrangement vertical assez spécifique, afin de gagner en performance. Avec une mémoire sans entrelacement, on doit attendre qu'un accès mémoire soit fini avant d'en démarrer un autre. Avec l'entrelacement, on peut réaliser un accès mémoire sans attendre que les précédents soient finis. L'idée est d’accéder à plusieurs banques en parallèles. Pendant qu'une banque est occupée par un accès mémoire, on en démarre un nouveau dans une autre banque, et ainsi de suite jusqu’à avoir épuisé toutes les banques libres. L'organisation en question se marie bien avec l'accès en rafale, si des adresses consécutives sont placés dans des banques séparées.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. Cela implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===L'entrelacement basique===
Sans entrelacement, les accès séquentiels se font dans la même banque, ce qui les rend assez lents. Mais il est possible d'accélérer les accès à des adresses consécutives en rusant quelque peu. L'idée est que des accès consécutifs se fassent dans des banques différentes, et donc que des adresses consécutives soient localisés dans des banques différentes. Les mémoires qui fonctionnent sur ce principe sont appelées des '''mémoires à entrelacement simple'''.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Pour cela, il suffit de prendre une mémoire à arrangement vertical, avec un petit changement : il faut utiliser les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
En faisant cela, on peut accéder à un plusieurs cases mémoire consécutives assez rapidement. Cela rend les accès en rafale plus rapide. Pour cela, deux méthodes sont possibles.
La première méthode utilise un accès en parallèle aux banques, d'où son nom d'accès entrelacé parallèle. Sans entrelacement, on doit accéder à chaque banque l'une après l'autre, en lisant chaque case mémoire l'un après l'autre. Avec l’entrelacement parallèle, on lit plusieurs cases mémoire consécutives en même temps, en accédant à toutes les banques en même temps, avant d'envoyer chaque mot mémoire l'une après l'autre sur le bus (ce qui demande juste de configurer le multiplexeur). Un tel accès est dit en rafale : on envoie une adresse, puis on récupère plusieurs adresses consécutives à partir de cette adresse initiale.
Une autre méthode démarre un nouvel accès mémoire à chaque cycle d'horloge, pour lire des mot mémoire consécutifs un par un, mais chaque accès se fera dans une banque différente. En faisant cela, on n’a pas à attendre que la première banque ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. Il s'agit d'une forme de pipelining, qui fait que l'accès à des mots mémoire consécutifs est rendu plus rapide.
===Les mémoires à entrelacement par décalage===
Les mémoires à entrelacement simple ont un petit problème : sur une mémoire à N banques, des accès dont les adresses sont séparées par N mots mémoires vont tous tomber dans la même banque et seront donc impossibles à pipeliner. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement. Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
0nksyqpy6m3i5kju5pnuz53tbsidol8
764472
764457
2026-04-22T16:54:39Z
Mewtow
31375
/* L'arrangement vertical */
764472
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule, ce qui libère le processeur durant quelques cycles et lui économise du travail. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les banques et rangées==
Sur certaines puces mémoires, un seul boitier peut contenir plusieurs mémoires indépendantes regroupées pour former une mémoire unique plus grosse. Chaque sous-mémoire indépendante est appelée une '''banque''', ou encore un banc mémoire. La mémoire obtenue par combinaison de plusieurs banques est appelée une mémoire multi-banques. Cette technique peut servir à améliorer les performances, la consommation d'énergie, et j'en passe. Par exemple, cela permet de faciliter le rafraichissement d'une mémoire DRAM : on peut rafraichir chaque sous-mémoire en parallèle, indépendamment des autres. Mais cette technique est principalement utilisée pour doubler le nombre d'adresses, doubler la taille d'un mot mémoire, ou faire les deux.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2|Mémoire multi-banques.]]
===L'arrangement horizontal===
L''''arrangement horizontal''' utilise plusieurs banques pour augmenter la taille d'un mot mémoire sans changer le nombre d'adresses. Chaque banc mémoire contient une partie du mot mémoire final. Avec cette organisation, on accède à tous les bancs en parallèle à chaque accès, avec la même adresse.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour l'exemple, les barrettes de mémoires SDRAM ou DDR-RAM des PC actuels possèdent un mot mémoire de 64 bits, mais sont en réalité composées de 8 sous-mémoires ayant un mot mémoire de 8 bits. Cela permet de répartir la production de chaleur sur la barrette : la production de chaleur est répartie entre plusieurs puces, au lieu d'être concentrée dans la puce en cours d'accès.
===L'arrangement vertical===
L''''arrangement vertical''' rassemble plusieurs chips mémoire pour augmenter la capacité mémoire, mais sans changer la taille d'un mot mémoire. Sans la technique dite de l'entrelacement, qu'on verra dans la section suivante, les adresses sont réparties comme illustré dans le schéma ci-dessous. Par exemple, si je combine quatre mémoires de 1 mébioctet pour obtenir 4 mébioctets, le premier mébioctet sera dans le premier chip mémoire, le seconde mébioctet sera dans le second chip, et ainsi de suite. 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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
L'arrangement vertical peut être implémenté de plusieurs manières. Mais le principe global reste le même : une partie de l'adresse est utilisée sélectionner un chip mémoire, le reste de l'adresse est envoyé à ce chip mémoire. Sans entrelacement, on utilise les bits de poids forts pour sélectionner la banque.
La première consiste à connecter la bonne banque et déconnecter toutes les autres. Pour cela, on utilise la broche CS, qui connecte ou déconnecte la mémoire du bus. Cette broche est commandée par un décodeur, qui prend les bits de poids forts de l'adresse en entrée.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Une autre solution est d'ajouter un multiplexeur/démultiplexeur en sortie des banques et de commander celui-ci convenablement avec les bits de poids forts. Il y a plus précisément un multiplexeur pour les lectures, et un démultiplexeur pour les écritures.
[[File:Circuits d'une mémoire interleaved par rafale.png|centre|vignette|upright=2|Circuits d'une mémoire interleaved par rafale.]]
Si on mélange l'arrangement vertical et l'arrangement horizontal, on obtient ce que l'on appelle une rangée. Sur ces mémoires, les adresses sont découpées en trois morceaux, un pour sélectionner la rangée, un autre la banque, puis la ligne et la colonne.
==L'entrelacement (''interleaving'')==
La technique de l''''entrelacement''' utilise un arrangement vertical assez spécifique, afin de gagner en performance. Avec une mémoire sans entrelacement, on doit attendre qu'un accès mémoire soit fini avant d'en démarrer un autre. Avec l'entrelacement, on peut réaliser un accès mémoire sans attendre que les précédents soient finis. L'idée est d’accéder à plusieurs banques en parallèles. Pendant qu'une banque est occupée par un accès mémoire, on en démarre un nouveau dans une autre banque, et ainsi de suite jusqu’à avoir épuisé toutes les banques libres. L'organisation en question se marie bien avec l'accès en rafale, si des adresses consécutives sont placés dans des banques séparées.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. Cela implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===L'entrelacement basique===
Sans entrelacement, les accès séquentiels se font dans la même banque, ce qui les rend assez lents. Mais il est possible d'accélérer les accès à des adresses consécutives en rusant quelque peu. L'idée est que des accès consécutifs se fassent dans des banques différentes, et donc que des adresses consécutives soient localisés dans des banques différentes. Les mémoires qui fonctionnent sur ce principe sont appelées des '''mémoires à entrelacement simple'''.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Pour cela, il suffit de prendre une mémoire à arrangement vertical, avec un petit changement : il faut utiliser les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
En faisant cela, on peut accéder à un plusieurs cases mémoire consécutives assez rapidement. Cela rend les accès en rafale plus rapide. Pour cela, deux méthodes sont possibles.
La première méthode utilise un accès en parallèle aux banques, d'où son nom d'accès entrelacé parallèle. Sans entrelacement, on doit accéder à chaque banque l'une après l'autre, en lisant chaque case mémoire l'un après l'autre. Avec l’entrelacement parallèle, on lit plusieurs cases mémoire consécutives en même temps, en accédant à toutes les banques en même temps, avant d'envoyer chaque mot mémoire l'une après l'autre sur le bus (ce qui demande juste de configurer le multiplexeur). Un tel accès est dit en rafale : on envoie une adresse, puis on récupère plusieurs adresses consécutives à partir de cette adresse initiale.
Une autre méthode démarre un nouvel accès mémoire à chaque cycle d'horloge, pour lire des mot mémoire consécutifs un par un, mais chaque accès se fera dans une banque différente. En faisant cela, on n’a pas à attendre que la première banque ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. Il s'agit d'une forme de pipelining, qui fait que l'accès à des mots mémoire consécutifs est rendu plus rapide.
===Les mémoires à entrelacement par décalage===
Les mémoires à entrelacement simple ont un petit problème : sur une mémoire à N banques, des accès dont les adresses sont séparées par N mots mémoires vont tous tomber dans la même banque et seront donc impossibles à pipeliner. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement. Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
04cjhyhavoj438lhauk64binwzokwrn
764473
764472
2026-04-22T16:56:35Z
Mewtow
31375
/* L'entrelacement (interleaving) */
764473
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule, ce qui libère le processeur durant quelques cycles et lui économise du travail. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les banques et rangées==
Sur certaines puces mémoires, un seul boitier peut contenir plusieurs mémoires indépendantes regroupées pour former une mémoire unique plus grosse. Chaque sous-mémoire indépendante est appelée une '''banque''', ou encore un banc mémoire. La mémoire obtenue par combinaison de plusieurs banques est appelée une mémoire multi-banques. Cette technique peut servir à améliorer les performances, la consommation d'énergie, et j'en passe. Par exemple, cela permet de faciliter le rafraichissement d'une mémoire DRAM : on peut rafraichir chaque sous-mémoire en parallèle, indépendamment des autres. Mais cette technique est principalement utilisée pour doubler le nombre d'adresses, doubler la taille d'un mot mémoire, ou faire les deux.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2|Mémoire multi-banques.]]
===L'arrangement horizontal===
L''''arrangement horizontal''' utilise plusieurs banques pour augmenter la taille d'un mot mémoire sans changer le nombre d'adresses. Chaque banc mémoire contient une partie du mot mémoire final. Avec cette organisation, on accède à tous les bancs en parallèle à chaque accès, avec la même adresse.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour l'exemple, les barrettes de mémoires SDRAM ou DDR-RAM des PC actuels possèdent un mot mémoire de 64 bits, mais sont en réalité composées de 8 sous-mémoires ayant un mot mémoire de 8 bits. Cela permet de répartir la production de chaleur sur la barrette : la production de chaleur est répartie entre plusieurs puces, au lieu d'être concentrée dans la puce en cours d'accès.
===L'arrangement vertical===
L''''arrangement vertical''' rassemble plusieurs chips mémoire pour augmenter la capacité mémoire, mais sans changer la taille d'un mot mémoire. Sans la technique dite de l'entrelacement, qu'on verra dans la section suivante, les adresses sont réparties comme illustré dans le schéma ci-dessous. Par exemple, si je combine quatre mémoires de 1 mébioctet pour obtenir 4 mébioctets, le premier mébioctet sera dans le premier chip mémoire, le seconde mébioctet sera dans le second chip, et ainsi de suite. 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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
L'arrangement vertical peut être implémenté de plusieurs manières. Mais le principe global reste le même : une partie de l'adresse est utilisée sélectionner un chip mémoire, le reste de l'adresse est envoyé à ce chip mémoire. Sans entrelacement, on utilise les bits de poids forts pour sélectionner la banque.
La première consiste à connecter la bonne banque et déconnecter toutes les autres. Pour cela, on utilise la broche CS, qui connecte ou déconnecte la mémoire du bus. Cette broche est commandée par un décodeur, qui prend les bits de poids forts de l'adresse en entrée.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Une autre solution est d'ajouter un multiplexeur/démultiplexeur en sortie des banques et de commander celui-ci convenablement avec les bits de poids forts. Il y a plus précisément un multiplexeur pour les lectures, et un démultiplexeur pour les écritures.
[[File:Circuits d'une mémoire interleaved par rafale.png|centre|vignette|upright=2|Circuits d'une mémoire interleaved par rafale.]]
Si on mélange l'arrangement vertical et l'arrangement horizontal, on obtient ce que l'on appelle une rangée. Sur ces mémoires, les adresses sont découpées en trois morceaux, un pour sélectionner la rangée, un autre la banque, puis la ligne et la colonne.
==L'entrelacement (''interleaving'')==
La technique de l''''entrelacement''' utilise un arrangement vertical assez spécifique, afin de gagner en performance. Avec un arrangement vertical sans entrelacement, des adresses consécutives se retrouvent dans le même chip mémoire, dans la même banque. Accéder à des adresses consécutives fait qu'on doit faire les accès mémoire un par un, on doit attendre qu'un accès mémoire soit fini avant d'en démarrer un autre. Par contre, avec l'entrelacement, des adresses consécutives sont réparties dans des banques différentes, ce qui fait qu'on peut démarrer un accès mémoire sans attendre que les précédents soient finis. Pendant qu'une banque est occupée par un accès mémoire, on en démarre un nouveau dans une autre banque, et ainsi de suite jusqu’à avoir épuisé toutes les banques libres. L'organisation en question se marie bien avec l'accès en rafale, si des adresses consécutives sont placés dans des banques séparées.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. Cela implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===L'entrelacement basique===
Sans entrelacement, les accès séquentiels se font dans la même banque, ce qui les rend assez lents. Mais il est possible d'accélérer les accès à des adresses consécutives en rusant quelque peu. L'idée est que des accès consécutifs se fassent dans des banques différentes, et donc que des adresses consécutives soient localisés dans des banques différentes. Les mémoires qui fonctionnent sur ce principe sont appelées des '''mémoires à entrelacement simple'''.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Pour cela, il suffit de prendre une mémoire à arrangement vertical, avec un petit changement : il faut utiliser les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
En faisant cela, on peut accéder à un plusieurs cases mémoire consécutives assez rapidement. Cela rend les accès en rafale plus rapide. Pour cela, deux méthodes sont possibles.
La première méthode utilise un accès en parallèle aux banques, d'où son nom d'accès entrelacé parallèle. Sans entrelacement, on doit accéder à chaque banque l'une après l'autre, en lisant chaque case mémoire l'un après l'autre. Avec l’entrelacement parallèle, on lit plusieurs cases mémoire consécutives en même temps, en accédant à toutes les banques en même temps, avant d'envoyer chaque mot mémoire l'une après l'autre sur le bus (ce qui demande juste de configurer le multiplexeur). Un tel accès est dit en rafale : on envoie une adresse, puis on récupère plusieurs adresses consécutives à partir de cette adresse initiale.
Une autre méthode démarre un nouvel accès mémoire à chaque cycle d'horloge, pour lire des mot mémoire consécutifs un par un, mais chaque accès se fera dans une banque différente. En faisant cela, on n’a pas à attendre que la première banque ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. Il s'agit d'une forme de pipelining, qui fait que l'accès à des mots mémoire consécutifs est rendu plus rapide.
===Les mémoires à entrelacement par décalage===
Les mémoires à entrelacement simple ont un petit problème : sur une mémoire à N banques, des accès dont les adresses sont séparées par N mots mémoires vont tous tomber dans la même banque et seront donc impossibles à pipeliner. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement. Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
ppds6p4mbiyor7wmulmzd6ucfgb9lua
764483
764473
2026-04-22T17:25:58Z
Mewtow
31375
/* Les banques et rangées */
764483
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule, ce qui libère le processeur durant quelques cycles et lui économise du travail. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les banques et l'entrelacement===
Sur certaines puces mémoires, un seul boitier peut contenir plusieurs mémoires indépendantes regroupées pour former une mémoire unique plus grosse. Chaque sous-mémoire indépendante est appelée une '''banque''', ou encore un banc mémoire. La mémoire obtenue par combinaison de plusieurs banques est appelée une mémoire multi-banques. Cette technique peut servir à améliorer les performances, la consommation d'énergie, et j'en passe. Par exemple, cela permet de faciliter le rafraichissement d'une mémoire DRAM : on peut rafraichir chaque sous-mémoire en parallèle, indépendamment des autres. Mais cette technique est principalement utilisée pour doubler le nombre d'adresses, doubler la taille d'un mot mémoire, ou faire les deux.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2|Mémoire multi-banques.]]
Sans optimisations particulières, les adresses sont réparties dans les banques de cette manière :
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
==L'entrelacement (''interleaving'')==
La technique de l''''entrelacement''' utilise un arrangement vertical assez spécifique, afin de gagner en performance. Avec un arrangement vertical sans entrelacement, des adresses consécutives se retrouvent dans le même chip mémoire, dans la même banque. Accéder à des adresses consécutives fait qu'on doit faire les accès mémoire un par un, on doit attendre qu'un accès mémoire soit fini avant d'en démarrer un autre. Par contre, avec l'entrelacement, des adresses consécutives sont réparties dans des banques différentes, ce qui fait qu'on peut démarrer un accès mémoire sans attendre que les précédents soient finis. Pendant qu'une banque est occupée par un accès mémoire, on en démarre un nouveau dans une autre banque, et ainsi de suite jusqu’à avoir épuisé toutes les banques libres. L'organisation en question se marie bien avec l'accès en rafale, si des adresses consécutives sont placés dans des banques séparées.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. Cela implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===L'entrelacement basique===
Sans entrelacement, les accès séquentiels se font dans la même banque, ce qui les rend assez lents. Mais il est possible d'accélérer les accès à des adresses consécutives en rusant quelque peu. L'idée est que des accès consécutifs se fassent dans des banques différentes, et donc que des adresses consécutives soient localisés dans des banques différentes. Les mémoires qui fonctionnent sur ce principe sont appelées des '''mémoires à entrelacement simple'''.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Pour cela, il suffit de prendre une mémoire à arrangement vertical, avec un petit changement : il faut utiliser les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
En faisant cela, on peut accéder à un plusieurs cases mémoire consécutives assez rapidement. Cela rend les accès en rafale plus rapide. Pour cela, deux méthodes sont possibles.
La première méthode utilise un accès en parallèle aux banques, d'où son nom d'accès entrelacé parallèle. Sans entrelacement, on doit accéder à chaque banque l'une après l'autre, en lisant chaque case mémoire l'un après l'autre. Avec l’entrelacement parallèle, on lit plusieurs cases mémoire consécutives en même temps, en accédant à toutes les banques en même temps, avant d'envoyer chaque mot mémoire l'une après l'autre sur le bus (ce qui demande juste de configurer le multiplexeur). Un tel accès est dit en rafale : on envoie une adresse, puis on récupère plusieurs adresses consécutives à partir de cette adresse initiale.
Une autre méthode démarre un nouvel accès mémoire à chaque cycle d'horloge, pour lire des mot mémoire consécutifs un par un, mais chaque accès se fera dans une banque différente. En faisant cela, on n’a pas à attendre que la première banque ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. Il s'agit d'une forme de pipelining, qui fait que l'accès à des mots mémoire consécutifs est rendu plus rapide.
===Les mémoires à entrelacement par décalage===
Les mémoires à entrelacement simple ont un petit problème : sur une mémoire à N banques, des accès dont les adresses sont séparées par N mots mémoires vont tous tomber dans la même banque et seront donc impossibles à pipeliner. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement. Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
q935cyac10iold6bd9gbz6sl7k3rny0
764484
764483
2026-04-22T17:26:14Z
Mewtow
31375
/* L'entrelacement (interleaving) */
764484
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule, ce qui libère le processeur durant quelques cycles et lui économise du travail. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les banques et l'entrelacement===
Sur certaines puces mémoires, un seul boitier peut contenir plusieurs mémoires indépendantes regroupées pour former une mémoire unique plus grosse. Chaque sous-mémoire indépendante est appelée une '''banque''', ou encore un banc mémoire. La mémoire obtenue par combinaison de plusieurs banques est appelée une mémoire multi-banques. Cette technique peut servir à améliorer les performances, la consommation d'énergie, et j'en passe. Par exemple, cela permet de faciliter le rafraichissement d'une mémoire DRAM : on peut rafraichir chaque sous-mémoire en parallèle, indépendamment des autres. Mais cette technique est principalement utilisée pour doubler le nombre d'adresses, doubler la taille d'un mot mémoire, ou faire les deux.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2|Mémoire multi-banques.]]
Sans optimisations particulières, les adresses sont réparties dans les banques de cette manière :
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Le problème est que des adresses consécutives se retrouvent dans le même chip mémoire, dans la même banque. Accéder à des adresses consécutives fait qu'on doit faire les accès mémoire un par un, on doit attendre qu'un accès mémoire soit fini avant d'en démarrer un autre. Par contre, avec l'entrelacement, des adresses consécutives sont réparties dans des banques différentes, ce qui fait qu'on peut démarrer un accès mémoire sans attendre que les précédents soient finis. Pendant qu'une banque est occupée par un accès mémoire, on en démarre un nouveau dans une autre banque, et ainsi de suite jusqu’à avoir épuisé toutes les banques libres. L'organisation en question se marie bien avec l'accès en rafale, si des adresses consécutives sont placés dans des banques séparées.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. Cela implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===L'entrelacement basique===
Sans entrelacement, les accès séquentiels se font dans la même banque, ce qui les rend assez lents. Mais il est possible d'accélérer les accès à des adresses consécutives en rusant quelque peu. L'idée est que des accès consécutifs se fassent dans des banques différentes, et donc que des adresses consécutives soient localisés dans des banques différentes. Les mémoires qui fonctionnent sur ce principe sont appelées des '''mémoires à entrelacement simple'''.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Pour cela, il suffit de prendre une mémoire à arrangement vertical, avec un petit changement : il faut utiliser les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
En faisant cela, on peut accéder à un plusieurs cases mémoire consécutives assez rapidement. Cela rend les accès en rafale plus rapide. Pour cela, deux méthodes sont possibles.
La première méthode utilise un accès en parallèle aux banques, d'où son nom d'accès entrelacé parallèle. Sans entrelacement, on doit accéder à chaque banque l'une après l'autre, en lisant chaque case mémoire l'un après l'autre. Avec l’entrelacement parallèle, on lit plusieurs cases mémoire consécutives en même temps, en accédant à toutes les banques en même temps, avant d'envoyer chaque mot mémoire l'une après l'autre sur le bus (ce qui demande juste de configurer le multiplexeur). Un tel accès est dit en rafale : on envoie une adresse, puis on récupère plusieurs adresses consécutives à partir de cette adresse initiale.
Une autre méthode démarre un nouvel accès mémoire à chaque cycle d'horloge, pour lire des mot mémoire consécutifs un par un, mais chaque accès se fera dans une banque différente. En faisant cela, on n’a pas à attendre que la première banque ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. Il s'agit d'une forme de pipelining, qui fait que l'accès à des mots mémoire consécutifs est rendu plus rapide.
===Les mémoires à entrelacement par décalage===
Les mémoires à entrelacement simple ont un petit problème : sur une mémoire à N banques, des accès dont les adresses sont séparées par N mots mémoires vont tous tomber dans la même banque et seront donc impossibles à pipeliner. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement. Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
fvx5apumxoif9mdqhp16a24ec161x5q
764485
764484
2026-04-22T17:29:39Z
Mewtow
31375
/* Les banques et l'entrelacement= */
764485
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule, ce qui libère le processeur durant quelques cycles et lui économise du travail. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les banques et l'entrelacement (''interleaving'')==
Les '''mémoire multi-banque''' regroupent plusieurs mémoires indépendantes dans un seul boitier, dans un seul chip mémoire. Chaque sous-mémoire indépendante est appelée une '''banque''', ou encore un banc mémoire. Cette technique peut servir à améliorer les performances, la consommation d'énergie, et j'en passe. Par exemple, cela permet de faciliter le rafraichissement d'une mémoire DRAM : on peut rafraichir chaque sous-mémoire en parallèle, indépendamment des autres.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2|Mémoire multi-banques.]]
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous. Le problème est que cet arrangement ne sert pas à grand chose. On a augmenté la capacité de la mémoire RAM, mais rien de plus. Il faut cependant faire une remarque : des adresses consécutives se retrouvent dans le même chip mémoire, dans la même banque, sauf pour les rares adresses où on passe d'une banque à l'autre. Accéder à des adresses consécutives fait qu'on doit faire les accès mémoire un par un, on doit attendre qu'un accès mémoire soit fini avant d'en démarrer un autre.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
En pratique, aucune mémoire multibanque ne fait ainsi. A la place, elles utilisent une optimisation appelée l''''entrelacement'''. L'idée est que des adresses consécutives sont réparties dans des banques différentes, ce qui fait qu'on peut démarrer un accès mémoire sans attendre que les précédents soient finis. Pendant qu'une banque est occupée par un accès mémoire, on en démarre un nouveau dans une autre banque, et ainsi de suite jusqu’à avoir épuisé toutes les banques libres. L'organisation en question se marie bien avec l'accès en rafale, si des adresses consécutives sont placés dans des banques séparées.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. Cela implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===L'entrelacement basique===
Sans entrelacement, les accès séquentiels se font dans la même banque, ce qui les rend assez lents. Mais il est possible d'accélérer les accès à des adresses consécutives en rusant quelque peu. L'idée est que des accès consécutifs se fassent dans des banques différentes, et donc que des adresses consécutives soient localisés dans des banques différentes. Les mémoires qui fonctionnent sur ce principe sont appelées des '''mémoires à entrelacement simple'''.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Pour cela, il suffit de prendre une mémoire à arrangement vertical, avec un petit changement : il faut utiliser les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
En faisant cela, on peut accéder à un plusieurs cases mémoire consécutives assez rapidement. Cela rend les accès en rafale plus rapide. Pour cela, deux méthodes sont possibles.
La première méthode utilise un accès en parallèle aux banques, d'où son nom d'accès entrelacé parallèle. Sans entrelacement, on doit accéder à chaque banque l'une après l'autre, en lisant chaque case mémoire l'un après l'autre. Avec l’entrelacement parallèle, on lit plusieurs cases mémoire consécutives en même temps, en accédant à toutes les banques en même temps, avant d'envoyer chaque mot mémoire l'une après l'autre sur le bus (ce qui demande juste de configurer le multiplexeur). Un tel accès est dit en rafale : on envoie une adresse, puis on récupère plusieurs adresses consécutives à partir de cette adresse initiale.
Une autre méthode démarre un nouvel accès mémoire à chaque cycle d'horloge, pour lire des mot mémoire consécutifs un par un, mais chaque accès se fera dans une banque différente. En faisant cela, on n’a pas à attendre que la première banque ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. Il s'agit d'une forme de pipelining, qui fait que l'accès à des mots mémoire consécutifs est rendu plus rapide.
===Les mémoires à entrelacement par décalage===
Les mémoires à entrelacement simple ont un petit problème : sur une mémoire à N banques, des accès dont les adresses sont séparées par N mots mémoires vont tous tomber dans la même banque et seront donc impossibles à pipeliner. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement. Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
opv3x5pxxb1a27w8jif414wvsm0iqaa
764486
764485
2026-04-22T17:31:28Z
Mewtow
31375
/* Les banques et l'entrelacement (interleaving) */
764486
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule, ce qui libère le processeur durant quelques cycles et lui économise du travail. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les banques et l'entrelacement (''interleaving'')==
Les '''mémoire multi-banque''' regroupent plusieurs mémoires indépendantes dans un seul boitier, dans un seul chip mémoire. Chaque sous-mémoire indépendante est appelée une '''banque''', ou encore un banc mémoire. Cette technique peut servir à améliorer les performances, la consommation d'énergie, et j'en passe. Par exemple, cela permet de faciliter le rafraichissement d'une mémoire DRAM : on peut rafraichir chaque sous-mémoire en parallèle, indépendamment des autres.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2|Mémoire multi-banques.]]
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous. Le problème est que cet arrangement ne sert pas à grand chose. On a augmenté la capacité de la mémoire RAM, mais rien de plus. Il faut cependant faire une remarque : des adresses consécutives se retrouvent dans le même chip mémoire, dans la même banque, sauf pour les rares adresses où on passe d'une banque à l'autre. Accéder à des adresses consécutives fait qu'on doit faire les accès mémoire un par un, on doit attendre qu'un accès mémoire soit fini avant d'en démarrer un autre.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
En pratique, aucune mémoire multibanque ne fait ainsi. A la place, elles utilisent une optimisation appelée l''''entrelacement'''. L'idée est que des adresses consécutives sont réparties dans des banques différentes, afin d'accélérer des accès en rafale, à des adresses consécutives. L'organisation en question se marie bien avec l'accès en rafale, où plusieurs accès mémoire sont combinés en un seul. Cela permet de démarrer un accès mémoire sans attendre que les précédents soient finis. Pendant qu'une banque est occupée par un accès mémoire, on en démarre un nouveau dans une autre banque, et ainsi de suite jusqu’à avoir épuisé toutes les banques libres.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. Cela implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===L'entrelacement basique===
Sans entrelacement, les accès séquentiels se font dans la même banque, ce qui les rend assez lents. Mais il est possible d'accélérer les accès à des adresses consécutives en rusant quelque peu. L'idée est que des accès consécutifs se fassent dans des banques différentes, et donc que des adresses consécutives soient localisés dans des banques différentes. Les mémoires qui fonctionnent sur ce principe sont appelées des '''mémoires à entrelacement simple'''.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Pour cela, il suffit de prendre une mémoire à arrangement vertical, avec un petit changement : il faut utiliser les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
En faisant cela, on peut accéder à un plusieurs cases mémoire consécutives assez rapidement. Cela rend les accès en rafale plus rapide. Pour cela, deux méthodes sont possibles.
La première méthode utilise un accès en parallèle aux banques, d'où son nom d'accès entrelacé parallèle. Sans entrelacement, on doit accéder à chaque banque l'une après l'autre, en lisant chaque case mémoire l'un après l'autre. Avec l’entrelacement parallèle, on lit plusieurs cases mémoire consécutives en même temps, en accédant à toutes les banques en même temps, avant d'envoyer chaque mot mémoire l'une après l'autre sur le bus (ce qui demande juste de configurer le multiplexeur). Un tel accès est dit en rafale : on envoie une adresse, puis on récupère plusieurs adresses consécutives à partir de cette adresse initiale.
Une autre méthode démarre un nouvel accès mémoire à chaque cycle d'horloge, pour lire des mot mémoire consécutifs un par un, mais chaque accès se fera dans une banque différente. En faisant cela, on n’a pas à attendre que la première banque ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. Il s'agit d'une forme de pipelining, qui fait que l'accès à des mots mémoire consécutifs est rendu plus rapide.
===Les mémoires à entrelacement par décalage===
Les mémoires à entrelacement simple ont un petit problème : sur une mémoire à N banques, des accès dont les adresses sont séparées par N mots mémoires vont tous tomber dans la même banque et seront donc impossibles à pipeliner. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement. Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
stsi704lp989n3zzs8fs3j4jnqcgtrx
764487
764486
2026-04-22T17:37:49Z
Mewtow
31375
/* L'accès en rafale */
764487
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
L'utilité de ce genre d'accès n'est pas évidente. Mais il devient plus clair quand on sait que les mémoires caches utilisent des blocs de mémoire de grande taille. Lorsqu'on copie une donnée de la RAM dans le cache, c'est un bloc de 64 octets qui est copié, parfois plus. Et inversement, quand on rapatrie des données du cache vers la RAM, c'est un bloc de données de la même taille qui est écrit en RAM. Les transferts se font donc en plusieurs accès mémoires successifs, à des adresses consécutives, c'est à dire le genre d'accès optimisé par un accès en rafale.
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les banques et l'entrelacement (''interleaving'')==
Les '''mémoire multi-banque''' regroupent plusieurs mémoires indépendantes dans un seul boitier, dans un seul chip mémoire. Chaque sous-mémoire indépendante est appelée une '''banque''', ou encore un banc mémoire. Cette technique peut servir à améliorer les performances, la consommation d'énergie, et j'en passe. Par exemple, cela permet de faciliter le rafraichissement d'une mémoire DRAM : on peut rafraichir chaque sous-mémoire en parallèle, indépendamment des autres.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2|Mémoire multi-banques.]]
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous. Le problème est que cet arrangement ne sert pas à grand chose. On a augmenté la capacité de la mémoire RAM, mais rien de plus. Il faut cependant faire une remarque : des adresses consécutives se retrouvent dans le même chip mémoire, dans la même banque, sauf pour les rares adresses où on passe d'une banque à l'autre. Accéder à des adresses consécutives fait qu'on doit faire les accès mémoire un par un, on doit attendre qu'un accès mémoire soit fini avant d'en démarrer un autre.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
En pratique, aucune mémoire multibanque ne fait ainsi. A la place, elles utilisent une optimisation appelée l''''entrelacement'''. L'idée est que des adresses consécutives sont réparties dans des banques différentes, afin d'accélérer des accès en rafale, à des adresses consécutives. L'organisation en question se marie bien avec l'accès en rafale, où plusieurs accès mémoire sont combinés en un seul. Cela permet de démarrer un accès mémoire sans attendre que les précédents soient finis. Pendant qu'une banque est occupée par un accès mémoire, on en démarre un nouveau dans une autre banque, et ainsi de suite jusqu’à avoir épuisé toutes les banques libres.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. Cela implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===L'entrelacement basique===
Sans entrelacement, les accès séquentiels se font dans la même banque, ce qui les rend assez lents. Mais il est possible d'accélérer les accès à des adresses consécutives en rusant quelque peu. L'idée est que des accès consécutifs se fassent dans des banques différentes, et donc que des adresses consécutives soient localisés dans des banques différentes. Les mémoires qui fonctionnent sur ce principe sont appelées des '''mémoires à entrelacement simple'''.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
Pour cela, il suffit de prendre une mémoire à arrangement vertical, avec un petit changement : il faut utiliser les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
En faisant cela, on peut accéder à un plusieurs cases mémoire consécutives assez rapidement. Cela rend les accès en rafale plus rapide. Pour cela, deux méthodes sont possibles.
La première méthode utilise un accès en parallèle aux banques, d'où son nom d'accès entrelacé parallèle. Sans entrelacement, on doit accéder à chaque banque l'une après l'autre, en lisant chaque case mémoire l'un après l'autre. Avec l’entrelacement parallèle, on lit plusieurs cases mémoire consécutives en même temps, en accédant à toutes les banques en même temps, avant d'envoyer chaque mot mémoire l'une après l'autre sur le bus (ce qui demande juste de configurer le multiplexeur). Un tel accès est dit en rafale : on envoie une adresse, puis on récupère plusieurs adresses consécutives à partir de cette adresse initiale.
Une autre méthode démarre un nouvel accès mémoire à chaque cycle d'horloge, pour lire des mot mémoire consécutifs un par un, mais chaque accès se fera dans une banque différente. En faisant cela, on n’a pas à attendre que la première banque ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. Il s'agit d'une forme de pipelining, qui fait que l'accès à des mots mémoire consécutifs est rendu plus rapide.
===Les mémoires à entrelacement par décalage===
Les mémoires à entrelacement simple ont un petit problème : sur une mémoire à N banques, des accès dont les adresses sont séparées par N mots mémoires vont tous tomber dans la même banque et seront donc impossibles à pipeliner. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement. Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
lfdiqsnb6zarjgahjk7op6bosxxgz2g
764499
764487
2026-04-22T18:13:07Z
Mewtow
31375
/* Les banques et l'entrelacement (interleaving) */
764499
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
L'utilité de ce genre d'accès n'est pas évidente. Mais il devient plus clair quand on sait que les mémoires caches utilisent des blocs de mémoire de grande taille. Lorsqu'on copie une donnée de la RAM dans le cache, c'est un bloc de 64 octets qui est copié, parfois plus. Et inversement, quand on rapatrie des données du cache vers la RAM, c'est un bloc de données de la même taille qui est écrit en RAM. Les transferts se font donc en plusieurs accès mémoires successifs, à des adresses consécutives, c'est à dire le genre d'accès optimisé par un accès en rafale.
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les banques et l'entrelacement (''interleaving'')==
Les '''mémoire multi-banque''' regroupent plusieurs mémoires indépendantes dans un seul boitier, dans un seul chip mémoire. Chaque sous-mémoire indépendante est appelée une '''banque''', ou encore un banc mémoire. Cette technique peut servir à améliorer les performances, la consommation d'énergie, et j'en passe.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2|Mémoire multi-banques.]]
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous. La capacité de la mémoire RAM est augmentée, car on combine plusieurs chips mémoire, mais les autres avantages sont assez limités. Un des rares avantages est que cela permet de faciliter le rafraichissement d'une mémoire DRAM. On peut rafraichir chaque chip mémoire en parallèle, indépendamment des autres. Par exemple, si je combine 4 chips mémoire, je peux rafraichir quatre chips en même temps, en parallèle. Mais il faut que le contrôleur de DRAM permette ce genre de choses.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
En pratique, aucune mémoire multibanque ne fait ainsi. A la place, elles utilisent une optimisation appelée l''''entrelacement'''. il existe plusieurs formes d'entrelacement, mais nous allons commencer avec l'entrelacement le plus simple, qui vise à accélérer les accès en rafale.
===L'entrelacement classique===
L''''entrelacement classique''' vise à accélérer les accès en rafale, où plusieurs accès mémoire sont combinés en un seul. L'idée est que des adresses consécutives sont réparties dans des banques différentes. Les mémoires qui fonctionnent sur ce principe sont appelées des '''mémoires à entrelacement simple'''.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'organisation en question permet de démarrer un accès mémoire sans attendre que les précédents soient finis. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. Généralement, les mémoires entrelacées supportent assez de banques pour qu'un accès en rafale de N octets accéde à N banques différentes.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
L'implémentation se base sur le fait que les banques sont de vraies sous-mémoires, avec un bit ''Chip Select'' ou un bit ''Output Enable''. La banque à laquelle accéder est sélectionnée en commandant son bit ''Chip Select'', ou un bit équivalent qui permet de déclencher un accès mémoire. La subtilité est que lorsqu'on désactive une banque, elle termine l'accès mémoire en cours avant de se désactiver. Le bit ''Chip Select'' sert plus de signal pour démarrer un accès mémoire qu'autre chose.
Les bits ''Chip Select'' ou équivalents sont générés par un circuit de décodage d'adresse. Il prend en entrée certains bits de l'adresse et en déduit les ''Chip Select''. Avec l'entrelacement simple, il utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
En faisant cela, on peut accéder à un plusieurs cases mémoire consécutives assez rapidement. Cela rend les accès en rafale plus rapide. Pour cela, deux méthodes sont possibles.
La première méthode utilise un accès en parallèle aux banques, d'où son nom d'accès entrelacé parallèle. Sans entrelacement, on doit accéder à chaque banque l'une après l'autre, en lisant chaque case mémoire l'un après l'autre. Avec l’entrelacement parallèle, on lit plusieurs cases mémoire consécutives en même temps, en accédant à toutes les banques en même temps, avant d'envoyer chaque mot mémoire l'une après l'autre sur le bus (ce qui demande juste de configurer le multiplexeur). Un tel accès est dit en rafale : on envoie une adresse, puis on récupère plusieurs adresses consécutives à partir de cette adresse initiale.
Une autre méthode démarre un nouvel accès mémoire à chaque cycle d'horloge, pour lire des mot mémoire consécutifs un par un, mais chaque accès se fera dans une banque différente. En faisant cela, on n’a pas à attendre que la première banque ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. Il s'agit d'une forme de pipelining, qui fait que l'accès à des mots mémoire consécutifs est rendu plus rapide.
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés, ce qui implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===Les mémoires à entrelacement par décalage===
Les mémoires à entrelacement simple ont un petit problème : sur une mémoire à N banques, des accès dont les adresses sont séparées par N mots mémoires vont tous tomber dans la même banque et seront donc impossibles à pipeliner. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement. Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
q6c0ok0ojisl9qvvlqthpsin018fudp
764500
764499
2026-04-22T18:15:17Z
Mewtow
31375
/* L'entrelacement classique */
764500
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
L'utilité de ce genre d'accès n'est pas évidente. Mais il devient plus clair quand on sait que les mémoires caches utilisent des blocs de mémoire de grande taille. Lorsqu'on copie une donnée de la RAM dans le cache, c'est un bloc de 64 octets qui est copié, parfois plus. Et inversement, quand on rapatrie des données du cache vers la RAM, c'est un bloc de données de la même taille qui est écrit en RAM. Les transferts se font donc en plusieurs accès mémoires successifs, à des adresses consécutives, c'est à dire le genre d'accès optimisé par un accès en rafale.
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les banques et l'entrelacement (''interleaving'')==
Les '''mémoire multi-banque''' regroupent plusieurs mémoires indépendantes dans un seul boitier, dans un seul chip mémoire. Chaque sous-mémoire indépendante est appelée une '''banque''', ou encore un banc mémoire. Cette technique peut servir à améliorer les performances, la consommation d'énergie, et j'en passe.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2|Mémoire multi-banques.]]
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous. La capacité de la mémoire RAM est augmentée, car on combine plusieurs chips mémoire, mais les autres avantages sont assez limités. Un des rares avantages est que cela permet de faciliter le rafraichissement d'une mémoire DRAM. On peut rafraichir chaque chip mémoire en parallèle, indépendamment des autres. Par exemple, si je combine 4 chips mémoire, je peux rafraichir quatre chips en même temps, en parallèle. Mais il faut que le contrôleur de DRAM permette ce genre de choses.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
En pratique, aucune mémoire multibanque ne fait ainsi. A la place, elles utilisent une optimisation appelée l''''entrelacement'''. il existe plusieurs formes d'entrelacement, mais nous allons commencer avec l'entrelacement le plus simple, qui vise à accélérer les accès en rafale.
===L'entrelacement classique===
L''''entrelacement classique''' vise à accélérer les accès en rafale, où plusieurs accès mémoire sont combinés en un seul. L'idée est que des adresses consécutives sont réparties dans des banques différentes. Les mémoires qui fonctionnent sur ce principe sont appelées des '''mémoires à entrelacement simple'''.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'organisation en question permet de démarrer un accès mémoire sans attendre que les précédents soient finis. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. Généralement, les mémoires entrelacées supportent assez de banques pour qu'un accès en rafale de N octets accéde à N banques différentes.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
L'implémentation se base sur le fait que les banques sont de vraies sous-mémoires, avec un bit ''Chip Select'' ou un bit ''Output Enable''. La banque à laquelle accéder est sélectionnée en commandant son bit ''Chip Select'', ou un bit équivalent qui permet de déclencher un accès mémoire. La subtilité est que lorsqu'on désactive une banque, elle termine l'accès mémoire en cours avant de se désactiver. Le bit ''Chip Select'' sert plus de signal pour démarrer un accès mémoire qu'autre chose.
Les bits ''Chip Select'' ou équivalents sont générés par un circuit de décodage d'adresse. Il prend en entrée certains bits de l'adresse et en déduit les ''Chip Select''. Avec l'entrelacement simple, il utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
L'entrelacement simple permet d'accéder à un plusieurs cases mémoire consécutives assez rapidement. L'entrelacement démarre un nouvel accès mémoire à chaque cycle d'horloge, pour lire des mots mémoire consécutifs un par un. En faisant cela, on n’a pas à attendre que la première banque ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. Il s'agit d'une forme de pipelining, qui fait que l'accès à des mots mémoire consécutifs est rendu plus rapide.
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés, ce qui implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===Les mémoires à entrelacement par décalage===
Les mémoires à entrelacement simple ont un petit problème : sur une mémoire à N banques, des accès dont les adresses sont séparées par N mots mémoires vont tous tomber dans la même banque et seront donc impossibles à pipeliner. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement. Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
4zbiomd6ljrg3ocln7as92e6n0qzqoh
764501
764500
2026-04-22T18:16:03Z
Mewtow
31375
/* L'entrelacement classique */
764501
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
L'utilité de ce genre d'accès n'est pas évidente. Mais il devient plus clair quand on sait que les mémoires caches utilisent des blocs de mémoire de grande taille. Lorsqu'on copie une donnée de la RAM dans le cache, c'est un bloc de 64 octets qui est copié, parfois plus. Et inversement, quand on rapatrie des données du cache vers la RAM, c'est un bloc de données de la même taille qui est écrit en RAM. Les transferts se font donc en plusieurs accès mémoires successifs, à des adresses consécutives, c'est à dire le genre d'accès optimisé par un accès en rafale.
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les banques et l'entrelacement (''interleaving'')==
Les '''mémoire multi-banque''' regroupent plusieurs mémoires indépendantes dans un seul boitier, dans un seul chip mémoire. Chaque sous-mémoire indépendante est appelée une '''banque''', ou encore un banc mémoire. Cette technique peut servir à améliorer les performances, la consommation d'énergie, et j'en passe.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2|Mémoire multi-banques.]]
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous. La capacité de la mémoire RAM est augmentée, car on combine plusieurs chips mémoire, mais les autres avantages sont assez limités. Un des rares avantages est que cela permet de faciliter le rafraichissement d'une mémoire DRAM. On peut rafraichir chaque chip mémoire en parallèle, indépendamment des autres. Par exemple, si je combine 4 chips mémoire, je peux rafraichir quatre chips en même temps, en parallèle. Mais il faut que le contrôleur de DRAM permette ce genre de choses.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
En pratique, aucune mémoire multibanque ne fait ainsi. A la place, elles utilisent une optimisation appelée l''''entrelacement'''. il existe plusieurs formes d'entrelacement, mais nous allons commencer avec l'entrelacement le plus simple, qui vise à accélérer les accès en rafale.
===L'entrelacement classique===
L''''entrelacement classique''' vise à accélérer les accès en rafale, où plusieurs accès mémoire sont combinés en un seul. L'idée est que des adresses consécutives sont réparties dans des banques différentes. Les mémoires qui fonctionnent sur ce principe sont appelées des '''mémoires à entrelacement simple'''.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accéder à un plusieurs cases mémoire consécutives assez rapidement. L'entrelacement démarre un nouvel accès mémoire à chaque cycle d'horloge, pour lire des mots mémoire consécutifs un par un. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. En faisant cela, on n’a pas à attendre que la première banque ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. Généralement, les mémoires entrelacées supportent assez de banques pour qu'un accès en rafale de N octets accéde à N banques différentes.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
L'implémentation se base sur le fait que les banques sont de vraies sous-mémoires, avec un bit ''Chip Select'' ou un bit ''Output Enable''. La banque à laquelle accéder est sélectionnée en commandant son bit ''Chip Select'', ou un bit équivalent qui permet de déclencher un accès mémoire. La subtilité est que lorsqu'on désactive une banque, elle termine l'accès mémoire en cours avant de se désactiver. Le bit ''Chip Select'' sert plus de signal pour démarrer un accès mémoire qu'autre chose.
Les bits ''Chip Select'' ou équivalents sont générés par un circuit de décodage d'adresse. Il prend en entrée certains bits de l'adresse et en déduit les ''Chip Select''. Avec l'entrelacement simple, il utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés, ce qui implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===Les mémoires à entrelacement par décalage===
Les mémoires à entrelacement simple ont un petit problème : sur une mémoire à N banques, des accès dont les adresses sont séparées par N mots mémoires vont tous tomber dans la même banque et seront donc impossibles à pipeliner. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement. Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
pa5iqgj81cua93h31syozqlzsqwfuhj
764502
764501
2026-04-22T18:22:50Z
Mewtow
31375
/* Les mémoires à entrelacement par décalage */
764502
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
L'utilité de ce genre d'accès n'est pas évidente. Mais il devient plus clair quand on sait que les mémoires caches utilisent des blocs de mémoire de grande taille. Lorsqu'on copie une donnée de la RAM dans le cache, c'est un bloc de 64 octets qui est copié, parfois plus. Et inversement, quand on rapatrie des données du cache vers la RAM, c'est un bloc de données de la même taille qui est écrit en RAM. Les transferts se font donc en plusieurs accès mémoires successifs, à des adresses consécutives, c'est à dire le genre d'accès optimisé par un accès en rafale.
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les banques et l'entrelacement (''interleaving'')==
Les '''mémoire multi-banque''' regroupent plusieurs mémoires indépendantes dans un seul boitier, dans un seul chip mémoire. Chaque sous-mémoire indépendante est appelée une '''banque''', ou encore un banc mémoire. Cette technique peut servir à améliorer les performances, la consommation d'énergie, et j'en passe.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2|Mémoire multi-banques.]]
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous. La capacité de la mémoire RAM est augmentée, car on combine plusieurs chips mémoire, mais les autres avantages sont assez limités. Un des rares avantages est que cela permet de faciliter le rafraichissement d'une mémoire DRAM. On peut rafraichir chaque chip mémoire en parallèle, indépendamment des autres. Par exemple, si je combine 4 chips mémoire, je peux rafraichir quatre chips en même temps, en parallèle. Mais il faut que le contrôleur de DRAM permette ce genre de choses.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
En pratique, aucune mémoire multibanque ne fait ainsi. A la place, elles utilisent une optimisation appelée l''''entrelacement'''. il existe plusieurs formes d'entrelacement, mais nous allons commencer avec l'entrelacement le plus simple, qui vise à accélérer les accès en rafale.
===L'entrelacement classique===
L''''entrelacement classique''' vise à accélérer les accès en rafale, où plusieurs accès mémoire sont combinés en un seul. L'idée est que des adresses consécutives sont réparties dans des banques différentes. Les mémoires qui fonctionnent sur ce principe sont appelées des '''mémoires à entrelacement simple'''.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accéder à un plusieurs cases mémoire consécutives assez rapidement. L'entrelacement démarre un nouvel accès mémoire à chaque cycle d'horloge, pour lire des mots mémoire consécutifs un par un. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. En faisant cela, on n’a pas à attendre que la première banque ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. Généralement, les mémoires entrelacées supportent assez de banques pour qu'un accès en rafale de N octets accéde à N banques différentes.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
L'implémentation se base sur le fait que les banques sont de vraies sous-mémoires, avec un bit ''Chip Select'' ou un bit ''Output Enable''. La banque à laquelle accéder est sélectionnée en commandant son bit ''Chip Select'', ou un bit équivalent qui permet de déclencher un accès mémoire. La subtilité est que lorsqu'on désactive une banque, elle termine l'accès mémoire en cours avant de se désactiver. Le bit ''Chip Select'' sert plus de signal pour démarrer un accès mémoire qu'autre chose.
Les bits ''Chip Select'' ou équivalents sont générés par un circuit de décodage d'adresse. Il prend en entrée certains bits de l'adresse et en déduit les ''Chip Select''. Avec l'entrelacement simple, il utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés, ce qui implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===Les mémoires à entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures.
Pour rendre cela plus concret, nous allons dire que de tels accès étaient étaient autrefois fréquents sur les anciens processeurs vectoriels. Ils disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, et ces données pouvaient être séparées de N adresses en mémoire. L'instruction envoyait plusieurs accès mémoire consécutifs, séparés de N adresses, et le contrôleur mémoire devait les exécuter en série.
Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. Avec l'entrelacement simple, les performances sont un peu dégradées, mais cela ne fonctionne pas trop mal. Le cas extrêm est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
dep4fw78f0wczs40tqtgdydsd0fkqqt
764523
764502
2026-04-22T20:28:23Z
Mewtow
31375
/* Les banques et l'entrelacement (interleaving) */
764523
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
L'utilité de ce genre d'accès n'est pas évidente. Mais il devient plus clair quand on sait que les mémoires caches utilisent des blocs de mémoire de grande taille. Lorsqu'on copie une donnée de la RAM dans le cache, c'est un bloc de 64 octets qui est copié, parfois plus. Et inversement, quand on rapatrie des données du cache vers la RAM, c'est un bloc de données de la même taille qui est écrit en RAM. Les transferts se font donc en plusieurs accès mémoires successifs, à des adresses consécutives, c'est à dire le genre d'accès optimisé par un accès en rafale.
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les banques et l'entrelacement (''interleaving'')==
Les '''mémoire multi-banque''' regroupent plusieurs mémoires indépendantes dans un seul boitier, dans un seul chip mémoire. Chaque sous-mémoire indépendante est appelée une '''banque''', ou encore un banc mémoire. Cette technique peut servir à améliorer les performances, la consommation d'énergie, et j'en passe.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous. La capacité de la mémoire RAM est augmentée, car on combine plusieurs chips mémoire, mais les autres avantages sont assez limités. Un des rares avantages est que cela permet de faciliter le rafraichissement d'une mémoire DRAM. On peut rafraichir chaque chip mémoire en parallèle, indépendamment des autres. Par exemple, si je combine 4 chips mémoire, je peux rafraichir quatre chips en même temps, en parallèle. Mais il faut que le contrôleur de DRAM permette ce genre de choses.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
En pratique, aucune mémoire multibanque ne fait ainsi. A la place, elles utilisent une optimisation appelée l''''entrelacement'''. il existe plusieurs formes d'entrelacement, mais nous allons commencer avec l'entrelacement le plus simple, qui vise à accélérer les accès en rafale.
===L'entrelacement classique===
L''''entrelacement classique''' vise à accélérer les accès en rafale, où plusieurs accès mémoire sont combinés en un seul. L'idée est que des adresses consécutives sont réparties dans des banques différentes. Les mémoires qui fonctionnent sur ce principe sont appelées des '''mémoires à entrelacement simple'''.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accéder à un plusieurs cases mémoire consécutives assez rapidement. L'entrelacement démarre un nouvel accès mémoire à chaque cycle d'horloge, pour lire des mots mémoire consécutifs un par un. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. En faisant cela, on n’a pas à attendre que la première banque ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. Généralement, les mémoires entrelacées supportent assez de banques pour qu'un accès en rafale de N octets accéde à N banques différentes.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
L'implémentation se base sur le fait que les banques sont de vraies sous-mémoires, avec un bit ''Chip Select'' ou un bit ''Output Enable''. La banque à laquelle accéder est sélectionnée en commandant son bit ''Chip Select'', ou un bit équivalent qui permet de déclencher un accès mémoire. La subtilité est que lorsqu'on désactive une banque, elle termine l'accès mémoire en cours avant de se désactiver. Le bit ''Chip Select'' sert plus de signal pour démarrer un accès mémoire qu'autre chose.
Les bits ''Chip Select'' ou équivalents sont générés par un circuit de décodage d'adresse. Il prend en entrée certains bits de l'adresse et en déduit les ''Chip Select''. Avec l'entrelacement simple, il utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés, ce qui implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===Les mémoires à entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures.
Pour rendre cela plus concret, nous allons dire que de tels accès étaient étaient autrefois fréquents sur les anciens processeurs vectoriels. Ils disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, et ces données pouvaient être séparées de N adresses en mémoire. L'instruction envoyait plusieurs accès mémoire consécutifs, séparés de N adresses, et le contrôleur mémoire devait les exécuter en série.
Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. Avec l'entrelacement simple, les performances sont un peu dégradées, mais cela ne fonctionne pas trop mal. Le cas extrêm est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
k0wda1cdwaku0ytt0mzw4yazionio8x
764559
764523
2026-04-22T22:52:00Z
Mewtow
31375
/* Les banques et l'entrelacement (interleaving) */
764559
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
L'utilité de ce genre d'accès n'est pas évidente. Mais il devient plus clair quand on sait que les mémoires caches utilisent des blocs de mémoire de grande taille. Lorsqu'on copie une donnée de la RAM dans le cache, c'est un bloc de 64 octets qui est copié, parfois plus. Et inversement, quand on rapatrie des données du cache vers la RAM, c'est un bloc de données de la même taille qui est écrit en RAM. Les transferts se font donc en plusieurs accès mémoires successifs, à des adresses consécutives, c'est à dire le genre d'accès optimisé par un accès en rafale.
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les banques et l'entrelacement (''interleaving'')==
Les '''mémoire multi-banque''' regroupent plusieurs mémoires indépendantes dans un seul boitier, dans un seul chip mémoire. Chaque sous-mémoire indépendante est appelée une '''banque''', ou encore un banc mémoire. Cette technique peut servir à améliorer les performances, la consommation d'énergie, et j'en passe.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous. La capacité de la mémoire RAM est augmentée, car on combine plusieurs chips mémoire, mais les autres avantages sont assez limités. Un des rares avantages est que cela permet de faciliter le rafraichissement d'une mémoire DRAM. On peut rafraichir chaque chip mémoire en parallèle, indépendamment des autres. Par exemple, si je combine 4 chips mémoire, je peux rafraichir quatre chips en même temps, en parallèle. Mais il faut que le contrôleur de DRAM permette ce genre de choses.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
En pratique, aucune mémoire multibanque ne fait ainsi. A la place, elles utilisent une optimisation appelée l''''entrelacement'''. il existe plusieurs formes d'entrelacement, mais nous allons commencer avec l'entrelacement le plus simple, qui vise à accélérer les accès en rafale.
===L'entrelacement classique===
L''''entrelacement classique''' vise à accélérer les accès en rafale, où plusieurs accès mémoire sont combinés en un seul. L'idée est que des adresses consécutives sont réparties dans des banques différentes. Les mémoires qui fonctionnent sur ce principe sont appelées des '''mémoires à entrelacement simple'''.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accéder à un plusieurs cases mémoire consécutives assez rapidement. L'entrelacement démarre un nouvel accès mémoire à chaque cycle d'horloge, pour lire des mots mémoire consécutifs un par un. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. En faisant cela, on n’a pas à attendre que la première banque ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. Généralement, les mémoires entrelacées supportent assez de banques pour qu'un accès en rafale de N octets accéde à N banques différentes.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
L'implémentation se base sur le fait que les banques sont de vraies sous-mémoires, avec un bit ''Chip Select'' ou un bit ''Output Enable''. La banque à laquelle accéder est sélectionnée en commandant son bit ''Chip Select'', ou un bit équivalent qui permet de déclencher un accès mémoire. La subtilité est que lorsqu'on désactive une banque, elle termine l'accès mémoire en cours avant de se désactiver. Le bit ''Chip Select'' sert plus de signal pour démarrer un accès mémoire qu'autre chose.
Les bits ''Chip Select'' ou équivalents sont générés par un circuit de décodage d'adresse. Il prend en entrée certains bits de l'adresse et en déduit les ''Chip Select''. Avec l'entrelacement simple, il utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés, ce qui implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
jq5xtrywv1leyu7k5leaebemt8tyndx
764562
764559
2026-04-22T23:00:23Z
Mewtow
31375
/* Les banques et l'entrelacement (interleaving) */ Déplacement dans le chapitre sur le parallélisme mémoire.
764562
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
L'utilité de ce genre d'accès n'est pas évidente. Mais il devient plus clair quand on sait que les mémoires caches utilisent des blocs de mémoire de grande taille. Lorsqu'on copie une donnée de la RAM dans le cache, c'est un bloc de 64 octets qui est copié, parfois plus. Et inversement, quand on rapatrie des données du cache vers la RAM, c'est un bloc de données de la même taille qui est écrit en RAM. Les transferts se font donc en plusieurs accès mémoires successifs, à des adresses consécutives, c'est à dire le genre d'accès optimisé par un accès en rafale.
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs banques monoports. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une banque tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même banque, il y a un '''conflit d'accès aux banques'''. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
8zc66utrw5whox7r86vsbv19yf3gip2
764569
764562
2026-04-22T23:25:24Z
Mewtow
31375
/* Le multiports externe */
764569
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
L'utilité de ce genre d'accès n'est pas évidente. Mais il devient plus clair quand on sait que les mémoires caches utilisent des blocs de mémoire de grande taille. Lorsqu'on copie une donnée de la RAM dans le cache, c'est un bloc de 64 octets qui est copié, parfois plus. Et inversement, quand on rapatrie des données du cache vers la RAM, c'est un bloc de données de la même taille qui est écrit en RAM. Les transferts se font donc en plusieurs accès mémoires successifs, à des adresses consécutives, c'est à dire le genre d'accès optimisé par un accès en rafale.
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une mémoire monoport tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même mémoire monoport, il y a un conflit d'accès. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
L'implémentation est plus compliquée sur les mémoires multi-banques, car il faut prévoir de quoi copier des données d'une banque à l'autre. L'optimisation précédente ne fonctionne alors pas du tout, mais on gagne quand même un peu en performance et en consommation d'énergie, vu qu'il n'y a pas de transmission sur le bus mémoire avec toutes les lenteurs que cela implique.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
tba1x0kn3e855oy0dyjhr4rgs5gy7fn
764570
764569
2026-04-22T23:25:40Z
Mewtow
31375
/* Les optimisations des copies en mémoire */
764570
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
L'utilité de ce genre d'accès n'est pas évidente. Mais il devient plus clair quand on sait que les mémoires caches utilisent des blocs de mémoire de grande taille. Lorsqu'on copie une donnée de la RAM dans le cache, c'est un bloc de 64 octets qui est copié, parfois plus. Et inversement, quand on rapatrie des données du cache vers la RAM, c'est un bloc de données de la même taille qui est écrit en RAM. Les transferts se font donc en plusieurs accès mémoires successifs, à des adresses consécutives, c'est à dire le genre d'accès optimisé par un accès en rafale.
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une mémoire monoport tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même mémoire monoport, il y a un conflit d'accès. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
dyyxkxtsho26lz18pi452ckc16qhtue
764571
764570
2026-04-22T23:25:56Z
Mewtow
31375
/* Le multiports externe */
764571
wikitext
text/x-wiki
Les mémoires vues au chapitre précédent sont les mémoires les plus simples qui soient. Mais ces mémoires peuvent se voir ajouter quelques améliorations pas franchement négligeables, afin d'augmenter leur rapidité, ou de diminuer leur consommation énergétique. Dans ce chapitre, nous allons voir quelles sont ces améliorations les plus courantes.
==L'accès en rafale==
L''''accès en rafale''' est un accès mémoire qui permet de lire ou écrire plusieurs adresses consécutives en envoyant une seule adresse, en un seul accès mémoire. On envoie la première adresse et la mémoire s'occupe de lire/écrire les adresses suivantes les unes après les autres, automatiquement. L'accès en rafale fait que l'on n'a pas à envoyer plusieurs adresses, mais une seule. Un accès de ce type est appelé un accès en rafale, ou encore une rafale.
[[File:Accès en mode rafale.png|centre|vignette|upright=3|Accès en mode rafale.]]
L'utilité de ce genre d'accès n'est pas évidente. Mais il devient plus clair quand on sait que les mémoires caches utilisent des blocs de mémoire de grande taille. Lorsqu'on copie une donnée de la RAM dans le cache, c'est un bloc de 64 octets qui est copié, parfois plus. Et inversement, quand on rapatrie des données du cache vers la RAM, c'est un bloc de données de la même taille qui est écrit en RAM. Les transferts se font donc en plusieurs accès mémoires successifs, à des adresses consécutives, c'est à dire le genre d'accès optimisé par un accès en rafale.
Le nombre d'adresses consécutives lues lors d'une rafale est généralement fixé une fois pour toutes et toutes les rafales ont la même taille. Par exemple, sur les mémoires asynchrones EDO-RAM, les rafales lisent/écrivent 4 octets consécutifs automatiquement, au rythme d'un par cycle d’horloge. D'autres mémoires gèrent plusieurs tailles pré-fixées, que l'on peut choisir au besoin. Par exemple, on peut choisir entre une rafale de 4 octets consécutifs, 8 octets consécutifs, ou 16 octets consécutifs. C'est le cas sur les mémoires SDRAM, où on peut choisir s'il faut lire 1, 2, 4, ou 8 octets en rafale.
===L'accès en rafale séquentiel, linéaire et entrelacé===
Il existe plusieurs types d'accès en rafale : l'accès entrelacé, l'accès linéaire et l'accès séquentiel.
Le mode séquentiel est le mode rafale normal : on accède à des octets consécutifs les uns après les autres. Peu importe l'adresse à laquelle on commence, on lit les N adresses suivantes lors de l'accès en rafale. Sur certaines mémoires, la rafale peut commencer n'importe où. Mais sur d'autres, le mode séquentiel est parfois restreint et ne peut démarrer qu'à certaines adresses bien précises. Par exemple, pour une mémoire dont le mot mémoire fait 4 octets bits, avec une rafale de 8 mots, on ne peut démarrer les rafales qu'à des adresses multiples de 8 * 4 = 64 octets. Il s'agit d'une contrainte dite d'alignement de rafale. Pour le dire autrement, la mémoire est découpées en blocs qui font la même taille qu'une rafale, et une rafale ne peut transmettre qu'on bloc complet en partant du début.
Le mode linéaire est un petit peu plus compliqué. Il lit un bloc de taille fixe, qui est aligné en mémoire, comme expliqué dans le paragraphe précédent. Mais il peut commencer l'accès en rafale n'importe où dans le bloc, tout en lisant/écrivant la totalité du bloc. Par exemple, prenons une rafale de 8 octets, dont les octets ont les adresses 0, 1, 2, 3, 4, 5, 6, et 7. Un accès séquentiel aligné doit commencer à l'adresse 0. Mais une rafale en mode linéaire peut très bien commencer par lire ou écrire l'octet numéro 3, par exemple. Dans ce cas, on commence par lire l'octet numéroté 3, puis le 4, le 5, le 6 et le 7. Puis, l'accès reprend au bloc 0, avant d’accéder aux blocs 1, 2 et 3. En clair, la mémoire est découpée en blocs de 8 octets consécutifs et l'accès lit un bloc complet. Si la première adresse lue commence à la première adresse du bloc, l'accès est identique à l'accès séquentiel. Mais si l'adresse de départ de la rafale est dans le bloc, la lecture commence à cette adresse, puis reprend au début du bloc une fois arrivé au bout.
Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Pour comprendre un petit peu mieux ces notions, nous allons prendre l'exemple du mode rafale sur les processeurs x86 présents dans nos ordinateurs actuels. Sur ces processeurs, le mode rafale permet des rafales de 4 octets, alignés sur en mémoire. Les rafales peuvent se faire en mode linéaire ou entrelacé, mais il n'y a pas de mode séquentiel. Vu que les rafales se font en 4 octets dans ces deux modes, la rafale gère les deux derniers bits de l'adresse, qui sont modifiés automatiquement par la rafale. Dans ce qui suit, nous allons indiquer les deux bits de poids faible et montrer comment ils évoluent lors d'une rafale. Le reste de l'adresse ne sera pas montré, car il pourrait être n'importe quoi.
Voici ce que cela donne en mode linéaire :
{|class="wikitable"
|+ Accès en mode rafale de type linéaire sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 10
| 11
| 00
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 00
| 01
| 10
|}
Voici ce que cela donne en mode entrelacé :
{|class="wikitable"
|+ Accès en mode rafale de type entrelacé sur les processeurs x86.
|-
!
! 1er accès
! 2nd accès
! 3ème accès
! 4ème accès
|-
! Exemple 1
| 00
| 01
| 10
| 11
|-
! Exemple 2
| 01
| 00
| 11
| 10
|-
! Exemple 3
| 10
| 11
| 00
| 01
|-
! Exemple 4
| 11
| 10
| 01
| 00
|}
===L'implémentation des accès en rafale===
Au niveau de la microarchitecture, l'accès en rafale s'implémente en ajoutant un compteur dans la mémoire. L'adresse de départ est mémorisée dans un registre en aval de la mémoire. Pour gérer les accès en rafale séquentiels, il suffit que le registre qui stocke l'adresse mémoire à lire/écrire soit transformé en compteur.
Pour les accès en rafale linéaire, le compteur est séparé de ce registre. Ce compteur est initialisé à 0 lors de la transmission d'une adresse, mais est incrémenté à chaque cycle sinon. L'adresse à lire/écrire à chaque cycle se calcule en additionnant l'adresse de départ, mémorisée dans le registre, au contenu du compteur. Pour les accès en rafale entrelacés, c'est la même chose, sauf que l'opération effectuée entre l'adresse de départ et le compteur n'est pas une addition, mais une opération XOR bit à bit.
[[File:Microarchitecture d'une RAM avec accès en rafale linéaire.jpg|centre|vignette|upright=2|Microarchitecture d'une RAM avec accès en rafale linéaire.]]
==Les mémoires multiports==
Les '''mémoires multiports''' sont reliées non pas à un, mais à plusieurs bus. Chaque bus est connecté sur la mémoire sur ce qu'on appelle un port. Ces mémoires permettent de transférer plusieurs données à la fois, une par port. Le débit est sont donc supérieur à celui des mémoires mono-port. De plus, chaque port peut être relié à des composants différents, ce qui permet de partager une mémoire entre plusieurs composants. Comme autre exemple, certaines mémoires multiports ont un bus sur lequel on ne peut que lire une donnée, et un autre sur lequel on ne peut qu'écrire.
[[File:Mémoire multiport.png|centre|vignette|upright=2|Mémoire multiport.]]
===Le multiports idéal===
Une première solution consiste à créer une mémoire qui soit vraiment multiports. Avec une mémoire multiports, tout est dupliqué sauf les cellules mémoire. La méthode utilisée dépend de si la cellule mémoire est fabriquée avec une bascule, ou avec une cellule SRAM. Elle dépend aussi de l'interface de la bascule.
Les mémoires multiport les plus simples sont les mémoires double port, avec un port de lecture et un d'écriture. Il suffit de prendre des cellules à double port, avec un port de lecture et un d'écriture. Il suffit de connecter la sortie de lecture à un multiplexeur, et l'entrée d'écriture à un démultiplexeur.
[[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]]
On peut améliorer la méthode précédente pour augmenter le nombre de ports de lecture assez facilement : il suffit de connecter plusieurs multiplexeurs.
[[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]]
Les choses sont plus compliquées avec les cellules mémoires à une seule broche d'entrée-sortie, ou à celles connectées à une ligne de bit. Dans les mémoires vues précédemment, chaque cellule mémoire est reliée à bitline via un transistor, lui-même commandé par le décodeur. Chaque port a sa propre bitline dédiée, ce qui donne N bitlines pour une mémoire à N ports. Évidemment, cela demande d'ajouter des transistors de sélection, pour la connexion et la déconnexion. De plus, ces transistors sont dorénavant commandés par des décodeurs différents : un par port. Et on a autant de duplications que l'on a de ports : N ports signifie tout multiplier par N. Autant dire que ce n'est pas l'idéal en termes de consommation énergétique !
Cette solution pose toutefois un problème : que se passe-t-il lorsque des ports différents écrivent simultanément dans la même cellule mémoire ? Eh bien tout dépend de la mémoire : certaines donnent des résultats plus ou moins aléatoires et ne sont pas conçues pour gérer de tels accès, d'autres mettent en attente un des ports lors de l'accès en écriture. Sur ces dernières, il faut évidemment rajouter des circuits pour détecter les accès concurrents et éviter que deux ports se marchent sur les pieds.
===Le multiports à état partagé===
Certaines mémoires ont besoin d'avoir un très grand nombre de ports de lecture. Pour cela, on peut utiliser une mémoire multiports à état dupliqué. Au lieu d'utiliser une seule mémoire de 20 ports de lecture, le mieux est d'utiliser 4 mémoires qui ont chacune 5 ports de lecture. Toutefois, ces quatre mémoires possèdent exactement le même contenu, chacune d'entre elles étant une copie des autres : toute donnée écrite dans une des mémoires l'est aussi dans les autres. Comme cela, on est certain qu'une donnée écrite lors d'un cycle pourra être lue au cycle suivant, quel que soit le port, et quelles que soient les conditions.
[[File:Mémoire multiport à état partagé.png|centre|vignette|upright=2.5|Mémoire multiport à état partagé.]]
===Le multiports externe===
D'autres mémoires multiports sont fabriquées à partir d'une mémoire à un seul port, couplée à des circuits pour faire l'interface avec chaque port.
[[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]]
Une première méthode pour concevoir ainsi une mémoire multiports est d'augmenter la fréquence de la mémoire mono-port sans toucher à celle du bus. À chaque cycle d'horloge interne, un port a accès au plan mémoire.
La seconde méthode est basée sur des '''stream buffers'''. Elle fonctionne bien avec des accès à des adresses consécutives. Dans ces conditions, on peut tricher en lisant ou en écrivant plusieurs blocs à la fois dans la mémoire interne mono-port : la mémoire interne a un port très large, capable de lire ou d'écrire une grande quantité de données d'un seul coup. Mais ces données ne pourront pas être envoyées sur les ports de lecture ou reçues via les ports d'écritures, nettement moins larges. Pour la lecture, il faut obligatoirement utiliser un circuit qui découpe les mots mémoires lus depuis la mémoire interne en données de la taille des ports de lecture, et qui envoie ces données une par une. Et c'est la même chose pour les ports d'écriture, si ce n'est que les données doivent être fusionnées pour obtenir un mot mémoire complet de la RAM interne.
Pour cela, chaque port se voit attribuer une mémoire qui met en attente les données lues ou à écrire dans la mémoire interne : le ''stream buffer''. Si le transfert de données entre RAM interne et stream buffer ne prend qu'un seul cycle, ce n'est pas le cas pour les échanges entre ports de lecture et écriture et stream buffer : si le mot mémoire de la RAM interne est n fois plus gros que la largeur d'un port de lecture/écriture, il faudra envoyer le mot mémoire en n fois, ce qui donne n^cycles. Ainsi, pendant qu'un port accèdera à la mémoire interne, les autres ports seront occupés à lire le contenu de leurs stream buffers. Ces stream buffers sont gérés par des circuits annexes, pour éviter que deux ''stream buffers'' accèdent en même temps dans la mémoire interne.
[[File:Mémoire multiport streamée.png|centre|vignette|upright=2.5|Mémoire multiport streamée.]]
La troisième méthode remplace les stream buffers par des caches, et utilise une mémoire interne qui ne permet pas de lire ou d'écrire plusieurs mots mémoires d'un coup. Ainsi, un port pourra lire le contenu de la mémoire interne pendant que les autres ports seront occupés à lire ou écrire dans leurs caches.
[[File:Mémoire à multiports caché.png|centre|vignette|upright=2.5|Mémoire à multiports caché.]]
La méthode précédente peut être améliorée, en utilisant non pas une seule mémoire monoport en interne, mais plusieurs. Dans ce cas, il n'y a pas besoin d'utiliser de mémoires caches ou de ''stream buffers'' : chaque port peut accéder à une mémoire monoport tant que les autres ports n'y touchent pas. Évidemment, si deux ports veulent lire ou écrire dans la même mémoire monoport, il y a un conflit d'accès. Un choix devra être fait et un des deux ports devra être mis en attente.
[[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports caché, optimisée.]]
==Les mémoires à détection et correction d'erreur==
La performance et la capacité ne sont pas les deux seules caractéristiques importantes des mémoires. On attend d'elles qu'elles soient fiables, qu'elles stockent des données sans erreur. Si on stocke un 0 dans une cellule mémoire, on ne souhaite pas qu'une lecture ultérieure renvoie un 1 ou une valeur illisible. Malheureusement, ce n'est pas toujours le cas et quelques erreurs mineures peuvent survenir. Les erreurs en question se traduisent le plus souvent par l'inversion d'un bit : un bit censé être à 0 passe à 1, ou inversement. Pour donner un exemple, on peut citer l'incident du 18 mai 2003 dans la petite ville belge de Schaerbeek. Lors d'une élection, la machine à voter électronique enregistra un écart de 4096 voix entre le dépouillement traditionnel et le dépouillement électronique. La faute à un rayon cosmique, qui avait modifié l'état d'un bit de la mémoire de la machine à voter.
La majorité de ces inversions de bits proviennent de l'interaction de particules à haute énergie avec le circuit. Les plus importantes sont les rayons cosmiques, des particules à haute énergie produites dans la haute atmosphère et qui traversent celle-ci à haute vitesse. Les secondes plus importantes sont les rayons alpha, provenant de la radioactivité naturelle qu'on trouve un peu partout. Et, ironie du sort, ces rayons alpha proviennent souvent du métal présent dans la puce elle-même ou de son packaging !
Les techniques pour détecter et corriger ces erreurs sont nombreuses, comme nous l'avions vu dans le chapitre dédié sur les circuits de correction d'erreur. Mais elles ne sont pas appliquées de manière systématique, seulement quand ça en vaut la peine. Pour ce qui est du processeur, les techniques sont très rarement utilisées et sont réservées à l'automobile, l'aviation, le spatial, etc. Pour les mémoires les techniques sont déjà plus fréquentes sur les ordinateurs personnels, bien que vous n'en ayez pas vraiment conscience.
La première raison à cela est que les mémoires sont plus sujettes aux erreurs. Historiquement, du fait de leur conception, les mémoires sont plus sensibles à l'action des rayons cosmiques ou des particules alpha. Leur plus grande densité, le fait qu'elles stockent des bits sur de longues périodes de temps, leur processus de fabrication différent, tout cela les rend plus fragiles. La seconde raison est qu'il existe des techniques assez simples et pratiques pour rendre les mémoires tolérantes aux erreurs, qui ne s'appliquent pas pour le processeur ou les autres circuits. Il s'agit ni plus ni moins que l'usage de codes ECC, que nous avions abordé au début du cours dans un chapitre dédié, mais que nous allons rapidement réexpliquer dans ce qui suit.
===Les mémoires ECC===
Les codes de détection et de correction d'erreur ajoutent des bits de correction/détection d'erreur aux données mémorisées. A chaque octet, on rajoute quelques bits calculés à partir des données de l'octet, qui servent à détecter et éventuellement corriger une erreur. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Ils sont généralement assez simples à mettre en œuvre, pour un cout modéré en circuit et en performance.
Il existe différents codes de ce type. Le plus simple est le '''bit de parité mémoire''', qui ajoute un bit à l'octet mémorisé, de manière à ce que le nombre de bits à 1 soit pair. En clair, si on compte les bits à 1 dans l'octet, bit de parité inclus, alors le résultat est pair. Cela permet de détecter qu'une erreur a eu lieu, qu'un bit a été inversé, mais on ne peut pas corriger l'erreur. Un bit de parité indique qu'un bit a été modifié, mais on ne sait pas lequel.
Lorsqu'on lisait un octet dans la mémoire, le contrôleur mémoire calculait le bit de parité de l'octet lu. Le résultat était alors comparé au bit de parité stocké dans l'octet. Si les deux concordent, on suppose qu'il n'y a pas eu d'erreurs. C'est possible qu'il y en ait eu, comme une double erreur qui inverse deux bits à la fois, mais de telles erreurs ne se voient pas avec un bit de parité. Par contre, si les deux bits de parité sont différents, alors on sait qu'il y a eu une erreur. Par contre, vu qu'on ne sait pas quel bit a été inversé, on sait que la donnée est corrompu, sans pouvoir récupérer la donnée originale. Aussi, quand l'ordinateur détectait une erreur, il n'avait pas d'autre choix que de stopper l'ordinateur et d'afficher un écran bleu dans le pire des cas.
Les mémoires DRAM d'avant les années 1990 utilisaient systématiquement un bit de parité par octet. Les mémoires de l'époque étaient assez peu fiables, du fait de processus de fabrication pas encore perfectionnés, et l'usage d'un bit de parité permettait de compenser cela. Les tous premiers ordinateurs mémorisaient les bits de parité dans une mémoire séparée, adressée en parallèle de la mémoire principale. Mais depuis l'arrivée des barrettes de mémoire, les bits de parité sont stockés dans les cases mémoire elle-mêmes, sur la barrette de mémoire. Depuis les années 1990, l'usage d'un bit de parité est tombé en désuétude avec l'amélioration de la fiabilité intrinsèque des DRAM.
[[File:SIMM.jpg|centre|vignette|Une barrette mémoire contenant 9 puces mémoires (les boitiers noirs). Il y en a un par bit et vous remarquerez qu'il y a 9 puces mémoires : 8 pour les données des octets, le 9ème pour les bits de parité.]]
Les '''mémoires ECC''' utilisent un code plus puissant qu'un simple bit de parité. Le code en question permet non seulement de détecter qu'un bit a été inversé, mais permettent aussi de déterminer lequel. Le code en question ajoute au minimum deux bits par octet/adresse. Nous avions vu quelques codes de ce genre dans le chapitre sur les circuits de correction d'erreur, nous ne ferons pas de rappels, qui seraient de toute façon inutiles dans ce chapitre. La majorité des codes utilisés sur les mémoires ECC permettent de corriger l'inversion d'un bit. De plus, ils permettent de détecter les situations où deux bits ont été inversés (deux erreurs simultanés) mais sans les corriger. Mais le cout en circuits est plus conséquent : il y a environ 4 bits d'ECC par octet.
Là encore, la détection/correction d'erreur est le fait de circuits spécialisés qui calculent les bits d'ECC à partir de l'octet lu, et comparent le tout aux bits d'ECC mémorisés dans la RAM. Les circuits d'ECC se situent généralement dans le contrôleur mémoire, mais se peut qu'ils soient intégrés dans la barrette mémoire. La différence entre les deux est une question de compatibilité. S'ils sont intégrés dans la barrette mémoire, la gestion de l'ECC est complétement transparente et est compatible avec n'importe quelle carte mère, peu importe le contrôleur mémoire utilisé. Par contre, si elle est le fait du contrôleur mémoire, alors il peut y avoir des problèmes de compatibilité. Une barrette non-ECC fonctionnera toujours, mais ce n'est pas le cas des barrettes ECC. Le contrôleur mémoire doit gérer l'ECC et être couplé à des barrettes ECC pour que le tout fonctionne. Si on branche une mémoire ECC sur un contrôleur mémoire qui ne gère pas l'ECC, l'ordinateur ne démarre même pas. Notons que de nos jours, le contrôleur mémoire est intégré dans le processeur : c'est ce dernier qui gère l'ECC.
L'usage de l'ECC sur les ordinateurs personnels est assez complexe à expliquer. Précisons d'abord qu'il est rare de trouver des mémoires ECC dans les ordinateurs personnels, alors qu'elles sont systématiquement présentes sur les serveurs. Par contre, les mémoires cache d'un processeur de PC utilisent systématiquement l'ECC. En effet, si les DRAM sont sensibles aux erreurs, mais que les SRAM le sont tout aussi ! Les caches aussi peuvent subir des erreurs, et ce d'autant plus que le processeur est miniaturisé. Et pour cela, les caches des CPU actuels incorporent soit des bits de parité, soit de la SRAM ECC. Tout dépend du niveau de cache, comme on le verra dans le chapitre sur le cache.
===Le ''memory scrubbing''===
La plupart des erreurs ne changent qu'un seul bit dans un octet, mais le problème est que ces erreurs s'accumulent. Entre deux accès à un octet, il se peut que plusieurs erreurs se soient accumulées, ce qui dépasse les capacités de correction de l'ECC. Dans ce cas, il existe une solution appelée le ''memory scrubbing'', qui permet de résoudre le problème au prix d'un certain cout en performance.
L'idée est de vérifier chaque octet régulièrement, pour éviter que les erreurs s'accumulent. Par exemple, on peut vérifier chaque octet toutes les N millisecondes, et corriger une éventuelle erreur lors de cette vérification. En faisant des vérifications régulières, on garantir que les erreurs n'ont pas le temps de s'accumuler, sauf en cas de malchance avec des erreurs très proches dans le temps. Et évidemment, le ''memory scrubbing'' a un cout en performance, car cela fait des accès en plus. Des accès qui sont de plus timés à des instants bien précis qui ne sont pas forcément les plus adéquats.
Précisons qu'il ne s'agit pas d'un rafraichissement mémoire, même si ça a un effet similaire. Disons que lors de chaque "pseudo-rafraichissement", l'octet est purgé de ses erreurs, pas rafraichit. D'ailleurs, les mémoires SRAM peuvent incorporer du ''memory scrubbing'', et de nombreuses mémoires cache ne s'en privent pas, comme on le verra dans le chapitre sur le cache. Cependant, sur les mémoires DRAM, le ''memory scrubbing'' peut se faire en même temps que le rafraichissement mémoire, afin de fortement limiter son cout en performance.
Le ''memory scrubbing'' peut compléter soit l'ECC, soit un bit de parité. Imaginons par exemple qu'on le combine avec un bit de parité. Le bit de parité permet de détecter qu'une erreur a eu lieu. Mais si deux erreurs ont lieu, le bit de parité ne pourra pas détecter la double erreur. Le bit de parité indiquera que la donnée est valide. Pour éviter cela, on utilise le ''memory scrubbing'' pour éviter que deux erreurs consécutives s'accumulent, permettant de détecter un problème dès la première erreur. On n'attend pas de lire la donnée invalide pour vérifier le bit de parité.
Le même raisonnement a lieu avec l'ECC, avec quelques différences. Au lieu d'attendre que deux erreurs aient lieu, ce que l'ECC peut détecter, mais pas corriger, on effectue des vérifications régulières. Si une vérification tombe entre deux erreurs, elle corrigera la première erreur avant que la seconde survienne. Au final, on a une mémoire non-corrompue : l'ECC corrige la première erreur, puis la suivante, au lieu de laisser deux erreurs s'accumuler et d'avoir un résultat détectable mais pas corrigeable.
==Les mémoires à tampon de ligne optimisées==
Dans cette section, nous allons voir les optimisations rendues possibles sur les mémoires à tampon de ligne. Ce sont techniquement des mémoires à tampon de ligne. Pour rappel, elles sont organisées en lignes et colonnes. Elles sont composées d'une mémoire dont les cases mémoire sont des lignes, d'un tampon de ligne pour mémoriser la ligne en cours de traitement, et d'un multiplexeur/démultiplexeur pour lire/écrire les mots mémoires adressés dans la ligne.
[[File:Mémoire à row buffer. 02.png|centre|vignette|upright=2|Mémoire à tampon de ligne à registre.]]
===L'implémentation du mode rafale===
Diverses optimisations se basent sur la présence du tampon de ligne. L'implémentation du mode rafale est par exemple grandement facilitée sur ces mémoires. Une rafale permet de lire le contenu d'une ligne d'un seul bloc, idem pour les écritures. Pour une lecture, la ligne est copiée dans le tampon de ligne, puis la rafale démarre. Les mot mémoires à lire sont alors lus dans le tampon de ligne directement, un par un. Il suffit de configurer le multiplexeur pour passer d'une adresse à la suivante. Le compteur de rafale est relié au multiplexeur, sur son entrée, et est incrémenté à chaque cycle d'horloge du bus mémoire.
Il en est de même pour l'écriture, sauf qu'il y a une étape en plus. La ligne à écrire est copiée dans le tampon de ligne, puis l'écriture en rafale a lieu dans le tampon de ligne, mot mémoire par mot mémoire, et la ligne est ensuite recopiée du tampon de ligne vers la mémoire. Vous vous demandez sans doute pourquoi copier la ligne dans le tampon de ligne avant d'écrire dedans. La réponse est que la rafale ne fait pas forcément la taille d'une ligne. Par exemple, si une ligne fait 126 octets et que la rafale en seulement 8, il faut tenir compte des octets non-modifiés dans la ligne. Sachant qu'il n'y a pas de copie partielle du tampon de ligne dans la mémoire RAM, recopier la ligne pour la modifier est la meilleure solution.
Un défaut de cette implémentation est qu'une rafale ne put pas être à cheval sur deux lignes, sauf si la RAM incorpore des optimisations complémentaires. Les rafales doivent être alignées de manière à rentrer dans une ligne complète. Pour rendre l'alignement plus facile, la taille des lignes doit être un multiple de la longueur de la rafale. De plus, les rafales doivent être alignées, que ce soit en mode séquentiel ou linéaire. Par exemple, si une rafale lit/écrit 4 octets, alors les lignes doivent faire 8 * N octets. De plus, les rafales doivent commencer à une adresse multiple de 8 octets * 4 adresses consécutives = 32 octets. Pour le dire autrement, la rafale voit la mémoire comme des blocs qui peuvent être transmis en rafale. Mais impossible de lancer une rafale au beau milieu d'un bloc, sauf à utiliser le mode rafale linéaire pour revenir au début du bloc quand on atteint la fin.
===Les mémoires à cache de ligne intégré===
Quelques modèles de RAM à tampon de ligne ont ajouté un cache qui mémorise les dernières lignes ouvertes, ce qui permet d'améliorer les performances. Les RAM en question sont les EDRAM (''enhanced DRAM''), ESDRAM (''enhanced synchronous DRAM''), ''Virtual Channel Memory RAM'', et CDRAM (''Cached DRAM''). Elles demandaient pour certaines une modification de l'interface, avec des commandes pour copier le tampon de ligne dans le cache, en plus des traditionnelles commandes de lecture/écriture. L'idée était d'avoir plusieurs lignes ouvertes en même temps, ce qui améliorait les performances dans certains scénarios.
[[File:Mémoire à cache de ligne intégré.png|centre|vignette|upright=2|Mémoire à cache de ligne intégré]]
===Les optimisations des copies en mémoire===
Une telle organisation en tampon de ligne permet d'implémenter facilement les accès en rafale, mais aussi d'autres opérations. L'une d'entre elle est la '''copie de données en mémoire'''. Il n'est pas rare que le processeur copie des blocs de données d'une adresse vers une autre. Par exemple, pour copier 12 kibioctets qui commencent à l'adresse X, vers un autre bloc de même taille, mais qui commence à l'adresse M. En théorie, la copie se fait mot mémoire par mot mémoire, mais la technologie '''''row clone''''' permet de faire la copie ligne par ligne.
L'idée est de lire une ligne, de la stocker dans le tampon de ligne, puis de l'écrire à la destination voulue. Pas de passage par le bus de données, les données ne sortent pas de la mémoire. L'avantage est que la copie des données est beaucoup plus rapide. De plus, elle consomme nettement moins d'énergie, car il n'y a pas de transmission sur le bus mémoire, sans compter qu'on n'a pas d'utilisation des multiplexeurs/démultiplexeurs.
L'implémentation demande d'ajouter des registres dans la mémoire pour mémoriser les adresses de départ/destination, mais surtout d'ajouter des commandes sur le bus mémoire pour déclencher ce genre de copie. Il faut ajouter une commande de copie, qui désigne la ligne originelle et la ligne de destination, des numéros de lignes doivent être transmis dans la commande et mémorisés par la mémoire, etc.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Contrôleur mémoire interne
| prevText=Le contrôleur mémoire interne
| next=Les mémoires ROM
| nextText=Les mémoires ROM
}}
</noinclude>
kyycr785hte88oi2dpgzjycyjjjumxf
Fonctionnement d'un ordinateur/Le parallélisme mémoire
0
65888
764458
764335
2026-04-22T15:17:46Z
Mewtow
31375
/* Le ré-ordonnancement des commandes mémoires */
764458
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir des caches qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache. Ils peuvent être utilisés aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Les processeurs à émission dans l'ordre ou le désordre peuvent techniquement lancer des accès mémoire à chaque cycle, mais ces accès mémoires prennent du temps, ce qui fait qu'on peut avoir des accès mémoires qui ont lieu en même temps.
Diverses techniques permettent au cache de gérer plusieurs accès simultanés. La première est l'usage de caches pipelinés, qui permet de gérer plusieurs accès mémoires en même temps. Les caches non-bloquants permettent de gérer plusieurs défauts de cache simultanés. Les deux techniques sont complémentaires, et sont parfois employées en même temps. Nous allons les voir dans ce chapitre, en commençant par les caches pipelinés.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les contrôleurs mémoire ne sont pas en reste, eux aussi ! les contrôleurs des mémoires DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Pour être précis, ces accès mémoire sont mis en attente dans une mémoire FIFO, puis exécutés un par un. Le contrôleur mémoire peut intégrer des optimisations pour changer l'ordre des accès mémoire, qui plus est. Voyons cela en détail.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le ré-ordonnancement des commandes mémoires===
Le contrôleur mémoire précédent est très simple, mais il ne correspond à ce qu'on trouve dans un contrôleur mémoire moderne. Un contrôleur mémoire moderne n'utilise pas une mémoire FIFO pour mettre en attente les lectures et écritures. Il préfère changer l'ordre des requêtes mémoires, pour gagner en performances.
Il faut préciser que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. A la place, il reçoit des requêtes mémoire qui sont "numérotées", qui ont identifiant pour les identifier. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
L'implémentation la plus basique n'a rien de vraiment compliqué. Pour rappel, une SDRAM contient plusieurs banques indépendantes, qu'on peut accéder en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. L'implémentation la plus basique utilise une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
Le ré-ordonnancement peut aussi regrouper les accès dans une même banque. L'idée est de faire en sorte que des accès consécutifs se fassent dans une même ligne. Je rappelle que les mémoires SDRAM sont des mémoires à tampon de ligne, à savoir qu'un accès mémoire se fait en deux fois. La première étape recopie une ligne de N octets dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une petite portion de 64 bits dans cette colonne, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Une optimisation est alors de regrouper ensemble les accès à une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Cela permet de profiter au mieux de la politique à page ouverte. L'idée est de profiter du fait qu'une page est restée ouverte pour effectuer un maximum d'accès dans cette ligne avant de la fermer.
Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
c1lsufect3x6deq7njvxxmssd2244te
764543
764458
2026-04-22T21:47:35Z
Mewtow
31375
/* Les contrôleurs mémoires SDRAM/DDR non-bloquants */
764543
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir des caches qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache. Ils peuvent être utilisés aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Les processeurs à émission dans l'ordre ou le désordre peuvent techniquement lancer des accès mémoire à chaque cycle, mais ces accès mémoires prennent du temps, ce qui fait qu'on peut avoir des accès mémoires qui ont lieu en même temps.
Diverses techniques permettent au cache de gérer plusieurs accès simultanés. La première est l'usage de caches pipelinés, qui permet de gérer plusieurs accès mémoires en même temps. Les caches non-bloquants permettent de gérer plusieurs défauts de cache simultanés. Les deux techniques sont complémentaires, et sont parfois employées en même temps. Nous allons les voir dans ce chapitre, en commençant par les caches pipelinés.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires SDRAM ne sont pas en reste, elles aussi aussi ! Les mémoires DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le ré-ordonnancement des commandes mémoires===
Le contrôleur mémoire précédent est très simple, mais il ne correspond à ce qu'on trouve dans un contrôleur mémoire moderne. Un contrôleur mémoire moderne n'utilise pas une mémoire FIFO pour mettre en attente les lectures et écritures. Il préfère changer l'ordre des requêtes mémoires, pour gagner en performances.
Il faut préciser que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. A la place, il reçoit des requêtes mémoire qui sont "numérotées", qui ont identifiant pour les identifier. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
L'implémentation la plus basique n'a rien de vraiment compliqué. Pour rappel, une SDRAM contient plusieurs banques indépendantes, qu'on peut accéder en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. L'implémentation la plus basique utilise une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
Le ré-ordonnancement peut aussi regrouper les accès dans une même banque. L'idée est de faire en sorte que des accès consécutifs se fassent dans une même ligne. Je rappelle que les mémoires SDRAM sont des mémoires à tampon de ligne, à savoir qu'un accès mémoire se fait en deux fois. La première étape recopie une ligne de N octets dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une petite portion de 64 bits dans cette colonne, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Une optimisation est alors de regrouper ensemble les accès à une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Cela permet de profiter au mieux de la politique à page ouverte. L'idée est de profiter du fait qu'une page est restée ouverte pour effectuer un maximum d'accès dans cette ligne avant de la fermer.
Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
2x9g927g9dap6jy337z35u8kc9dq465
764548
764543
2026-04-22T22:14:27Z
Mewtow
31375
764548
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires SDRAM ne sont pas en reste, elles aussi aussi ! Les mémoires DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le ré-ordonnancement des commandes mémoires===
Le contrôleur mémoire précédent est très simple, mais il ne correspond à ce qu'on trouve dans un contrôleur mémoire moderne. Un contrôleur mémoire moderne n'utilise pas une mémoire FIFO pour mettre en attente les lectures et écritures. Il préfère changer l'ordre des requêtes mémoires, pour gagner en performances.
Il faut préciser que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. A la place, il reçoit des requêtes mémoire qui sont "numérotées", qui ont identifiant pour les identifier. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
L'implémentation la plus basique n'a rien de vraiment compliqué. Pour rappel, une SDRAM contient plusieurs banques indépendantes, qu'on peut accéder en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. L'implémentation la plus basique utilise une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
Le ré-ordonnancement peut aussi regrouper les accès dans une même banque. L'idée est de faire en sorte que des accès consécutifs se fassent dans une même ligne. Je rappelle que les mémoires SDRAM sont des mémoires à tampon de ligne, à savoir qu'un accès mémoire se fait en deux fois. La première étape recopie une ligne de N octets dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une petite portion de 64 bits dans cette colonne, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Une optimisation est alors de regrouper ensemble les accès à une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Cela permet de profiter au mieux de la politique à page ouverte. L'idée est de profiter du fait qu'une page est restée ouverte pour effectuer un maximum d'accès dans cette ligne avant de la fermer.
Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
lijhgonwamektazh0p14bc3aux4fn17
764549
764548
2026-04-22T22:14:52Z
Mewtow
31375
764549
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires SDRAM ne sont pas en reste, elles aussi aussi ! Les mémoires DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le ré-ordonnancement des commandes mémoires===
Le contrôleur mémoire précédent est très simple, mais il ne correspond à ce qu'on trouve dans un contrôleur mémoire moderne. Un contrôleur mémoire moderne n'utilise pas une mémoire FIFO pour mettre en attente les lectures et écritures. Il préfère changer l'ordre des requêtes mémoires, pour gagner en performances.
Il faut préciser que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. A la place, il reçoit des requêtes mémoire qui sont "numérotées", qui ont identifiant pour les identifier. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
L'implémentation la plus basique n'a rien de vraiment compliqué. Pour rappel, une SDRAM contient plusieurs banques indépendantes, qu'on peut accéder en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. L'implémentation la plus basique utilise une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
Le ré-ordonnancement peut aussi regrouper les accès dans une même banque. L'idée est de faire en sorte que des accès consécutifs se fassent dans une même ligne. Je rappelle que les mémoires SDRAM sont des mémoires à tampon de ligne, à savoir qu'un accès mémoire se fait en deux fois. La première étape recopie une ligne de N octets dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une petite portion de 64 bits dans cette colonne, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Une optimisation est alors de regrouper ensemble les accès à une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Cela permet de profiter au mieux de la politique à page ouverte. L'idée est de profiter du fait qu'une page est restée ouverte pour effectuer un maximum d'accès dans cette ligne avant de la fermer.
Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
4ewsrklyzbn4xxt8ogahux7jgy2o0ul
764551
764549
2026-04-22T22:20:15Z
Mewtow
31375
/* Les contrôleurs mémoires SDRAM/DDR non-bloquants */
764551
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires SDRAM ne sont pas en reste, elles aussi aussi ! Les mémoires DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Maintenant, voyons comment une mémoire RAM peut exécuter plusieurs accès mémoire en même temps. Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente se=oit terminée. Concrètement, pendant que la commande précédente envoie des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
===Le ré-ordonnancement des commandes mémoires===
Le contrôleur mémoire précédent est très simple, mais il ne correspond à ce qu'on trouve dans un contrôleur mémoire moderne. Un contrôleur mémoire moderne n'utilise pas une mémoire FIFO pour mettre en attente les lectures et écritures. Il préfère changer l'ordre des requêtes mémoires, pour gagner en performances.
Il faut préciser que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. A la place, il reçoit des requêtes mémoire qui sont "numérotées", qui ont identifiant pour les identifier. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
L'implémentation la plus basique n'a rien de vraiment compliqué. Pour rappel, une SDRAM contient plusieurs banques indépendantes, qu'on peut accéder en parallèle. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. L'implémentation la plus basique utilise une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
Le ré-ordonnancement peut aussi regrouper les accès dans une même banque. L'idée est de faire en sorte que des accès consécutifs se fassent dans une même ligne. Je rappelle que les mémoires SDRAM sont des mémoires à tampon de ligne, à savoir qu'un accès mémoire se fait en deux fois. La première étape recopie une ligne de N octets dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une petite portion de 64 bits dans cette colonne, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Une optimisation est alors de regrouper ensemble les accès à une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Cela permet de profiter au mieux de la politique à page ouverte. L'idée est de profiter du fait qu'une page est restée ouverte pour effectuer un maximum d'accès dans cette ligne avant de la fermer.
Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
auond769gzlqtynzqb7dg7s2v0ak612
764552
764551
2026-04-22T22:20:40Z
Mewtow
31375
/* Le ré-ordonnancement des commandes mémoires */
764552
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires SDRAM ne sont pas en reste, elles aussi aussi ! Les mémoires DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Maintenant, voyons comment une mémoire RAM peut exécuter plusieurs accès mémoire en même temps. Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente se=oit terminée. Concrètement, pendant que la commande précédente envoie des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Le contrôleur mémoire précédent est très simple, mais il ne correspond à ce qu'on trouve dans un contrôleur mémoire moderne. Un contrôleur mémoire moderne n'utilise pas une mémoire FIFO pour mettre en attente les lectures et écritures. Il préfère changer l'ordre des requêtes mémoires, pour gagner en performances.
Il faut préciser que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. A la place, il reçoit des requêtes mémoire qui sont "numérotées", qui ont identifiant pour les identifier. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Le ré-ordonnancement peut aussi regrouper les accès dans une même banque. L'idée est de faire en sorte que des accès consécutifs se fassent dans une même ligne. Je rappelle que les mémoires SDRAM sont des mémoires à tampon de ligne, à savoir qu'un accès mémoire se fait en deux fois. La première étape recopie une ligne de N octets dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une petite portion de 64 bits dans cette colonne, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
Une optimisation est alors de regrouper ensemble les accès à une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Cela permet de profiter au mieux de la politique à page ouverte. L'idée est de profiter du fait qu'une page est restée ouverte pour effectuer un maximum d'accès dans cette ligne avant de la fermer.
Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
qzzfxc9inzii5wsnbzfmkd698aop93b
764553
764552
2026-04-22T22:27:45Z
Mewtow
31375
/* Le ré-ordonnancement des commandes mémoires */
764553
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires SDRAM ne sont pas en reste, elles aussi aussi ! Les mémoires DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Maintenant, voyons comment une mémoire RAM peut exécuter plusieurs accès mémoire en même temps. Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente se=oit terminée. Concrètement, pendant que la commande précédente envoie des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l’exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Pour comprendre la réponse, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Cela permet de profiter au mieux de la politique à page ouverte. L'idée est de profiter du fait qu'une page est restée ouverte pour effectuer un maximum d'accès dans cette ligne avant de la fermer.
Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
ga96ivssw6ikaikkdagdyn9480s8bdu
764554
764553
2026-04-22T22:28:15Z
Mewtow
31375
/* Le ré-ordonnancement des commandes mémoires */
764554
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires SDRAM ne sont pas en reste, elles aussi aussi ! Les mémoires DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Maintenant, voyons comment une mémoire RAM peut exécuter plusieurs accès mémoire en même temps. Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente se=oit terminée. Concrètement, pendant que la commande précédente envoie des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l’exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Pour comprendre la réponse, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
rqo32r8f37iprsagl7nplyc92zwqphv
764555
764554
2026-04-22T22:30:18Z
Mewtow
31375
/* Le ré-ordonnancement des commandes mémoires */
764555
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires SDRAM ne sont pas en reste, elles aussi aussi ! Les mémoires DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Maintenant, voyons comment une mémoire RAM peut exécuter plusieurs accès mémoire en même temps. Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente se=oit terminée. Concrètement, pendant que la commande précédente envoie des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
8uv2403mbsl90cg25z9nkfyofjbrjhx
764556
764555
2026-04-22T22:50:22Z
Mewtow
31375
/* Les contrôleurs mémoires SDRAM/DDR non-bloquants */
764556
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciensn, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. reste à combiner ces banques pour former un pseudo-pipeline.
===L'entrelacement classique===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques différentes.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. Pas besoin d'attendre que la mémoiore ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés, ce qui implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===Les mémoires à entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures.
Pour rendre cela plus concret, nous allons dire que de tels accès étaient étaient autrefois fréquents sur les anciens processeurs vectoriels. Ils disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, et ces données pouvaient être séparées de N adresses en mémoire. L'instruction envoyait plusieurs accès mémoire consécutifs, séparés de N adresses, et le contrôleur mémoire devait les exécuter en série.
Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. Avec l'entrelacement simple, les performances sont un peu dégradées, mais cela ne fonctionne pas trop mal. Le cas extrêm est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Apr_s avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Maintenant, voyons comment une mémoire RAM peut exécuter plusieurs accès mémoire en même temps. Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente se=oit terminée. Concrètement, pendant que la commande précédente envoie des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
1y9ni2igfbvf32zhhbs9ad57plu1vtd
764557
764556
2026-04-22T22:51:28Z
Mewtow
31375
/* Les mémoires à entrelacement par décalage */
764557
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciensn, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. reste à combiner ces banques pour former un pseudo-pipeline.
===L'entrelacement classique===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques différentes.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. Pas besoin d'attendre que la mémoiore ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés, ce qui implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===Les mémoires à entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Nous verrons dans quels chapitres que de tels accès étaient étaient autrefois fréquents sur les anciens processeurs vectoriels, qui disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, avec un accès en ''stride''.
Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. Avec l'entrelacement simple, les performances sont un peu dégradées, mais cela ne fonctionne pas trop mal. Le cas extrêm est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa. Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Apr_s avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Maintenant, voyons comment une mémoire RAM peut exécuter plusieurs accès mémoire en même temps. Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente se=oit terminée. Concrètement, pendant que la commande précédente envoie des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
d8xnxc93461y4cqq4yo0i81s8peoa3j
764558
764557
2026-04-22T22:51:47Z
Mewtow
31375
/* L'entrelacement pseudo-aléatoire */
764558
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciensn, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. reste à combiner ces banques pour former un pseudo-pipeline.
===L'entrelacement classique===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques différentes.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. Pas besoin d'attendre que la mémoiore ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés, ce qui implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===Les mémoires à entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Nous verrons dans quels chapitres que de tels accès étaient étaient autrefois fréquents sur les anciens processeurs vectoriels, qui disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, avec un accès en ''stride''.
Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. Avec l'entrelacement simple, les performances sont un peu dégradées, mais cela ne fonctionne pas trop mal. Le cas extrêm est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa.
Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Apr_s avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Maintenant, voyons comment une mémoire RAM peut exécuter plusieurs accès mémoire en même temps. Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente se=oit terminée. Concrètement, pendant que la commande précédente envoie des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
rr3zydlo0ojfm5ngdey6ajdvj8ufj2l
764563
764558
2026-04-22T23:03:31Z
Mewtow
31375
/* Le ré-ordonnancement des commandes mémoires */
764563
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciensn, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. reste à combiner ces banques pour former un pseudo-pipeline.
===L'entrelacement classique===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques différentes.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. Pas besoin d'attendre que la mémoiore ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés, ce qui implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===Les mémoires à entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Nous verrons dans quels chapitres que de tels accès étaient étaient autrefois fréquents sur les anciens processeurs vectoriels, qui disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, avec un accès en ''stride''.
Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. Avec l'entrelacement simple, les performances sont un peu dégradées, mais cela ne fonctionne pas trop mal. Le cas extrêm est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa.
Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Apr_s avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Maintenant, voyons comment une mémoire RAM peut exécuter plusieurs accès mémoire en même temps. Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente se=oit terminée. Concrètement, pendant que la commande précédente envoie des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
===L'entrelacement sur les mémoires SDRAM===
L''''entrelacement''' fonctionne sur les mémoires SDRAM, mais il doit être fortement modifié. Concrètement, tout ce qui a étré dit plus est inapplicable pour les SDRAM, du fait de la présence du tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Cependant, il peut y avoir un entrelacement lié à la présence des banques SDRAM.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
dp1si9lbzzn0qb62hc14vvia0r3ykoa
764566
764563
2026-04-22T23:12:18Z
Mewtow
31375
/* Les mémoires à entrelacement par décalage */
764566
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciensn, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. reste à combiner ces banques pour former un pseudo-pipeline.
===L'entrelacement classique===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques différentes.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. Pas besoin d'attendre que la mémoiore ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipemining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés, ce qui implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===L'entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Nous verrons dans quels chapitres que de tels accès étaient étaient autrefois fréquents sur les anciens processeurs vectoriels, qui disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, avec un accès en ''stride''.
Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. Avec l'entrelacement simple, les performances sont un peu dégradées, mais cela ne fonctionne pas trop mal. Le cas extrêm est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa.
Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Apr_s avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Maintenant, voyons comment une mémoire RAM peut exécuter plusieurs accès mémoire en même temps. Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente se=oit terminée. Concrètement, pendant que la commande précédente envoie des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
===L'entrelacement sur les mémoires SDRAM===
L''''entrelacement''' fonctionne sur les mémoires SDRAM, mais il doit être fortement modifié. Concrètement, tout ce qui a étré dit plus est inapplicable pour les SDRAM, du fait de la présence du tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Cependant, il peut y avoir un entrelacement lié à la présence des banques SDRAM.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
dex2o19visw6ebgs6rokccj2252y6nw
764567
764566
2026-04-22T23:21:36Z
Mewtow
31375
/* L'entrelacement classique */
764567
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciensn, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. reste à combiner ces banques pour former un pseudo-pipeline.
===L'entrelacement classique===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques différentes.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. Pas besoin d'attendre que la mémoiore ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipelining mémoire]]
L'animation suivante illustre bien le processus, avec quatres banques.
[[File:Interleaving.gif|centre|vignette|upright=2.5|Pipelining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés, ce qui implique que la fréquence de la mémoire augmente avec l'entrelacement. Au lieu d'avoir un cycle d'horloge assez long, capable de couvrir un accès mémoire entier, le cycle d'horloge est plus court. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Le nombre de cycles d'un accès mémoire augmente, non pas car l'accès mémoire est plus lent, mais car la fréquence est plus élevée. D'un seul cycle par accès mémoire, on passe à autant de cycles qu'il y a de banques.
Les mémoires à entrelacement ont un débit supérieur aux mémoires qui ne l'utilisent pas, essentiellement car la fréquence a augmentée. Rappelons que le débit binaire d'une mémoire est le produit de sa fréquence par la largeur du bus. L'entrelacement est une technique qui augmente le débit en augmentant la fréquence du bus mémoire, sans pour autant changer les temps d'accès de chaque banque. Tout se passe comment si la fréquence de chaque banque restait la même, mais que l'entrelacement trichait en augmentant la fréquence du bus mémoire et en compensant la différence par des accès parallèles à des banques distinctes.
===L'entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Nous verrons dans quels chapitres que de tels accès étaient étaient autrefois fréquents sur les anciens processeurs vectoriels, qui disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, avec un accès en ''stride''.
Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. Avec l'entrelacement simple, les performances sont un peu dégradées, mais cela ne fonctionne pas trop mal. Le cas extrêm est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa.
Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Apr_s avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Maintenant, voyons comment une mémoire RAM peut exécuter plusieurs accès mémoire en même temps. Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente se=oit terminée. Concrètement, pendant que la commande précédente envoie des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
===L'entrelacement sur les mémoires SDRAM===
L''''entrelacement''' fonctionne sur les mémoires SDRAM, mais il doit être fortement modifié. Concrètement, tout ce qui a étré dit plus est inapplicable pour les SDRAM, du fait de la présence du tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Cependant, il peut y avoir un entrelacement lié à la présence des banques SDRAM.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
cq8yzj8w4bgy00g1tblpihuq9k4qaum
764568
764567
2026-04-22T23:23:18Z
Mewtow
31375
/* L'entrelacement classique */
764568
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciensn, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. reste à combiner ces banques pour former un pseudo-pipeline.
===L'entrelacement classique===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques différentes.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. Pas besoin d'attendre que la mémoiore ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipelining mémoire]]
L'animation suivante illustre bien le processus, avec quatres banques.
[[File:Interleaving.gif|centre|vignette|upright=2.5|Pipelining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Les mémoires à entrelacement ont donc un débit supérieur aux mémoires qui ne l'utilisent pas.
===L'entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Nous verrons dans quels chapitres que de tels accès étaient étaient autrefois fréquents sur les anciens processeurs vectoriels, qui disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, avec un accès en ''stride''.
Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. Avec l'entrelacement simple, les performances sont un peu dégradées, mais cela ne fonctionne pas trop mal. Le cas extrêm est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa.
Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Apr_s avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Maintenant, voyons comment une mémoire RAM peut exécuter plusieurs accès mémoire en même temps. Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente se=oit terminée. Concrètement, pendant que la commande précédente envoie des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
===L'entrelacement sur les mémoires SDRAM===
L''''entrelacement''' fonctionne sur les mémoires SDRAM, mais il doit être fortement modifié. Concrètement, tout ce qui a étré dit plus est inapplicable pour les SDRAM, du fait de la présence du tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Cependant, il peut y avoir un entrelacement lié à la présence des banques SDRAM.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
jivbp3tzqv6n6pmz84n9mssl73h83el
764590
764568
2026-04-23T00:17:49Z
Mewtow
31375
/* Le pipeline des mémoires SDRAM */
764590
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciensn, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. reste à combiner ces banques pour former un pseudo-pipeline.
===L'entrelacement classique===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques différentes.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. Pas besoin d'attendre que la mémoiore ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipelining mémoire]]
L'animation suivante illustre bien le processus, avec quatres banques.
[[File:Interleaving.gif|centre|vignette|upright=2.5|Pipelining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Les mémoires à entrelacement ont donc un débit supérieur aux mémoires qui ne l'utilisent pas.
===L'entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Nous verrons dans quels chapitres que de tels accès étaient étaient autrefois fréquents sur les anciens processeurs vectoriels, qui disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, avec un accès en ''stride''.
Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. Avec l'entrelacement simple, les performances sont un peu dégradées, mais cela ne fonctionne pas trop mal. Le cas extrêm est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa.
Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Apr_s avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Maintenant, voyons comment une mémoire RAM peut exécuter plusieurs accès mémoire en même temps. Les SDRAM ont une forme de pseudo-pipeline très limité. Elles 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 des données sur le bus de données, on peut envoyer la commande suivante. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au huitième cycle, alors qu'une rafale est en cours.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! 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
| || || || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || || ||
|-
! Banque Numéro 2
| || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || || || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || ||
|-
! Banque Numéro 3
| || || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire ||
|}
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
===L'entrelacement sur les mémoires SDRAM===
L''''entrelacement''' fonctionne sur les mémoires SDRAM, mais il doit être fortement modifié. Concrètement, tout ce qui a étré dit plus est inapplicable pour les SDRAM, du fait de la présence du tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Cependant, il peut y avoir un entrelacement lié à la présence des banques SDRAM.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
dij6e11wqjmp906xzk4593panndrxsq
764591
764590
2026-04-23T00:18:19Z
Mewtow
31375
/* Le pipeline des mémoires SDRAM */
764591
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciensn, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. reste à combiner ces banques pour former un pseudo-pipeline.
===L'entrelacement classique===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques différentes.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafale se termine. Pas besoin d'attendre que la mémoiore ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipelining mémoire]]
L'animation suivante illustre bien le processus, avec quatres banques.
[[File:Interleaving.gif|centre|vignette|upright=2.5|Pipelining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Les mémoires à entrelacement ont donc un débit supérieur aux mémoires qui ne l'utilisent pas.
===L'entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Nous verrons dans quels chapitres que de tels accès étaient étaient autrefois fréquents sur les anciens processeurs vectoriels, qui disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, avec un accès en ''stride''.
Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. Avec l'entrelacement simple, les performances sont un peu dégradées, mais cela ne fonctionne pas trop mal. Le cas extrêm est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa.
Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Apr_s avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente soit terminée. Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! 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
| || || || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || || ||
|-
! Banque Numéro 2
| || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || || || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || ||
|-
! Banque Numéro 3
| || || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire ||
|}
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
===L'entrelacement sur les mémoires SDRAM===
L''''entrelacement''' fonctionne sur les mémoires SDRAM, mais il doit être fortement modifié. Concrètement, tout ce qui a étré dit plus est inapplicable pour les SDRAM, du fait de la présence du tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Cependant, il peut y avoir un entrelacement lié à la présence des banques SDRAM.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
4knqibgy8qfurwpedmvjq4ji2pi8rry
764594
764591
2026-04-23T01:02:15Z
Mewtow
31375
/* L'entrelacement mémoire */
764594
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciens, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. Reste à combiner ces banques pour former un pseudo-pipeline.
===L'entrelacement classique===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques différentes.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafales se termine. Pas besoin d'attendre que la mémoire ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipelining mémoire]]
L'animation suivante illustre bien le processus, avec quatres banques.
[[File:Interleaving.gif|centre|vignette|upright=2.5|Pipelining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Les mémoires à entrelacement ont donc un débit supérieur aux mémoires qui ne l'utilisent pas.
===L'entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Nous verrons dans quels chapitres que de tels accès étaient autrefois fréquents sur les anciens processeurs vectoriels, qui disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, avec un accès en ''stride''.
Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. Avec l'entrelacement simple, les performances sont un peu dégradées, mais cela ne fonctionne pas trop mal. Le cas extrêm est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
Pour obtenir cette organisation, on va découper notre mémoire en blocs de N adresses. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, nous allons décaler d'une adresse, et continuer à remplir le bloc comme avant. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa.
Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Apr_s avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente soit terminée. Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! 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
| || || || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || || ||
|-
! Banque Numéro 2
| || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || || || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || ||
|-
! Banque Numéro 3
| || || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire ||
|}
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
===L'entrelacement sur les mémoires SDRAM===
L''''entrelacement''' fonctionne sur les mémoires SDRAM, mais il doit être fortement modifié. Concrètement, tout ce qui a étré dit plus est inapplicable pour les SDRAM, du fait de la présence du tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Cependant, il peut y avoir un entrelacement lié à la présence des banques SDRAM.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
pd2mqosdjayw2nwkmj41oxfduv3wwf7
764595
764594
2026-04-23T01:07:16Z
Mewtow
31375
/* L'entrelacement par décalage */
764595
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciens, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. Reste à combiner ces banques pour former un pseudo-pipeline.
===L'entrelacement classique===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques différentes.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafales se termine. Pas besoin d'attendre que la mémoire ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipelining mémoire]]
L'animation suivante illustre bien le processus, avec quatres banques.
[[File:Interleaving.gif|centre|vignette|upright=2.5|Pipelining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Les mémoires à entrelacement ont donc un débit supérieur aux mémoires qui ne l'utilisent pas.
===L'entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Nous verrons dans quels chapitres que de tels accès étaient autrefois fréquents sur les anciens processeurs vectoriels, qui disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, avec un accès en ''stride''.
Avec l'entrelacement simple, les accès en ''stride'' ont performances dégradées, mais cela ne fonctionne pas trop mal. Le pire cas est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
: Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
L'organisation idéale est la suivante. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, on décale tout d'une adresse, à savoir qu'on commence à remplir les banques à partir de la seconde, non de la première. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Le troisième bloc d'adresse subit le même traitement, sauf qu'on commence à remplir à partir de la seconde banque. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière pseudo-aléatoire. La première solution consiste à permuter des bits entre ces champs : des bits qui étaient dans le champ de sélection de ligne vont être placés dans le champ pour la colonne, et vice-versa.
Pour ce faire, on peut utiliser des permutations : il suffit d'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. D'autres inversent les bits dans les champs : le dernier bit devient le premier, l'avant-dernier devient le second, etc. Autre solution : couper l'adresse en morceaux, faire un XOR bit à bit entre certains morceaux, et les remplacer par le résultat du XOR bit à bit. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Apr_s avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente soit terminée. Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! 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
| || || || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || || ||
|-
! Banque Numéro 2
| || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || || || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || ||
|-
! Banque Numéro 3
| || || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire ||
|}
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
===L'entrelacement sur les mémoires SDRAM===
L''''entrelacement''' fonctionne sur les mémoires SDRAM, mais il doit être fortement modifié. Concrètement, tout ce qui a étré dit plus est inapplicable pour les SDRAM, du fait de la présence du tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Cependant, il peut y avoir un entrelacement lié à la présence des banques SDRAM.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
m1m1p4q0ougm3lmjs37pqs1vqlr59my
764596
764595
2026-04-23T01:12:58Z
Mewtow
31375
/* L'entrelacement pseudo-aléatoire */
764596
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciens, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. Reste à combiner ces banques pour former un pseudo-pipeline.
===L'entrelacement classique===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques différentes.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafales se termine. Pas besoin d'attendre que la mémoire ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipelining mémoire]]
L'animation suivante illustre bien le processus, avec quatres banques.
[[File:Interleaving.gif|centre|vignette|upright=2.5|Pipelining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Les mémoires à entrelacement ont donc un débit supérieur aux mémoires qui ne l'utilisent pas.
===L'entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Nous verrons dans quels chapitres que de tels accès étaient autrefois fréquents sur les anciens processeurs vectoriels, qui disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, avec un accès en ''stride''.
Avec l'entrelacement simple, les accès en ''stride'' ont performances dégradées, mais cela ne fonctionne pas trop mal. Le pire cas est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
: Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
L'organisation idéale est la suivante. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, on décale tout d'une adresse, à savoir qu'on commence à remplir les banques à partir de la seconde, non de la première. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Le troisième bloc d'adresse subit le même traitement, sauf qu'on commence à remplir à partir de la seconde banque. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière "pseudo-aléatoire". L'idée exacte est de faire passer l'adresse dans une fonction de hachage, plus ou moins complexe. Pour rappel, une fonction de hachage prend une entrée de grande taille et fournit en sortie un résultat de petite taille. Idéalement, elles doivent donner des résultats aussi différents que possible pour des entrées similaires, histoire de simuler une sorte de pseudo-aléatoire. Ici, une adresse est transformée en un numéro de banque.
Une fonction de hachage simple ne fait que permuter des bits de l'adresse pour obtenir son résultat. Elle ne fait qu'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. Des fonctions de hachage plus complexes font des XOR bit à bit entre certains bits de l'adresse. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Apr_s avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente soit terminée. Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! 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
| || || || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || || ||
|-
! Banque Numéro 2
| || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || || || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || ||
|-
! Banque Numéro 3
| || || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire ||
|}
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
===L'entrelacement sur les mémoires SDRAM===
L''''entrelacement''' fonctionne sur les mémoires SDRAM, mais il doit être fortement modifié. Concrètement, tout ce qui a étré dit plus est inapplicable pour les SDRAM, du fait de la présence du tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Cependant, il peut y avoir un entrelacement lié à la présence des banques SDRAM.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
tby4gbpvlompaaic332zcy9w34bpjr2
764597
764596
2026-04-23T01:14:36Z
Mewtow
31375
/* L'entrelacement pseudo-aléatoire */
764597
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciens, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. Reste à combiner ces banques pour former un pseudo-pipeline.
===L'entrelacement classique===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques différentes.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafales se termine. Pas besoin d'attendre que la mémoire ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipelining mémoire]]
L'animation suivante illustre bien le processus, avec quatres banques.
[[File:Interleaving.gif|centre|vignette|upright=2.5|Pipelining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Les mémoires à entrelacement ont donc un débit supérieur aux mémoires qui ne l'utilisent pas.
===L'entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Nous verrons dans quels chapitres que de tels accès étaient autrefois fréquents sur les anciens processeurs vectoriels, qui disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, avec un accès en ''stride''.
Avec l'entrelacement simple, les accès en ''stride'' ont performances dégradées, mais cela ne fonctionne pas trop mal. Le pire cas est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
: Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
L'organisation idéale est la suivante. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, on décale tout d'une adresse, à savoir qu'on commence à remplir les banques à partir de la seconde, non de la première. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Le troisième bloc d'adresse subit le même traitement, sauf qu'on commence à remplir à partir de la seconde banque. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière "pseudo-aléatoire". L'idée exacte est de faire passer l'adresse dans une '''fonction de hachage''', plus ou moins complexe. Pour rappel, une fonction de hachage prend une entrée de grande taille et fournit en sortie un résultat de petite taille. Idéalement, elles doivent donner des résultats aussi différents que possible pour des entrées similaires, histoire de simuler une sorte de pseudo-aléatoire. Ici, une adresse est transformée en un numéro de banque.
Une fonction de hachage simple ne fait que permuter des bits de l'adresse pour obtenir son résultat. Elle ne fait qu'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. Des fonctions de hachage plus complexes font des XOR bit à bit entre certains bits de l'adresse. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les contrôleurs mémoires SDRAM/DDR non-bloquants==
Apr_s avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente soit terminée. Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! 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
| || || || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || || ||
|-
! Banque Numéro 2
| || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || || || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || ||
|-
! Banque Numéro 3
| || || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire ||
|}
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
===L'entrelacement sur les mémoires SDRAM===
L''''entrelacement''' fonctionne sur les mémoires SDRAM, mais il doit être fortement modifié. Concrètement, tout ce qui a étré dit plus est inapplicable pour les SDRAM, du fait de la présence du tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Cependant, il peut y avoir un entrelacement lié à la présence des banques SDRAM.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
ri2wyun6e5dj0qtjrbphysmq2odxwpd
764598
764597
2026-04-23T01:23:18Z
Mewtow
31375
/* Les contrôleurs mémoires SDRAM/DDR non-bloquants */
764598
wikitext
text/x-wiki
Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre.
Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Même les processeurs à émission dans l'ordre peuvent lancer des accès mémoire à chaque cycle. Par exemple, un processeur avec des lectures non-bloquantes peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. Les processeurs sans lectures non-bloquantes sont eux beaucoup plus limités. A la rigueur, l'usage du préchargement peut profiter du parallélisme mémoire : pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand chose.
==Le ''line fill buffer'' et les techniques associées==
Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache.
Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache.
La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache.
Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache.
===L'''early restart'' et le ''critical word load''===
La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante.
Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin.
Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible.
Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire.
==Les caches pipelinés==
Il est possible de pipeliner l'accès mémoire sur plusieurs cycles, avec plusieurs étages MEM consécutifs. La méthode la plus simple pipeline l'accès au cache, l'autre pipeline l'accès à la mémoire en utilisant des mémoires entrelacées. Pipeliner la mémoire est une méthode assez ancienne, utilisée sur les anciens ordinateurs historiques, qui ne disposaient pas de cache, mais avaient bien un pipeline (et parfois, de l'exécution dans le désordre et du renommage de registres). Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique.
Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres.
Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline.
===Le ''pipelining'' des caches ''direct-mapped''===
Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près.
[[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]]
Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire.
[[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]]
Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs.
: Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache.
===Le ''pipelining'' des caches splittés/sériels===
Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner.
Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ?
==Les caches non bloquants==
Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps.
===Les ''Miss Handling Status Registers''===
Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA.
Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache.
L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''.
Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes :
* Le numéro de la ligne de cache dans laquelle les données sont chargées.
* Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu.
* Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture.
** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''.
** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire.
Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés).
===Les accès simultanés à une même ligne de cache===
Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''.
Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter.
La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation.
Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire.
Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui.
====Les MSHR simples====
Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent.
Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde.
L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser
====Les MSHR adressés implicitement====
Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient.
Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum :
* Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire.
* Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture.
* Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire.
La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps.
====Les MSHR adressés explicitement====
Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''.
L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand.
L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO).
'''Les MSHRs inversés'''
Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés.
Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente.
====Les MSHR intégrés au cache====
Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache.
Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache.
==L'entrelacement mémoire==
Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciens, dont des superordinateurs, ont utilisé cette technique.
La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. Reste à combiner ces banques pour former un pseudo-pipeline.
===L'entrelacement classique===
Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques différentes.
[[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]]
L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafales se termine. Pas besoin d'attendre que la mémoire ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante.
[[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipelining mémoire]]
L'animation suivante illustre bien le processus, avec quatres banques.
[[File:Interleaving.gif|centre|vignette|upright=2.5|Pipelining mémoire]]
L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire.
[[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]]
Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Les mémoires à entrelacement ont donc un débit supérieur aux mémoires qui ne l'utilisent pas.
===L'entrelacement par décalage===
L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en ''stride'', où l'on accède en série à des adresses sont séparées par N mots mémoires. De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Nous verrons dans quels chapitres que de tels accès étaient autrefois fréquents sur les anciens processeurs vectoriels, qui disposaient d'instructions capables de lire/écrire plusieurs données en mémoire d'un seul coup, avec un accès en ''stride''.
Avec l'entrelacement simple, les accès en ''stride'' ont performances dégradées, mais cela ne fonctionne pas trop mal. Le pire cas est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Pour résoudre ce problème, il faut répartir les mots mémoires dans la mémoire autrement.
: Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1.
L'organisation idéale est la suivante. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, on décale tout d'une adresse, à savoir qu'on commence à remplir les banques à partir de la seconde, non de la première. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Le troisième bloc d'adresse subit le même traitement, sauf qu'on commence à remplir à partir de la seconde banque. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début.
[[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]]
En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes :
* adresse à envoyer à la banque = adresse totale / N ;
* numéro de la banque = (adresse + décalage) modulo N, avec décalage = (adresse totale * P) mod N.
Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Pour éviter cela, il faut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Dans ce cas, les formules se simplifient :
* adresse à envoyer à la banque = adresse totale / taille de la banque ;
* numéro de la banque = adresse modulo N.
===L'entrelacement pseudo-aléatoire===
Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière "pseudo-aléatoire". L'idée exacte est de faire passer l'adresse dans une '''fonction de hachage''', plus ou moins complexe. Pour rappel, une fonction de hachage prend une entrée de grande taille et fournit en sortie un résultat de petite taille. Idéalement, elles doivent donner des résultats aussi différents que possible pour des entrées similaires, histoire de simuler une sorte de pseudo-aléatoire. Ici, une adresse est transformée en un numéro de banque.
Une fonction de hachage simple ne fait que permuter des bits de l'adresse pour obtenir son résultat. Elle ne fait qu'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. Des fonctions de hachage plus complexes font des XOR bit à bit entre certains bits de l'adresse. Il existe aussi d'autres techniques qui donnent le numéro de banque à partir d'un polynôme modulo N, appliqué sur l'adresse.
==Les contrôleurs mémoires SDRAM/DDR optimisés==
Après avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM. Et les contrôleurs mémoire intègrent des optimisations spécifiques afin d'en profiter au maximum.
===La mise en attente des accès mémoire===
Comme pour les mémoires caches, il existe des contrôleurs mémoire bloquants et non-bloquants. Les premiers n'acceptent qu'un seul accès mémoire à la fois, les seconds acceptent plusieurs accès mémoire simultanés. Pour simplifier, nous allons dire que le contrôleur mémoire n’exécute qu'un seul accès mémoire à la fois, et qu'ils met en attente les accès en trop. C'est une simplification assez irréaliste, vu que les mémoires modernes disposent de plusieurs banques accessibles en parallèle. Mais nous introduirons ce détail un peu plus tard.
Avec un contrôleur mémoire de ce type, les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée. Les accès mémoire quittent alors la mémoire dans leur ordre d'arrivée, les lectures sont renvoyées dans l'ordre demandé. En plus d'une mémoire FIFO pour les commandes mémoire, on trouve une mémoire FIFO pour les données à écrire. Elle permet d'accumuler plusieurs écritures, tout en permettant que la donnée adéquate soit envoyée à la RAM au bon moment. Il y a aussi une FIFO pour les données lues, qui sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue.
[[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]]
Une optimisation regroupe plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures.
===Le pipeline des mémoires SDRAM===
Les SDRAM ont une forme de pseudo-pipeline très limité. Elles sont parfois capables de démarrer une commande avant que la précédente soit terminée. Même si elle parait très limitée, cette possibilité est exploitée au mieux par la présence de plusieurs banques dans la mémoire SDRAM. Les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.
Et cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. Ou encore, on peut lancer un nouvel accès mémoire dans une banque si elle est inoccupée. La possibilité améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! 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
| || || || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || || ||
|-
! Banque Numéro 2
| || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || || || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || ||
|-
! Banque Numéro 3
| || || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire ||
|}
L'implémentation n'a rien de vraiment compliqué. Il suffit d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs.
[[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]]
===Le ré-ordonnancement des commandes mémoires===
Un contrôleur mémoire moderne est capable de changer l'ordre des requêtes mémoires, pour gagner en performances. En clair : il peut faire l'équivalent mémoire de l'exécution dans le désordre des processeurs haute performance. Une différence majeure est que le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''.
Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre.
Maintenant que ces précisions sont faites, posons cette question : quel est l'intérêt de faire les accès mémoire dans le désordre ?
Accéder à des banques en parallèle est une réponse possible, mais le ré-ordonnancement est surtout utile si tous les accès mémoire atterrissent dans la même banque. Pour comprendre pourquoi, faisons un rappel rapide sur le tampon de ligne. Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture.
[[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]]
Les deux étapes correspondent à deux commandes séparées : une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
L'exécution dans le désordre des lectures/écritures SDRAM vise à faire en sorte que des accès consécutifs se fassent dans une même ligne. Elle marche si plusieurs accès à une même ligne ne sont pas consécutifs, et qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire deviennent consécutifs, ils sont exécutés l'un à la suite de l'autre. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants :
* Une lecture ligne A ;
* Une écriture ligne B ;
* Une lecture ligne A.
Sans réordonnancent, on doit émettre deux commandes PRECHARGE : une quand on passe de la ligne A à la ligne B, et une autre pour le passage inverse. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant :
* Lecture ligne A ;
* Lecture ligne A ;
* Une écriture ligne B.
On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Mais il existe des possibilités de réorganisation autres qui ne sont pas valides. Il faut par exemple prendre garde à éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, il faut faire attention aux dépendances mémoires. Le controleur mémoire teste les dépendances mémoires avant d'envoyer des commandes à la mémoire DDR/SDRAM.
===L'entrelacement sur les mémoires SDRAM===
L''''entrelacement''' fonctionne sur les mémoires SDRAM, mais il doit être fortement modifié. Concrètement, tout ce qui a étré dit plus est inapplicable pour les SDRAM, du fait de la présence du tampon de ligne. Des adresses consécutives atterrissent déjà dans la même ligne, ce qui fait qu'on n'a pas besoin d'entrelacement au niveau d'une ligne. Et ne parlons pas de ce la présence de rangées et de canaux mémoire ! Cependant, il peut y avoir un entrelacement lié à la présence des banques SDRAM.
Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Une solution simple désactive l'entrelacement. Les adresses mémoire sont alors découpées comme suit :
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de banque || Adresse de ligne || Adresse de colonne
|}
Si cette solution fonctionne bien si les accès mémoire sont assez aléatoires, en pratique, mieux vaut utiliser l'entrelacement.
Une première méthode d'entrelacement est l''''entrelacement de ligne'''. Elle répartit deux lignes consécutives dans deux banques différentes. Avec N banques, la première ligne ira dans la première banque, la seconde ligne dans la seconde, et ainsi de suite jusqu'à la énième banque qui va dans la banque numéro N. Et la ligne N+1 repart dans la première banque. L'avantage est que passer d'une ligne à la suivante est assez rapide. Au lieu de devoir fermer la première ligne et ouvrir la suivante on ouvrira directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour cela, l'adresse est découpée comme suit.
{|class="wikitable"
|+ Adresse mémoire
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet)
|}
D'autres méthodes d'entrelacement sont possibles, mais elles sont plus complexes. Chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant.
L'usage du ''dual channel'' complique encore l'entrelacement. Là encore, il y a deux grandes solutions : avec et sans entrelacement des canaux mémoire. Rappelons le principe : deux barrettes de RAM sont accédées en parallèle. Et pour cela, il faut utiliser l'entrelacement. Typiquement, chaque barrette mémoire fournit 64 bits, ce qui fait que l'on peut accéder à 128 bits d'un seul coup, par exemple avec un accès en rafale.
Une solution pour cela est de ne pas utiliser l'entrelacement. Avec deux barrettes, la première barrette regroupera la moitié haute de la RAM, la seconde barrette utilisera la moitié basse. Les possibilité d’accéder à deux données séparées de 64 bits en même temps est cependant très rare. Aussi, on préfère utiliser l'entrelacement. Pour cela, deux blocs de 64 bits sont placés dans des canaux mémoire séparés. Idem avec du triple ou quadruple canal, mais c'est alors trois ou quatre blocs de 64 bits qui sont dispersés dans des canaux consécutifs.
{|class="wikitable"
|+ Adresse mémoire
|-
! colspan="6" | Sans entrelacement
|-
| Numéro de canal/barrette || Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Position de l'octet dans un bloc de 64 bits
|-
| colspan="6" |
|-
! colspan="6" | Avec entrelacement
|-
| Numéro de rangée || Adresse de ligne || Adresse de banque || Adresse de colonne || Numéro de canal/barrette || Position de l'octet dans un bloc de 64 bits
|}
Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire.
L'entrelacement est géré juste avant le séquenceur mémoire. Le '''circuit d'entrelacement''' intervertit certains bits de l'adresse lors des accès mémoires. On trouve aussi des mémoires FIFOs pour mettre en attente les requêtes mémoire provenant du processeur. Elles permettent de recevoir plusieurs accès mémoire consécutifs. Si vous vous demandez comment plusieurs accès mémoire consécutifs peuvent avoir lieu, sachez que c'est une bonne question. Pour le moment, nous allons dire que ces accès proviennent du processeur ou de la mémoire cache, sans expliquer comment. Le contrôleur mémoire reçoit une série d'accès mémoire assez rapprochés, qu'il doit exécuter au mieux.
[[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]]
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=La désambiguïsation mémoire
| prevText=La désambiguïsation mémoire
| next=Les processeurs superscalaires
| nextText=Les processeurs superscalaires
}}
</noinclude>
bbmvcmvwgwj4xemhfumxmsct6mhfg17
Fonctionnement d'un ordinateur/Les mémoires RAM dynamiques (DRAM)
0
71327
764410
764409
2026-04-22T12:02:54Z
Mewtow
31375
/* Le contrôleur de DRAM */
764410
wikitext
text/x-wiki
Les mémoires RAM dynamiques sont opposées aux mémoires RAM statiques. Les RAM statiques sont les plus intuitives à comprendre : elles conservent leurs données tant qu'on ne les modifient pas, ou tant que l’alimentation électrique est maintenue. Les RAM dynamiques ont pour défaut que les données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes si l'on n'y touche pas. 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'''.
Le rafraîchissement prend du temps, et a tendance à légèrement diminuer la rapidité des mémoires dynamiques. Mais en contrepartie, les mémoires dynamiques ont une meilleure capacité, car leurs bits prennent moins de place, utilisent moins de transistors. Et c'est ce qui explique que la mémoire principale de l'ordinateur, la fameuse mémoire RAM, est actuellement une mémoire dynamique sur tous les PC actuels. Dans ce chapitre, nous allons voir comment fonctionnent les mémoires RAM dynamiques, aussi appelées mémoires DRAM.
==L'interface des DRAM et le contrôleur mémoire==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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'''.
===Les mémoires FPM===
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 FPM proprement dit et les mémoires ''Fast-Page Mode''. 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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 capacité dite de ''pipelining'', en ajoutant un registre sur la sortie de donnée pour les lectures, 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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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
|}
Une mémoire SDRAM contient plusieurs banques séparées, accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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 barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
Dans les PC, les mémoires prennent la forme de '''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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
===Le format des barrettes de 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. 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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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.
|}
Enfin, les barrettes n'ont pas le même format, car 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 '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les eDRAM : des DRAM adaptées aux ''chiplets''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
q4k85yikznys5z8015eqzg9r3ppxisn
764411
764410
2026-04-22T12:05:16Z
Mewtow
31375
/* Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM */
764411
wikitext
text/x-wiki
Les mémoires RAM dynamiques sont opposées aux mémoires RAM statiques. Les RAM statiques sont les plus intuitives à comprendre : elles conservent leurs données tant qu'on ne les modifient pas, ou tant que l’alimentation électrique est maintenue. Les RAM dynamiques ont pour défaut que les données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes si l'on n'y touche pas. 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'''.
Le rafraîchissement prend du temps, et a tendance à légèrement diminuer la rapidité des mémoires dynamiques. Mais en contrepartie, les mémoires dynamiques ont une meilleure capacité, car leurs bits prennent moins de place, utilisent moins de transistors. Et c'est ce qui explique que la mémoire principale de l'ordinateur, la fameuse mémoire RAM, est actuellement une mémoire dynamique sur tous les PC actuels. Dans ce chapitre, nous allons voir comment fonctionnent les mémoires RAM dynamiques, aussi appelées mémoires DRAM.
==L'interface des DRAM et le contrôleur mémoire==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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 FPM proprement dit et les mémoires ''Fast-Page Mode''. 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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 capacité dite de ''pipelining'', en ajoutant un registre sur la sortie de donnée pour les lectures, 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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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
|}
Une mémoire SDRAM contient plusieurs banques séparées, accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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 barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
Dans les PC, les mémoires prennent la forme de '''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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
===Le format des barrettes de 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. 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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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.
|}
Enfin, les barrettes n'ont pas le même format, car 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 '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les eDRAM : des DRAM adaptées aux ''chiplets''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
lzrxyj16vtq93inp7jm9ed625l38ppy
764415
764411
2026-04-22T12:13:54Z
Mewtow
31375
/* Les mémoires EDO-RAM */
764415
wikitext
text/x-wiki
Les mémoires RAM dynamiques sont opposées aux mémoires RAM statiques. Les RAM statiques sont les plus intuitives à comprendre : elles conservent leurs données tant qu'on ne les modifient pas, ou tant que l’alimentation électrique est maintenue. Les RAM dynamiques ont pour défaut que les données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes si l'on n'y touche pas. 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'''.
Le rafraîchissement prend du temps, et a tendance à légèrement diminuer la rapidité des mémoires dynamiques. Mais en contrepartie, les mémoires dynamiques ont une meilleure capacité, car leurs bits prennent moins de place, utilisent moins de transistors. Et c'est ce qui explique que la mémoire principale de l'ordinateur, la fameuse mémoire RAM, est actuellement une mémoire dynamique sur tous les PC actuels. Dans ce chapitre, nous allons voir comment fonctionnent les mémoires RAM dynamiques, aussi appelées mémoires DRAM.
==L'interface des DRAM et le contrôleur mémoire==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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 FPM proprement dit et les mémoires ''Fast-Page Mode''. 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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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
|}
Une mémoire SDRAM contient plusieurs banques séparées, accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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 barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
Dans les PC, les mémoires prennent la forme de '''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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
===Le format des barrettes de 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. 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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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.
|}
Enfin, les barrettes n'ont pas le même format, car 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 '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les eDRAM : des DRAM adaptées aux ''chiplets''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
sn8o6g8kefchjc0i3o5l8c4sf1s7ev6
764416
764415
2026-04-22T12:18:35Z
Mewtow
31375
/* Les mémoires FPM */
764416
wikitext
text/x-wiki
Les mémoires RAM dynamiques sont opposées aux mémoires RAM statiques. Les RAM statiques sont les plus intuitives à comprendre : elles conservent leurs données tant qu'on ne les modifient pas, ou tant que l’alimentation électrique est maintenue. Les RAM dynamiques ont pour défaut que les données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes si l'on n'y touche pas. 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'''.
Le rafraîchissement prend du temps, et a tendance à légèrement diminuer la rapidité des mémoires dynamiques. Mais en contrepartie, les mémoires dynamiques ont une meilleure capacité, car leurs bits prennent moins de place, utilisent moins de transistors. Et c'est ce qui explique que la mémoire principale de l'ordinateur, la fameuse mémoire RAM, est actuellement une mémoire dynamique sur tous les PC actuels. Dans ce chapitre, nous allons voir comment fonctionnent les mémoires RAM dynamiques, aussi appelées mémoires DRAM.
==L'interface des DRAM et le contrôleur mémoire==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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
|}
Une mémoire SDRAM contient plusieurs banques séparées, accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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 barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
Dans les PC, les mémoires prennent la forme de '''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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
===Le format des barrettes de 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. 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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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.
|}
Enfin, les barrettes n'ont pas le même format, car 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 '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les eDRAM : des DRAM adaptées aux ''chiplets''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
t31utuociy8iqf6dkvm6i0kincdtpqa
764417
764416
2026-04-22T12:28:23Z
Mewtow
31375
/* Les mémoires SDRAM */
764417
wikitext
text/x-wiki
Les mémoires RAM dynamiques sont opposées aux mémoires RAM statiques. Les RAM statiques sont les plus intuitives à comprendre : elles conservent leurs données tant qu'on ne les modifient pas, ou tant que l’alimentation électrique est maintenue. Les RAM dynamiques ont pour défaut que les données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes si l'on n'y touche pas. 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'''.
Le rafraîchissement prend du temps, et a tendance à légèrement diminuer la rapidité des mémoires dynamiques. Mais en contrepartie, les mémoires dynamiques ont une meilleure capacité, car leurs bits prennent moins de place, utilisent moins de transistors. Et c'est ce qui explique que la mémoire principale de l'ordinateur, la fameuse mémoire RAM, est actuellement une mémoire dynamique sur tous les PC actuels. Dans ce chapitre, nous allons voir comment fonctionnent les mémoires RAM dynamiques, aussi appelées mémoires DRAM.
==L'interface des DRAM et le contrôleur mémoire==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une mémoire SDRAM contient plusieurs banques séparées, organisées en utilisant à la fois l'arrangement horizontal et vertical. Il faut ainsi distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
Un '''''rank''''' est un ensemble de chips mémoire qui partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents. Un ''rank'' a une taille de 64 bits, c'est à dire la même taille que le bus de données. Cela veut dire qu'on peut lire ou écrire 64 bits d'un seul coup dans un ''rank'', ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Il est fréquent d'avoir 8 chips mémoires de 8 bits regroupés dans un seul ''rank''.
Les banques sont elles internes à chaque chip mémoire, et sont accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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 barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
Dans les PC, les mémoires prennent la forme de '''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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
===Le format des barrettes de 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. 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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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.
|}
Enfin, les barrettes n'ont pas le même format, car 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 '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les eDRAM : des DRAM adaptées aux ''chiplets''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
hjlakqfrr53ntwujoyqo6kbsj9v8v21
764418
764417
2026-04-22T12:29:36Z
Mewtow
31375
764418
wikitext
text/x-wiki
Les mémoires RAM dynamiques sont opposées aux mémoires RAM statiques. Les RAM statiques sont les plus intuitives à comprendre : elles conservent leurs données tant qu'on ne les modifient pas, ou tant que l’alimentation électrique est maintenue. Les RAM dynamiques ont pour défaut que les données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes si l'on n'y touche pas. 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'''.
Le rafraîchissement prend du temps, et a tendance à légèrement diminuer la rapidité des mémoires dynamiques. Mais en contrepartie, les mémoires dynamiques ont une meilleure capacité, car leurs bits prennent moins de place, utilisent moins de transistors. Et c'est ce qui explique que la mémoire principale de l'ordinateur, la fameuse mémoire RAM, est actuellement une mémoire dynamique sur tous les PC actuels. Dans ce chapitre, nous allons voir comment fonctionnent les mémoires RAM dynamiques, aussi appelées mémoires DRAM.
==L'interface des DRAM et le contrôleur mémoire==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
Dans les PC, les mémoires prennent la forme de '''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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
===Le format des barrettes de 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. 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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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.
|}
Enfin, les barrettes n'ont pas le même format, car 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 '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une mémoire SDRAM contient plusieurs banques séparées, organisées en utilisant à la fois l'arrangement horizontal et vertical. Il faut ainsi distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
Un '''''rank''''' est un ensemble de chips mémoire qui partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents. Un ''rank'' a une taille de 64 bits, c'est à dire la même taille que le bus de données. Cela veut dire qu'on peut lire ou écrire 64 bits d'un seul coup dans un ''rank'', ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Il est fréquent d'avoir 8 chips mémoires de 8 bits regroupés dans un seul ''rank''.
Les banques sont elles internes à chaque chip mémoire, et sont accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
l69e8lz2c7hk4q9cg5zknj2o5iv28rc
764419
764418
2026-04-22T12:34:58Z
Mewtow
31375
/* Les ranks et les banques */
764419
wikitext
text/x-wiki
Les mémoires RAM dynamiques sont opposées aux mémoires RAM statiques. Les RAM statiques sont les plus intuitives à comprendre : elles conservent leurs données tant qu'on ne les modifient pas, ou tant que l’alimentation électrique est maintenue. Les RAM dynamiques ont pour défaut que les données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes si l'on n'y touche pas. 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'''.
Le rafraîchissement prend du temps, et a tendance à légèrement diminuer la rapidité des mémoires dynamiques. Mais en contrepartie, les mémoires dynamiques ont une meilleure capacité, car leurs bits prennent moins de place, utilisent moins de transistors. Et c'est ce qui explique que la mémoire principale de l'ordinateur, la fameuse mémoire RAM, est actuellement une mémoire dynamique sur tous les PC actuels. Dans ce chapitre, nous allons voir comment fonctionnent les mémoires RAM dynamiques, aussi appelées mémoires DRAM.
==L'interface des DRAM et le contrôleur mémoire==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
Dans les PC, les mémoires prennent la forme de '''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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
===Le format des barrettes de 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. 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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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.
|}
Enfin, les barrettes n'ont pas le même format, car 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 '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
De plus, les chips mémoires noirs ont, à l'intérieurs, plusieurs banques accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe. Il faut ainsi distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
gj4v36om3kep3akn1wksbgqvwxzv8c3
764420
764419
2026-04-22T12:39:18Z
Mewtow
31375
/* Les ranks et les banques */
764420
wikitext
text/x-wiki
Les mémoires RAM dynamiques sont opposées aux mémoires RAM statiques. Les RAM statiques sont les plus intuitives à comprendre : elles conservent leurs données tant qu'on ne les modifient pas, ou tant que l’alimentation électrique est maintenue. Les RAM dynamiques ont pour défaut que les données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes si l'on n'y touche pas. 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'''.
Le rafraîchissement prend du temps, et a tendance à légèrement diminuer la rapidité des mémoires dynamiques. Mais en contrepartie, les mémoires dynamiques ont une meilleure capacité, car leurs bits prennent moins de place, utilisent moins de transistors. Et c'est ce qui explique que la mémoire principale de l'ordinateur, la fameuse mémoire RAM, est actuellement une mémoire dynamique sur tous les PC actuels. Dans ce chapitre, nous allons voir comment fonctionnent les mémoires RAM dynamiques, aussi appelées mémoires DRAM.
==L'interface des DRAM et le contrôleur mémoire==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
Dans les PC, les mémoires prennent la forme de '''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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
===Le format des barrettes de 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. 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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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.
|}
Enfin, les barrettes n'ont pas le même format, car 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 '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une SDRAM modenre peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
De plus, les chips mémoires noirs ont, à l'intérieurs, plusieurs banques accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe. Il faut ainsi distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
owvwux8aqpnceowm2jlsif4ixc214u9
764421
764420
2026-04-22T12:39:52Z
Mewtow
31375
/* Les ranks et les banques */
764421
wikitext
text/x-wiki
Les mémoires RAM dynamiques sont opposées aux mémoires RAM statiques. Les RAM statiques sont les plus intuitives à comprendre : elles conservent leurs données tant qu'on ne les modifient pas, ou tant que l’alimentation électrique est maintenue. Les RAM dynamiques ont pour défaut que les données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes si l'on n'y touche pas. 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'''.
Le rafraîchissement prend du temps, et a tendance à légèrement diminuer la rapidité des mémoires dynamiques. Mais en contrepartie, les mémoires dynamiques ont une meilleure capacité, car leurs bits prennent moins de place, utilisent moins de transistors. Et c'est ce qui explique que la mémoire principale de l'ordinateur, la fameuse mémoire RAM, est actuellement une mémoire dynamique sur tous les PC actuels. Dans ce chapitre, nous allons voir comment fonctionnent les mémoires RAM dynamiques, aussi appelées mémoires DRAM.
==L'interface des DRAM et le contrôleur mémoire==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
Dans les PC, les mémoires prennent la forme de '''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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
===Le format des barrettes de 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. 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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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.
|}
Enfin, les barrettes n'ont pas le même format, car 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 '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une SDRAM modenre peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Les chips mémoires noirs de 8 bits sont composés de plusieurs '''banques''' accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe. Il faut ainsi distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
q6hhiohjtz74kh3d5mk9et2i9w7wr0w
764422
764421
2026-04-22T12:48:12Z
Mewtow
31375
/* Les ranks et les banques */
764422
wikitext
text/x-wiki
Les mémoires RAM dynamiques sont opposées aux mémoires RAM statiques. Les RAM statiques sont les plus intuitives à comprendre : elles conservent leurs données tant qu'on ne les modifient pas, ou tant que l’alimentation électrique est maintenue. Les RAM dynamiques ont pour défaut que les données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes si l'on n'y touche pas. 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'''.
Le rafraîchissement prend du temps, et a tendance à légèrement diminuer la rapidité des mémoires dynamiques. Mais en contrepartie, les mémoires dynamiques ont une meilleure capacité, car leurs bits prennent moins de place, utilisent moins de transistors. Et c'est ce qui explique que la mémoire principale de l'ordinateur, la fameuse mémoire RAM, est actuellement une mémoire dynamique sur tous les PC actuels. Dans ce chapitre, nous allons voir comment fonctionnent les mémoires RAM dynamiques, aussi appelées mémoires DRAM.
==L'interface des DRAM et le contrôleur mémoire==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
Dans les PC, les mémoires prennent la forme de '''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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
===Le format des barrettes de 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. 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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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.
|}
Enfin, les barrettes n'ont pas le même format, car 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 '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Les ''Chip Select'' pour activer/désactiver les ''ranks'' sont générés par le contrôleur mémoire, ou dans la barrette de mémoire. Pour cela, quelques bits de l'adresse indiquent quel ''rank'' activer. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Les chips mémoires noirs de 8 bits sont composés de plusieurs '''banques''' accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe. Il faut ainsi distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
og3g8pl3tbbpb95m9t56vr1c133upfx
764423
764422
2026-04-22T13:00:32Z
Mewtow
31375
764423
wikitext
text/x-wiki
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.
==L'interface des DRAM et le contrôleur mémoire==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
Dans les PC, les mémoires prennent la forme de '''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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
===Le format des barrettes de 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. 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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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.
|}
Enfin, les barrettes n'ont pas le même format, car 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 '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Les ''Chip Select'' pour activer/désactiver les ''ranks'' sont générés par le contrôleur mémoire, ou dans la barrette de mémoire. Pour cela, quelques bits de l'adresse indiquent quel ''rank'' activer. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Les chips mémoires noirs de 8 bits sont composés de plusieurs '''banques''' accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe. Il faut ainsi distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
agi9njma78ba5vjcpx9hiqbbs9tdb3r
764424
764423
2026-04-22T13:01:38Z
Mewtow
31375
764424
wikitext
text/x-wiki
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.
Dans ce chapitre, nous allons commencer par quelques généralités, avant de voir chaque type de mémoire, un par un. Nous allons parler de l'interface des boitiers de DRAM, avant de voir comment ils sont regroupés sur une barrette de RAM.
==L'interface des DRAM et le contrôleur mémoire==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
Dans les PC, les mémoires prennent la forme de '''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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
===Le format des barrettes de 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. 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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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.
|}
Enfin, les barrettes n'ont pas le même format, car 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 '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Les ''Chip Select'' pour activer/désactiver les ''ranks'' sont générés par le contrôleur mémoire, ou dans la barrette de mémoire. Pour cela, quelques bits de l'adresse indiquent quel ''rank'' activer. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Les chips mémoires noirs de 8 bits sont composés de plusieurs '''banques''' accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe. Il faut ainsi distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
fpy4x3u4dns391uqnuzorw47hwr7s6l
764425
764424
2026-04-22T13:05:54Z
Mewtow
31375
764425
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
===Le format des barrettes de 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. 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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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.
|}
Enfin, les barrettes n'ont pas le même format, car 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 '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Les ''Chip Select'' pour activer/désactiver les ''ranks'' sont générés par le contrôleur mémoire, ou dans la barrette de mémoire. Pour cela, quelques bits de l'adresse indiquent quel ''rank'' activer. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Les chips mémoires noirs de 8 bits sont composés de plusieurs '''banques''' accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe. Il faut ainsi distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
ffzy2itdmkq1adt5c8lrfuggj0k420n
764426
764425
2026-04-22T13:07:17Z
Mewtow
31375
/* Le format des barrettes de mémoire */
764426
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
===Le format des barrettes de 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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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.
|}
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Les ''Chip Select'' pour activer/désactiver les ''ranks'' sont générés par le contrôleur mémoire, ou dans la barrette de mémoire. Pour cela, quelques bits de l'adresse indiquent quel ''rank'' activer. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Les chips mémoires noirs de 8 bits sont composés de plusieurs '''banques''' accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe. Il faut ainsi distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
9jzg5pljr5enjbpjnv7wx442vu5gute
764427
764426
2026-04-22T13:07:35Z
Mewtow
31375
/* Le format des barrettes de mémoire */
764427
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Les ''Chip Select'' pour activer/désactiver les ''ranks'' sont générés par le contrôleur mémoire, ou dans la barrette de mémoire. Pour cela, quelques bits de l'adresse indiquent quel ''rank'' activer. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Les chips mémoires noirs de 8 bits sont composés de plusieurs '''banques''' accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe. Il faut ainsi distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
6slcvqmgbf9yup1zsk03yjbs1ftepm5
764428
764427
2026-04-22T13:12:43Z
Mewtow
31375
/* Les ranks et les banques */
764428
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
Il faut noter que les bits de ''Chip Select'' sont générés par le contrôleur mémoire, ou dans la barrette de mémoire. Pour cela, quelques bits de l'adresse indiquent quel ''rank'' activer. Le contrôleur de DRAM peut adresser un certain nombre de ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Les chips mémoires noirs de 8 bits sont composés de plusieurs '''banques''' accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe. Il faut ainsi distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
c1efzasb7cszb4nzvboeajoooaxguh8
764430
764428
2026-04-22T13:13:34Z
Mewtow
31375
/* Les ranks et les banques */
764430
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Les chips mémoires noirs de 8 bits sont composés de plusieurs '''banques''' accessibles en parallèle. Il s'agit d'une propriété qui améliore grandement leurs performances. Il est en effet possible de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe. Il faut ainsi distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
t1la8dyjxkxpfc1f6e8cyet9dwo0tgp
764431
764430
2026-04-22T13:50:14Z
Mewtow
31375
/* Les ranks et les banques */
764431
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Les chips mémoires noirs de 8 bits sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des délais mémoires. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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
|-
! 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.
|}
===Les commandes SDRAM===
Le bus de commandes d'une SDRAM contient évidemment un signal d'horloge, pour cadencer la mémoire, mais pas que. En tout, 18 fils permettent d'envoyer des commandes à la mémoire, commandes qui vont effectuer une lecture, une écriture, ou autre chose dans le genre. 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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
f010wb1eyg0037f6s3ff08jn0pfcru2
764432
764431
2026-04-22T14:12:31Z
Mewtow
31375
/* Les mémoires SDRAM */
764432
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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 ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Les chips mémoires noirs de 8 bits sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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
===Les commandes SDRAM===
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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
03sch3kxbbj5lyr62l4ivib36e0z64m
764433
764432
2026-04-22T14:12:49Z
Mewtow
31375
/* Les mémoires SDRAM */
764433
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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
|}
===L'interface d'une mémoire SDRAM===
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
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Les chips mémoires noirs de 8 bits sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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.
|}
===Les commandes SDRAM===
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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
1dk0xe3n9dboj1g7rob77mvxehe8eb5
764434
764433
2026-04-22T14:15:03Z
Mewtow
31375
/* L'interface d'une mémoire SDRAM */
764434
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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
|}
===L'interface d'une mémoire SDRAM===
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.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Les chips mémoires noirs de 8 bits sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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.
|}
===Les commandes SDRAM===
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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
mcri0q9etebhhxvv1r88p3lhjbdc9ql
764435
764434
2026-04-22T14:18:53Z
Mewtow
31375
/* Les mémoires SDRAM */
764435
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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
|}
===L'interface d'une mémoire SDRAM===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Le mode rafale===
Les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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.
|}
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
1n8j0gorpq9atn2rdz4o1ijzketu2hc
764436
764435
2026-04-22T14:19:19Z
Mewtow
31375
/* Le mode rafale */
764436
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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. Le standard autorise l'utilisation de 2 à 8 banques dans chaque barrette de SDRAM, autorise une forme de pipeline (une commande peut démarrer avant que la précédente termine), les barrettes mémoires utilisent de l'entrelacement. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
{| class="wikitable"
! 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
|}
===L'interface d'une mémoire SDRAM===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Le mode rafale===
Pour le mode rafale, les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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.
|}
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
38v2zsogbc5rkie7mrchuec25m8cccr
764437
764436
2026-04-22T14:20:44Z
Mewtow
31375
/* Les mémoires SDRAM */
764437
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
Un point important est que les SDRAM reprennent les optimisations des mémoires FPM et EDO. Notamment, elles gèrent nativement le mode rafale. 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.
===L'interface d'une mémoire SDRAM===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Le mode rafale===
Pour le mode rafale, les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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.
|}
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
kheh9aj4z6xkfmb3cve06gsvpyzwii7
764438
764437
2026-04-22T14:21:43Z
Mewtow
31375
/* Les commandes SDRAM */
764438
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
Un point important est que les SDRAM reprennent les optimisations des mémoires FPM et EDO. Notamment, elles gèrent nativement le mode rafale. 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.
===L'interface d'une mémoire SDRAM===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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, ...
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Une fois la banque et la ligne activée par une commande ACT, il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes. Le 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.
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. 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.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Le mode rafale===
Pour le mode rafale, les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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.
|}
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
0u126ddlu104gl1c5nxr9tslvw8ri5t
764439
764438
2026-04-22T14:26:24Z
Mewtow
31375
/* Les commandes SDRAM */
764439
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
Un point important est que les SDRAM reprennent les optimisations des mémoires FPM et EDO. Notamment, elles gèrent nativement le mode rafale. 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.
===L'interface d'une mémoire SDRAM===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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. 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.
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Le mode rafale===
Pour le mode rafale, les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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.
|}
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
ifd4yn856b422lentf0y8v42emc9gok
764440
764439
2026-04-22T14:27:32Z
Mewtow
31375
/* Les commandes SDRAM */
764440
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
Un point important est que les SDRAM reprennent les optimisations des mémoires FPM et EDO. Notamment, elles gèrent nativement le mode rafale. 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.
===L'interface d'une mémoire SDRAM===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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.
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.
{| class="wikitable" style="text-align:center"
! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Le mode rafale===
Pour le mode rafale, les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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.
|}
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
npktuevu2saj7cu4rerasas5p49bx49
764441
764440
2026-04-22T14:35:00Z
Mewtow
31375
/* Les commandes SDRAM */
764441
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
Un point important est que les SDRAM reprennent les optimisations des mémoires FPM et EDO. Notamment, elles gèrent nativement le mode rafale. 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.
===L'interface d'une mémoire SDRAM===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Le mode rafale===
Pour le mode rafale, les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont connectées à un bus mémoire spécifique, qui lui-même est commandé par un contrôleur de DRAM. Et ce contrôleur de DRAM est partiellement configurable pour les SDRAM. La configuration en question permet de gérer diverses options du mode rafale, comme le tableau ci-dessous le montre bien.
Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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.
|}
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
98ykxty37smtkhszj6eg1hjxc13vpk2
764442
764441
2026-04-22T14:35:41Z
Mewtow
31375
/* Le registre de mode du contrôleur mémoire */
764442
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
Un point important est que les SDRAM reprennent les optimisations des mémoires FPM et EDO. Notamment, elles gèrent nativement le mode rafale. 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.
===L'interface d'une mémoire SDRAM===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Le mode rafale===
Pour le mode rafale, les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
===Le registre de mode du contrôleur mémoire===
Les mémoires SDRAM sont partiellement configurables. La configuration en question permet de gérer diverses options du mode rafale, mais aussi d'autres options. Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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.
|}
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
7rm5h7xbhf6978mbk0g9t5mcc5slq8z
764443
764442
2026-04-22T14:36:11Z
Mewtow
31375
/* Le registre de mode du contrôleur mémoire */
764443
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
Un point important est que les SDRAM reprennent les optimisations des mémoires FPM et EDO. Notamment, elles gèrent nativement le mode rafale. 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.
===L'interface d'une mémoire SDRAM===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Le mode rafale===
Pour le mode rafale, les SDRAM gèrent à la fois l'accès entrelacé et l'accès linéaire. Nous avions vu ces deux types d'accès dans le chapitre sur les mémoires évoluées, mais faisons un bref rappel. Le mode linéaire est le mode rafale normal : un compteur est incrémenté à chaque cycle et son contenu est additionné à l'adresse de départ. Le mode entrelacé utilise un ordre différent. Avec ce mode de rafale, le contrôleur mémoire effectue un XOR bit à bit entre un compteur (incrémenté à chaque accès) et l'adresse de départ pour calculer la prochaine adresse de la rafale.
Sur les SDRAM, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. Ensuite, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. 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.
Les mémoires SDRAM sont partiellement configurables. La configuration en question permet de gérer diverses options du mode rafale, mais aussi d'autres options. Le contrôleur mémoire interne de la SDRAM mémorise ces informations dans un registre de 10 bits, le '''registre de mode'''. Il contient un bit qui permet de préciser s'il faut effectuer des accès normaux ou des accès en rafale, ainsi qu'un autre bit pour configurer le type de rafale (normale, entrelacée). Il mémorise aussi le nombre d'octets consécutifs à lire ou écrire. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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.
|}
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
69x7g5ugq9d28lpuhsl2oc51cttc5gd
764444
764443
2026-04-22T14:38:27Z
Mewtow
31375
/* Les mémoires SDRAM */
764444
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
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. Elles supportent les rafales entrelacées et linéaires.
Mieux que ça, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. 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 en question est mémorisée dans un registre de 10 bits, le '''registre de mode'''. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
9falib55rkclzbjrp7pclc7bxrsflhu
764445
764444
2026-04-22T14:38:36Z
Mewtow
31375
/* Les mémoires SDRAM */
764445
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
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. Elles supportent les rafales entrelacées et linéaires.
Mieux que ça, les paramètres qui ont trait au mode rafale sont modifiables, programmables. Déjà, on peut configurer la mémoire pour effectuer au choix des accès sans rafale ou des accès en rafale. 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 en question est mémorisée dans un registre de 10 bits, le '''registre de mode'''. Voici à quoi correspondent les 10 bits de ce registre :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
jna46jxdhewexe2b8mi8kaz3pzxvro6
764446
764445
2026-04-22T14:42:28Z
Mewtow
31375
/* Les mémoires SDRAM */
764446
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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, un registre de mode un peu plus grand (13 bits sur la DDR 2, au lieu de 10 sur les SDRAM). En clair, une simple augmentation quantitative.
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
3nhzf94dhvx4p4z200p0x619ja4c1xh
764447
764446
2026-04-22T14:45:06Z
Mewtow
31375
/* Les commandes des mémoires DDR */
764447
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
a6m6qfhkv7pbdj5lkfplg9sb0z1mqoq
764448
764447
2026-04-22T14:45:24Z
Mewtow
31375
/* Les commandes des mémoires DDR */
764448
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description
|-
| 1
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
kyymytsqc6zweftvuvo388flvxy4fau
764449
764448
2026-04-22T14:47:53Z
Mewtow
31375
/* Les commandes des mémoires DDR */
764449
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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. Il a donc fallu rajouter des bits d'adresses. Mais pour éviter d'avoir à rajouter des broches sur des barrettes déjà bien fournies, 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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
9ewb1ou7d7dzp082oolhqzmrmxz2ik2
764450
764449
2026-04-22T14:48:24Z
Mewtow
31375
/* Les commandes des mémoires DDR */
764450
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
Il faut un certain temps pour sélectionner une ligne ou une colonne, sans compter qu'une SDRAM doit gérer d'autres temps d'attente plus ou moins bien connus : ces temps d'attente sont appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
{|class="wikitable"
|-
!Timing!!Description
|-
||tRAS||Temps mis pour sélectionner une ligne.
|-
||tCAS||Temps mis pour sélectionner une colonne.
|-
||tRP||Temps mis pour réinitialiser le tampon de ligne et décharger la ligne.
|-
||tRCD||Temps entre la fin de la sélection d'une ligne, et le moment où l'on peut commencer à sélectionner la colonne.
|-
||tWTR||Temps entre une lecture et une écriture consécutives.
|-
||tCAS-to-CAS||Temps minimum entre deux sélections de deux colonnes différentes.
|}
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
1cxzguc0x9dwn7fkbh2d9dr90tb8od8
764451
764450
2026-04-22T14:59:30Z
Mewtow
31375
/* Les délais mémoires */
764451
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | Délais primaires
|-
||tRP|| Temps entre une commande PRECHARGE et une commande ACT
|-
||tRCD|| Temps entre une commande ACT et une commande READ/WRITE.
|-
||tCAS|| Temps entre une commande READ et l'envoi de la donnée lue sur le bus de données.
|-
||tCAS-to-CAS|| Temps minimum entre deux commandes READ.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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 circuits de notre ordinateur chargés de communiquer avec la mémoire (ceux placés soit sur la carte mère, soit dans le processeur), doivent connaitre ces timings et ne pas se tromper : sans ça, l’ordinateur ne fonctionne pas.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
d592u0ndfe43p029d6nrndha1np92pj
764452
764451
2026-04-22T15:00:33Z
Mewtow
31375
/* Les délais mémoires */
764452
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | Délais primaires
|-
||tRP|| Temps entre une commande PRECHARGE et une commande ACT
|-
||tRCD|| Temps entre une commande ACT et une commande READ/WRITE.
|-
||tCAS|| Temps entre une commande READ et l'envoi de la donnée lue sur le bus de données.
|-
||tCAS-to-CAS|| Temps minimum entre deux commandes READ.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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. Ils sont ensuite utilisés pour configurer le contrôleur de DRAM.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
pgvjqoqzdob0lzymyb177c8ru715oee
764453
764452
2026-04-22T15:00:45Z
Mewtow
31375
/* Les délais mémoires */
764453
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
===Les commandes SDRAM===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | Délais primaires
|-
||tRP|| Temps entre une commande PRECHARGE et une commande ACT
|-
||tRCD|| Temps entre une commande ACT et une commande READ/WRITE.
|-
||tCAS|| Temps entre une commande READ et l'envoi de la donnée lue sur le bus de données.
|-
||tCAS-to-CAS|| Temps minimum entre deux commandes READ.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
3kq3n691cvkqrsobib9kptl35arzahm
764454
764453
2026-04-22T15:09:46Z
Mewtow
31375
/* L'interface d'une mémoire SDRAM */
764454
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | Délais primaires
|-
||tRP|| Temps entre une commande PRECHARGE et une commande ACT
|-
||tRCD|| Temps entre une commande ACT et une commande READ/WRITE.
|-
||tCAS|| Temps entre une commande READ et l'envoi de la donnée lue sur le bus de données.
|-
||tCAS-to-CAS|| Temps minimum entre deux commandes READ.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
h2v916u5e0gupm14x2ngzug3job1dqw
764455
764454
2026-04-22T15:10:16Z
Mewtow
31375
/* Les ranks et les banques */
764455
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | Délais primaires
|-
||tRP|| Temps entre une commande PRECHARGE et une commande ACT
|-
||tRCD|| Temps entre une commande ACT et une commande READ/WRITE.
|-
||tCAS|| Temps entre une commande READ et l'envoi de la donnée lue sur le bus de données.
|-
||tCAS-to-CAS|| Temps minimum entre deux commandes READ.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données. Il est aussi possible d'obtenir ces 64 bits avec des puces de 4 ou 16 bits.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
f77xkzrceofcgdkakgbhv6ozz0m8lxq
764456
764455
2026-04-22T15:12:31Z
Mewtow
31375
/* Les délais mémoires */
764456
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données. Il est aussi possible d'obtenir ces 64 bits avec des puces de 4 ou 16 bits.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
bizf2lon63rk2evfg8aei7bpmkjj3et
764459
764456
2026-04-22T15:21:37Z
Mewtow
31375
/* Les mémoires SDRAM */
764459
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
===Les ''ranks'' et les banques===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Un '''''rank''''' est un ensemble de chips mémoire regroupés avec l'arrangement horizontal, tel qu'illustré ci-dessous. Pour rappel, il concatène plusieurs chips mémoire pour augmenter la taille du bus de données. Les SDRAM ont un bus de données de 64 bits, ces 64 bits étant dispersés dans plusieurs chips mémoire séparés. Le cas le plus fréquent sur une SDRAM est le suivant : un ''rank'' regroupe 8 chips mémoires de 8 bits, pour coller avec un bus mémoire de 64 bits, c'est à dire la même taille que le bus de données. Il est aussi possible d'obtenir ces 64 bits avec des puces de 4 ou 16 bits.
Une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
2cvg1at6j6f49h30sa8xh0euw22p3lv
764460
764459
2026-04-22T16:15:00Z
Mewtow
31375
/* Les ranks et les banques */
764460
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
emcl97ts2jv7oh7du4cgs5ybo8i13fk
764461
764460
2026-04-22T16:20:15Z
Mewtow
31375
/* Le Serial Presence Detect */
764461
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
===Les ''ranks'' : l'entrelacement horizontal et vertical===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Prenons le cas le plus simple, celui où seul l'arrangement horizontal est utilisé. Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on n'a pas le choix : on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits. Le tout est appelé l'arrangement horizontal, il est illustré ci-dessous.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Un ensemble de N chips utilisés avec l'arrangement horizontal forme un '''''rank'''''. L'exemple précédent n'avait qu'un seul ''rank'' et est de loin le plus simple. Cependant, une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
5uz4itt9xdrp2pgummbdcfck0nrwypf
764462
764461
2026-04-22T16:20:42Z
Mewtow
31375
/* Les barrettes de mémoire DRAM */
764462
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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 ''ranks'' : l'entrelacement horizontal et vertical===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical.
Prenons le cas le plus simple, celui où seul l'arrangement horizontal est utilisé. Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on n'a pas le choix : on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits. Le tout est appelé l'arrangement horizontal, il est illustré ci-dessous.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
Un ensemble de N chips utilisés avec l'arrangement horizontal forme un '''''rank'''''. L'exemple précédent n'avait qu'un seul ''rank'' et est de loin le plus simple. Cependant, une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Les interconnexions à l'intérieur d'une barrette de mémoire===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
ks2ka5ogrmnlcat78qhkawk61qgvj59
764463
764462
2026-04-22T16:23:33Z
Mewtow
31375
/* Les ranks : l'entrelacement horizontal et vertical */
764463
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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 ''ranks'' : l'entrelacement horizontal et vertical===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical. Commençons par le cas le plus simple, celui où seul l'arrangement horizontal est utilisé.
Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on n'a pas le choix : on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits.
Le tout est appelé l'arrangement horizontal, il est illustré ci-dessous. Un ensemble de N chips utilisés avec l'arrangement horizontal forme un '''''rank'''''. 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, les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. L'adresse à lire est envoyée à tous les chips mémoire d'un même ''rank'', idem pour les signaux de commande.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
L'exemple précédent n'avait qu'un seul ''rank'' et est de loin le plus simple. Cependant, une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Les interconnexions à l'intérieur d'une barrette de mémoire===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
8mvz4afdpqmzdsunbsb9h6q7rarse7r
764464
764463
2026-04-22T16:30:12Z
Mewtow
31375
/* Les ranks : l'entrelacement horizontal et vertical */
764464
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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 ''ranks'' : l'entrelacement horizontal et vertical===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical. Commençons par le cas le plus simple, celui où seul l'arrangement horizontal est utilisé.
Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on n'a pas le choix : on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits.
Le tout est appelé l'arrangement horizontal, il est illustré ci-dessous. Un ensemble de N chips utilisés avec l'arrangement horizontal forme un '''''rank'''''. 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, les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. L'adresse à lire est envoyée à tous les chips mémoire d'un même ''rank'', idem pour les signaux de commande.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
L'exemple précédent n'avait qu'un seul ''rank'' et est de loin le plus simple. Maintenant, passons à l'arrangement vertical. L'idée est cette fois-ci de combiner plusieurs chips mémoire pour augmenter la capacité mémoire, mais sans utiliser l'arrangement horizontal, sans élargir le bus de données.
Par exemple, imaginez que je souhaite créer une mémoire DRAM de type FPM en combinant plusieurs chips mémoire. La barrette de RAM a un bus mémoire d'un octet, les puces aussi on un bus de données d'un octet. Je peux alors combiner plusieurs chips mémoire, pour combiner leurs capacités, sans élargir le bus de données. Par exemple, si j'ai 4 chips mémoires de 1 mébioctet chacun, je peux les combiner pour avoir une barrette de RAM de 4 mébioctets. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la désactiver. L'idée est que selon l'adresse demandée, on active le chip mémoire associé à cette adresse. Le problème est qu'il faut générer les signaux ''Chip Select'' à partir de l'adresse. Ce décodage d'adresse est réalisé par le contrôleur de DRAM.
Cependant, une mémoire SDRAM contient 1, 2, 4 ou 8 ''ranks''. Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Une SDRAM moderne peut avoir plusieurs ''ranks''. Prenons l'exemple d'une mémoire avec 16 chips de DRAM de 8 bits chacun : les 8 chips peuvent être regroupés en deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en utilisant un bit de ''Chip Select'', qui décide quel groupe de 8 chips DRAM activer. La logique est la même avec plus de deux ''ranks''. Deux ''ranks'' différents seront sélectionnés par des signaux ''Chip Select'' différents.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un controleur de DRAM supportant maximum 8 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
Pour résumer, il faut distinguer les ''ranks'' et les banques. Les ''rank'' font de l'arrangement horizontal, les banques de l'arrangement vertical.
===Les interconnexions à l'intérieur d'une barrette de mémoire===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
f8szm8310dl6euvxtt19945m6gdi9gl
764466
764464
2026-04-22T16:35:14Z
Mewtow
31375
/* Les ranks : l'entrelacement horizontal et vertical */
764466
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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 ''ranks'' : l'entrelacement horizontal et vertical===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical. Commençons par le cas le plus simple, celui où seul l'arrangement horizontal est utilisé.
Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on n'a pas le choix : on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits.
Le tout est appelé l'arrangement horizontal, il est illustré ci-dessous. Un ensemble de N chips utilisés avec l'arrangement horizontal forme un '''''rank'''''. 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, les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. L'adresse à lire est envoyée à tous les chips mémoire d'un même ''rank'', idem pour les signaux de commande.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
L'exemple précédent n'avait qu'un seul ''rank'' et est de loin le plus simple. Maintenant, passons à l'arrangement vertical. L'idée est cette fois-ci de combiner plusieurs chips mémoire pour augmenter la capacité mémoire, mais sans utiliser l'arrangement horizontal, sans élargir le bus de données.
Par exemple, imaginez que je souhaite créer une mémoire DRAM de type FPM en combinant plusieurs chips mémoire. La barrette de RAM a un bus mémoire d'un octet, les puces aussi on un bus de données d'un octet. Je peux alors combiner plusieurs chips mémoire, pour combiner leurs capacités, sans élargir le bus de données. Par exemple, si j'ai 4 chips mémoires de 1 mébioctet chacun, je peux les combiner pour avoir une barrette de RAM de 4 mébioctets. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la désactiver. L'idée est que selon l'adresse demandée, on active le chip mémoire associé à cette adresse. Le problème est qu'il faut générer les signaux ''Chip Select'' à partir de l'adresse. Ce décodage d'adresse est réalisé par le contrôleur de DRAM. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
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. C'est surtout utilisé sur les barrettes de mémoire SDRAM, qui contiennent 1, 2, 4 ou 8 ''ranks'', rarement plus. Par exemple, une SDRAM peut combiner 16 chips de DRAM de 8 bits chacun, dans deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en configurant les bits ''Chip Select'' de chaque ''rank''.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. 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 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
===Les interconnexions à l'intérieur d'une barrette de mémoire===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
hqboclp0ec9trflwjcvqv9qd7hkzccz
764467
764466
2026-04-22T16:41:37Z
Mewtow
31375
/* Les ranks : l'entrelacement horizontal et vertical */
764467
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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 ''ranks'' : l'entrelacement horizontal et vertical===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical. Commençons par le cas le plus simple, celui où seul l'arrangement horizontal est utilisé.
Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on n'a pas le choix : on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
Le tout est appelé l'arrangement horizontal, il est illustré ci-dessous. Un ensemble de N chips utilisés avec l'arrangement horizontal forme un '''''rank'''''. 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, les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. L'adresse à lire est envoyée à tous les chips mémoire d'un même ''rank'', idem pour les signaux de commande.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
L'exemple précédent n'avait qu'un seul ''rank'' et est de loin le plus simple. Maintenant, passons à l'arrangement vertical. L'idée est cette fois-ci de combiner plusieurs chips mémoire pour augmenter la capacité mémoire, mais sans utiliser l'arrangement horizontal, sans élargir le bus de données.
Par exemple, imaginez que je souhaite créer une mémoire DRAM de type FPM en combinant plusieurs chips mémoire. La barrette de RAM a un bus mémoire d'un octet, les puces aussi on un bus de données d'un octet. Je peux alors combiner plusieurs chips mémoire, pour combiner leurs capacités, sans élargir le bus de données. Par exemple, si j'ai 4 chips mémoires de 1 mébioctet chacun, je peux les combiner pour avoir une barrette de RAM de 4 mébioctets. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la désactiver. L'idée est que selon l'adresse demandée, on active le chip mémoire associé à cette adresse. Le problème est qu'il faut générer les signaux ''Chip Select'' à partir de l'adresse. Ce décodage d'adresse est réalisé par le contrôleur de DRAM. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
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. C'est surtout utilisé sur les barrettes de mémoire SDRAM, qui contiennent 1, 2, 4 ou 8 ''ranks'', rarement plus. Par exemple, une SDRAM peut combiner 16 chips de DRAM de 8 bits chacun, dans deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en configurant les bits ''Chip Select'' de chaque ''rank''.
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. 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 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
===Les interconnexions à l'intérieur d'une barrette de mémoire===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
sgztfjstaps17m4suyu7b2ccwozuegb
764468
764467
2026-04-22T16:44:23Z
Mewtow
31375
/* Les ranks : l'entrelacement horizontal et vertical */
764468
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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 ''ranks'' : l'entrelacement horizontal et vertical===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical. Commençons par le cas le plus simple, celui où seul l'arrangement horizontal est utilisé.
Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on n'a pas le choix : on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
Le tout est appelé l'arrangement horizontal, il est illustré ci-dessous. Un ensemble de N chips utilisés avec l'arrangement horizontal forme un '''''rank'''''. 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, les chips d'un même ''rank'' partagent les signaux d'adresse et de commande, ainsi qu'un signal ''Chip select''. L'adresse à lire est envoyée à tous les chips mémoire d'un même ''rank'', idem pour les signaux de commande.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
L'exemple précédent n'avait qu'un seul ''rank'' et est de loin le plus simple. Maintenant, passons à l'arrangement vertical. L'idée est cette fois-ci de combiner plusieurs chips mémoire pour augmenter la capacité mémoire, mais sans utiliser l'arrangement horizontal, sans élargir le bus de données.
Par exemple, imaginez que je souhaite créer une mémoire DRAM de type FPM en combinant plusieurs chips mémoire. La barrette de RAM a un bus mémoire d'un octet, les puces aussi on un bus de données d'un octet. Je peux alors combiner plusieurs chips mémoire, pour combiner leurs capacités, sans élargir le bus de données. Par exemple, si j'ai 4 chips mémoires de 1 mébioctet chacun, je peux les combiner pour avoir une barrette de RAM de 4 mébioctets. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la désactiver. L'idée est que selon l'adresse demandée, on active le chip mémoire associé à cette adresse. Le problème est qu'il faut générer les signaux ''Chip Select'' à partir de l'adresse. Ce décodage d'adresse est réalisé par le contrôleur de DRAM. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
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. C'est surtout utilisé sur les barrettes de mémoire SDRAM, qui contiennent 1, 2, 4 ou 8 ''ranks'', rarement plus. Par exemple, une SDRAM peut combiner 16 chips de DRAM de 8 bits chacun, dans deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en configurant les bits ''Chip Select'' de chaque ''rank''.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. 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 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
===Les interconnexions à l'intérieur d'une barrette de mémoire===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
pr7f27b5161otzt0rtgampq9e6xy3n2
764469
764468
2026-04-22T16:47:10Z
Mewtow
31375
/* Les ranks : l'entrelacement horizontal et vertical */
764469
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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 ''ranks'' : l'entrelacement horizontal et vertical===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical. Commençons par le cas le plus simple, celui où seul l'arrangement horizontal est utilisé.
Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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 un '''''rank'''''.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
L'exemple précédent n'avait qu'un seul ''rank'' et est de loin le plus simple. Maintenant, passons à l'arrangement vertical. L'idée est cette fois-ci de combiner plusieurs chips mémoire pour augmenter la capacité mémoire, mais sans utiliser l'arrangement horizontal, sans élargir le bus de données.
Par exemple, imaginez que je souhaite créer une mémoire DRAM de type FPM en combinant plusieurs chips mémoire. La barrette de RAM a un bus mémoire d'un octet, les puces aussi on un bus de données d'un octet. Je peux alors combiner plusieurs chips mémoire, pour combiner leurs capacités, sans élargir le bus de données. Par exemple, si j'ai 4 chips mémoires de 1 mébioctet chacun, je peux les combiner pour avoir une barrette de RAM de 4 mébioctets. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la désactiver. L'idée est que selon l'adresse demandée, on active le chip mémoire associé à cette adresse. Le problème est qu'il faut générer les signaux ''Chip Select'' à partir de l'adresse. Ce décodage d'adresse est réalisé par le contrôleur de DRAM. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
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. C'est surtout utilisé sur les barrettes de mémoire SDRAM, qui contiennent 1, 2, 4 ou 8 ''ranks'', rarement plus. Par exemple, une SDRAM peut combiner 16 chips de DRAM de 8 bits chacun, dans deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en configurant les bits ''Chip Select'' de chaque ''rank''.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. 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 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
===Les interconnexions à l'intérieur d'une barrette de mémoire===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
qvymbypo0yyvsb8hh04kgoqclg0s5uw
764470
764469
2026-04-22T16:47:42Z
Mewtow
31375
/* Les ranks : l'entrelacement horizontal et vertical */
764470
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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 ''ranks'' : l'entrelacement horizontal et vertical===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical. Commençons par le cas le plus simple, celui où seul l'arrangement horizontal est utilisé.
Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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 un '''''rank'''''.
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
L'exemple précédent n'avait qu'un seul ''rank'' et est de loin le plus simple. Maintenant, passons à l'arrangement vertical. L'idée est cette fois-ci de combiner plusieurs chips mémoire pour augmenter la capacité mémoire, mais sans utiliser l'arrangement horizontal, sans élargir le bus de données.
Par exemple, imaginez que je souhaite créer une mémoire DRAM de type FPM en combinant plusieurs chips mémoire. La barrette de RAM a un bus mémoire d'un octet, les puces aussi on un bus de données d'un octet. Je peux alors combiner plusieurs chips mémoire, pour combiner leurs capacités, sans élargir le bus de données. Par exemple, si j'ai 4 chips mémoires de 1 mébioctet chacun, je peux les combiner pour avoir une barrette de RAM de 4 mébioctets. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la désactiver. L'idée est que selon l'adresse demandée, on active le chip mémoire associé à cette adresse. Le problème est qu'il faut générer les signaux ''Chip Select'' à partir de l'adresse. Ce décodage d'adresse est réalisé par le contrôleur de DRAM. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
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. C'est surtout utilisé sur les barrettes de mémoire SDRAM, qui contiennent 1, 2, 4 ou 8 ''ranks'', rarement plus. Par exemple, une SDRAM peut combiner 16 chips de DRAM de 8 bits chacun, dans deux ''ranks'' de 64 bits chacun, chaque ''rank'' regroupant 8 chips. Le choix entre le premier ou le second ''rank'' se fait en configurant les bits ''Chip Select'' de chaque ''rank''.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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 ''ranks'', dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 ''ranks''. 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 ''ranks''. Avec 4 barrettes contenant 4 ''ranks'' chacune, la limite est dépassée.
Les modules DIMM tendent à avoir plus de ''ranks'' que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux ''ranks'', contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
===Les interconnexions à l'intérieur d'une barrette de mémoire===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
6d67648dc0v7nghp06mlfrz2y79ryu4
764471
764470
2026-04-22T16:49:30Z
Mewtow
31375
/* Les ranks : l'entrelacement horizontal et vertical */
764471
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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 ''ranks'' : l'entrelacement horizontal et vertical===
Une barrette de mémoire SDRAM est composée de plusieurs chips mémoire, les petits boitiers noirs soudés sur la barrette, qu'on a vu plus haut. Il est intéressant de regarder comment ils sont associés pour former une SDRAM complète. Pour simplifier, ils sont associés en utilisant à la fois l'arrangement horizontal et vertical. Commençons par le cas le plus simple, celui où seul l'arrangement horizontal est utilisé.
Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
L'exemple précédent n'avait qu'une seule rangée et est de loin le plus simple. Maintenant, passons à l'arrangement vertical. L'idée est cette fois-ci de combiner plusieurs chips mémoire pour augmenter la capacité mémoire, mais sans utiliser l'arrangement horizontal, sans élargir le bus de données.
Par exemple, imaginez que je souhaite créer une mémoire DRAM de type FPM en combinant plusieurs chips mémoire. La barrette de RAM a un bus mémoire d'un octet, les puces aussi on un bus de données d'un octet. Je peux alors combiner plusieurs chips mémoire, pour combiner leurs capacités, sans élargir le bus de données. Par exemple, si j'ai 4 chips mémoires de 1 mébioctet chacun, je peux les combiner pour avoir une barrette de RAM de 4 mébioctets. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la désactiver. L'idée est que selon l'adresse demandée, on active le chip mémoire associé à cette adresse. Le problème est qu'il faut générer les signaux ''Chip Select'' à partir de l'adresse. Ce décodage d'adresse est réalisé par le contrôleur de DRAM. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
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. 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 le premier ou le second rangée se fait en configurant les bits ''Chip Select'' de chaque rangée.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
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 interconnexions à l'intérieur d'une barrette de mémoire===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
4bsm159tgxyqjh96fbtr5wm0tu1zsht
764474
764471
2026-04-22T17:04:43Z
Mewtow
31375
/* Les barrettes de mémoire DRAM */
764474
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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 chip 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. Nous allons voir les deux à la suite, dans ce qui suit. Commençons par le cas le plus simple, celui où seul l'arrangement horizontal est utilisé.
===L'arrangement horizontal===
Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement vertical : les rangées===
L'exemple précédent n'avait qu'une seule rangée et est de loin le plus simple. Maintenant, passons à l'arrangement vertical. L'idée est cette fois-ci de combiner plusieurs chips mémoire pour augmenter la capacité mémoire, mais sans utiliser l'arrangement horizontal, sans élargir le bus de données.
Par exemple, imaginez que je souhaite créer une mémoire DRAM de type FPM en combinant plusieurs chips mémoire. La barrette de RAM a un bus mémoire d'un octet, les puces aussi on un bus de données d'un octet. Je peux alors combiner plusieurs chips mémoire, pour combiner leurs capacités, sans élargir le bus de données. Par exemple, si j'ai 4 chips mémoires de 1 mébioctet chacun, je peux les combiner pour avoir une barrette de RAM de 4 mébioctets. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc.
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la désactiver. L'idée est que selon l'adresse demandée, on active le chip mémoire associé à cette adresse. Le problème est qu'il faut générer les signaux ''Chip Select'' à partir de l'adresse. Ce décodage d'adresse est réalisé par le contrôleur de DRAM. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizntal et vertical combinés===
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. 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 le premier ou le second rangée se fait en configurant les bits ''Chip Select'' de chaque rangée.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
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 de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
k6cb1j3kefow3xxkc9xop9rilybk5lq
764475
764474
2026-04-22T17:09:50Z
Mewtow
31375
/* Les rangées : l'arrangement horizontal et vertical */
764475
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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 chip 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 avrie pas : c'est le bus de données qui est élargit. Voyons cela en détail, et commençons par le cas le plus simple, celui de l'arrangement vertical seul.
===L'arrangement vertical : les rangées===
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. 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 cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal===
Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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. 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 le premier ou le second rangée se fait en configurant les bits ''Chip Select'' de chaque rangée.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
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 de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
fv6zz6d3yavbso7afydify87l8cddeb
764476
764475
2026-04-22T17:10:31Z
Mewtow
31375
/* L'arrangement vertical : les rangées */
764476
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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 chip 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 avrie pas : c'est le bus de données qui est élargit. Voyons cela en détail, et commençons par le cas le plus simple, celui de l'arrangement vertical seul.
===L'arrangement vertical : les rangées===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal===
Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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. 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 le premier ou le second rangée se fait en configurant les bits ''Chip Select'' de chaque rangée.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
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 de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
ar0yvwg2ww0635h284bmbw6uf0gao0i
764477
764476
2026-04-22T17:11:47Z
Mewtow
31375
/* L'arrangement vertical : les rangées */
764477
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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 chip 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 avrie pas : c'est le bus de données qui est élargit. Voyons cela en détail, et commençons par le cas le plus simple, celui de l'arrangement vertical seul.
===L'arrangement vertical : les rangées===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal===
Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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. 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 le premier ou le second rangée se fait en configurant les bits ''Chip Select'' de chaque rangée.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
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 de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
fsajfujfl0zrrfc0nmvogjtnegjfgu3
764478
764477
2026-04-22T17:12:23Z
Mewtow
31375
/* L'arrangement vertical : les rangées */
764478
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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 chip 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 avrie pas : c'est le bus de données qui est élargit. 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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal===
Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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. 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 le premier ou le second rangée se fait en configurant les bits ''Chip Select'' de chaque rangée.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
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 de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
l0oaisnfsedqsrizqw6gs1vlj3kxtds
764479
764478
2026-04-22T17:12:40Z
Mewtow
31375
/* Les rangées : l'arrangement horizontal et vertical */
764479
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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 chip 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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal===
Imaginez que l'on souhaite créer une barrette de mémoire SDRAM. Les barrettes de SDRAM ont un bus de données de 64 bits, mais il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. Pour fabriquer une barrette de RAM, on doit combiner plusieurs chips mémoire de manière à ce que leurs tailles s'additionnent. 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 4 ou 16 bits.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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. 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 le premier ou le second rangée se fait en configurant les bits ''Chip Select'' de chaque rangée.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
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 de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
0umma7z2znevvhs68y9agbc1tlgk403
764480
764479
2026-04-22T17:23:42Z
Mewtow
31375
/* L'arrangement horizontal */
764480
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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 chip 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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal===
L'arrangement horizontal permet lui aussi d'additionner le capacité 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 élargit. Le mieux pour comprendre l'idée est de partir d'un exemple, et nous allons prendre celui d'une mémoire SDRAM.
Les barre 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ésoud 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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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. 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 le premier ou le second rangée se fait en configurant les bits ''Chip Select'' de chaque rangée.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
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 de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
kgmvj6qyhxttqjemlqjirlhuctkfmwi
764481
764480
2026-04-22T17:24:28Z
Mewtow
31375
/* L'arrangement horizontal et vertical combinés */
764481
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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 chip 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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal===
L'arrangement horizontal permet lui aussi d'additionner le capacité 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 élargit. Le mieux pour comprendre l'idée est de partir d'un exemple, et nous allons prendre celui d'une mémoire SDRAM.
Les barre 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ésoud 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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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 le premier ou le second rangée se fait en configurant les bits ''Chip Select'' de chaque rangée.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
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 de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
6910j0eta2d0mnl3jboxyxwkkk7yfef
764482
764481
2026-04-22T17:25:15Z
Mewtow
31375
/* Les rangées : l'arrangement horizontal et vertical */
764482
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
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 de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
euoqoyy9kxm0b7ohpdb5yu3hbdl8rt2
764488
764482
2026-04-22T17:43:09Z
Mewtow
31375
/* L'arrangement horizontal */
764488
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
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 de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
gh6j2wz9v5ek311g9ynai1v6wlr35da
764489
764488
2026-04-22T17:43:23Z
Mewtow
31375
/* L'arrangement horizontal et vertical combinés */
764489
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
9gyebgwyzl0yx51se0be6y97dg09lbm
764490
764489
2026-04-22T17:43:41Z
Mewtow
31375
/* Le format des barrettes de mémoire */
764490
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
furo3qk9hnsmu8f5aa427snje1v9x2b
764491
764490
2026-04-22T17:43:52Z
Mewtow
31375
/* Le format des barrettes de mémoire */
764491
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces sont connectées aux bus d'adresse et de commande, 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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
2f0vugczbw9z48eb7kc236bxdvsxqkt
764492
764491
2026-04-22T17:46:09Z
Mewtow
31375
/* Les interconnexions à l'intérieur d'une barrette de mémoire */
764492
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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 qu'elle fonctionne mal à haute fréquence et qu'elle est aussi difficile à router parce que les nombreuses connexions posent problèmes.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
3zf5ry1emmdzotvlprraa7nnswwh8tv
764493
764492
2026-04-22T17:46:43Z
Mewtow
31375
/* Les interconnexions à l'intérieur d'une barrette de mémoire */
764493
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
Les mémoires DRAM prennent concrètement la forme de circuits intégrés comme les autres, à savoir que ce sont des petits boitiers noirs. Ils sont soit soudés sur la carte mère, soit soudés sur une barrette de mémoire. Dans ce qui suit, nous les appellerons des '''chip mémoire''', ou encore, des puces mémoires. 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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
crwpj2732fgk8x6bmr3cqcw2n12eqvs
764494
764493
2026-04-22T17:52:18Z
Mewtow
31375
/* Les rangées : l'arrangement horizontal et vertical */
764494
wikitext
text/x-wiki
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 imprimés, de 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 allons étudier ces boitiers 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
o1sguupcwzlsy9kny39jxof8ypifjp6
764495
764494
2026-04-22T17:53:07Z
Mewtow
31375
764495
wikitext
text/x-wiki
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 '''chip 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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
p7g47u2w83i0riw1m8gng8kqzu7w0uk
764496
764495
2026-04-22T17:53:15Z
Mewtow
31375
764496
wikitext
text/x-wiki
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
dcfdymrzxkpsp2fazgbi43k2znnih11
764497
764496
2026-04-22T17:54:15Z
Mewtow
31375
764497
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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.
==Les barrettes de mémoire DRAM==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
sufa7imcwid1ijg3bk22rercovi82zj
764503
764497
2026-04-22T18:37:57Z
Mewtow
31375
/* L'arrangement horizontal et vertical combinés */
764503
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail.
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
8gc18sfejhmwohkeji1qclvmim75ebc
764507
764503
2026-04-22T19:01:33Z
Mewtow
31375
/* L'arrangement vertical : cumuler des adresses mémoire */
764507
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 et peut faire ce qu'il veut dans son coin durant ce temps. 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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
rwtvet9pz9muqswux8l6uufzflpsc37
764518
764507
2026-04-22T20:18:39Z
Mewtow
31375
/* Les mémoires SDRAM */
764518
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
croa15w1clcfe7zw28532pi6fjrjtod
764536
764518
2026-04-22T21:05:54Z
Mewtow
31375
/* Les mémoires EDO-RAM */
764536
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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 un nouvel accès 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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
===Les mémoires EDO-RAM avec mode rafale===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
84ofy11fpghhvw25ajb4dgrehjxlxn6
764537
764536
2026-04-22T21:09:05Z
Mewtow
31375
/* Les mémoires EDO-RAM */
764537
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
2ozh3vct0hfu03hqs8hoi3uo7yizxfc
764540
764537
2026-04-22T21:44:01Z
Mewtow
31375
/* L'interface d'une mémoire SDRAM */
764540
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2|Arrangement vertical]]
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
qwxosxlq1mt50qcdx19sr9f8vkqx2zg
764541
764540
2026-04-22T21:44:09Z
Mewtow
31375
/* L'interface d'une mémoire SDRAM */
764541
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle. Un point très important est que chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. Et cela permet de faire plusieurs accès mémoire en parallèle, dans des banques différentes. Il est par exemple possible de lancer un accès mémoire dans une banque, alors qu'un accès est en cours dans une autre banque. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM.
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.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Arrangement vertical]]
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
p6avypx3tg4uh9084yz30gdd1744ciw
764542
764541
2026-04-22T21:45:43Z
Mewtow
31375
/* L'interface d'une mémoire SDRAM */
764542
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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. Concrètement, 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. Cependant, il faut signaler que l'usage de banques mémoire change la donne. Il est en effet possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle, chacune étant 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é. Et 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.
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.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Arrangement vertical]]
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
tltx880tkygaobgz56hdipplkz9zzea
764560
764542
2026-04-22T22:55:41Z
Mewtow
31375
/* Le rafraichissement mémoire */
764560
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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''. Les chips mémoires de SDRAM sont composés de plusieurs '''banques''' accessibles en parallèle, chacune étant 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é. Et 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.
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.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Arrangement vertical]]
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
rjqimoau0jkpygbj52sg7ukmgubwlvv
764561
764560
2026-04-22T22:59:41Z
Mewtow
31375
/* Les mémoires SDRAM */
764561
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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
|}
===La présence de banques===
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 plutot, 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é.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
Intégrer plusieurs banques est avant tout une source d'optimisations. 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.
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 simultannés a toute sa place dans un futur chapitre sur le parallélisme mémoire.
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Arrangement vertical]]
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
cxgjevkvleeksluxgs7fayldo89y27b
764573
764561
2026-04-22T23:29:28Z
Mewtow
31375
/* La présence de banques */
764573
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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===
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 plutot, 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é.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
Intégrer plusieurs banques est avant tout une source d'optimisations. 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.
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 simultannés a toute sa place dans un futur chapitre sur le parallélisme mémoire.
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Arrangement vertical]]
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
6494isw40dxb57oax4ot52hit1jdtn1
764574
764573
2026-04-22T23:29:40Z
Mewtow
31375
/* L'interface d'une mémoire SDRAM */
764574
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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===
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 plutot, 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é.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
Intégrer plusieurs banques est avant tout une source d'optimisations. 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.
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 simultannés a toute sa place dans un futur chapitre sur le parallélisme mémoire.
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
7h1ov3sg6miq64e7x5gmm97madtapsr
764575
764574
2026-04-22T23:32:29Z
Mewtow
31375
/* Les banques internes aux chips mémoires SDRAM */
764575
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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===
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 plutot, 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é.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
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 simultannés a toute sa place dans un futur chapitre sur le parallélisme mémoire.
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
12l58cg0lsh2u049ivl643k3y4h1nvd
764576
764575
2026-04-22T23:42:22Z
Mewtow
31375
/* Les banques internes aux chips mémoires SDRAM */
764576
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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===
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é.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
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 : celui d'une mémoire partagée entre plusieurs processeurs. Les deux processeurs ou cœurs exécutent deux programmes différents, sur des données différentes. Par exemple, le premier processeur exécute le navigateur web, alors que le second lit de la musique. Dans ce cas, les deux processeurs accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple), qui sont potentiellement dans des banques séparées.
Le contrôleur mémoire reçoit des requêtes mémoires des deux processeurs, mais il les exécute sur la SDRAM. Il détecte alors si les accès mémoire tombent dans des banques séparées ou non. Si c'est le cas, il lance des commandes séparées sur des banques séparée. Concrètement, dans l'exemple plus haut, les requêtes du premier processeur tomberont dans la banque numéro 5, alors que l'autre processeur accédera à la banque numéro 205. Le contrôleur mémoire peut alors lancer deux commandes l'une après l'autre : la première atterrit dans une banque, la seconde atterrit dans une autre banque.
Un autre exemple est celui d'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.
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
5qh2ybiql64sl73h1e9p59e7ilxw8pg
764577
764576
2026-04-22T23:43:53Z
Mewtow
31375
/* Les banques internes aux chips mémoires SDRAM */
764577
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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===
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é.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
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 : celui d'une mémoire partagée entre plusieurs processeurs. Les deux processeurs ou cœurs exécutent deux programmes différents, sur des données différentes. Par exemple, le premier processeur exécute le navigateur web, alors que le second lit de la musique. Dans ce cas, les deux processeurs accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple), qui sont potentiellement dans des banques séparées.
Le contrôleur mémoire reçoit des requêtes mémoires des deux processeurs, mais il les exécute sur la SDRAM. Il détecte alors si les accès mémoire tombent dans des banques séparées ou non. Si c'est le cas, il lance des commandes séparées sur des banques séparée. Concrètement, dans l'exemple plus haut, les requêtes du premier processeur tomberont dans la banque numéro 5, alors que l'autre processeur accédera à la banque numéro 205. Le contrôleur mémoire peut alors lancer deux commandes presque en même temps : la première atterrit dans une banque, la seconde atterrit dans une autre banque.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM, avec une rafale de 4 octets.
|-
! !! 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
| || bgcolor="#A0FFFF" | ACT(1) || || bgcolor="#A0FFFF" | READ (1) || || bgcolor="#FFA0FF" | ACT (2) || || bgcolor="#FFA0FF" | READ (2) || || || || ||
|-
! Bus de données
| || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1
| bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 |
|}
Un autre exemple est celui d'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.
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
cgld6hc0t48o0hurwrp8iumi76w33x4
764578
764577
2026-04-22T23:49:52Z
Mewtow
31375
/* Les banques internes aux chips mémoires SDRAM */
764578
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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===
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é.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
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 : celui d'une mémoire partagée entre plusieurs processeurs. Les deux processeurs ou cœurs exécutent deux programmes différents, sur des données différentes. Par exemple, le premier processeur exécute le navigateur web, alors que le second lit de la musique. Dans ce cas, les deux processeurs accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple), qui sont potentiellement dans des banques séparées.
Le contrôleur mémoire reçoit des requêtes mémoires des deux processeurs, mais il les exécute sur la SDRAM. Il détecte alors si les accès mémoire tombent dans des banques séparées ou non. Si c'est le cas, il lance des commandes séparées sur des banques séparée. Concrètement, dans l'exemple plus haut, les requêtes du premier processeur tomberont dans la banque numéro 5, alors que l'autre processeur accédera à la banque numéro 205. Le contrôleur mémoire peut alors lancer deux commandes presque en même temps : la première atterrit dans une banque, la seconde atterrit dans une autre banque.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11
|-
! Bus de commande/adresse
| || bgcolor="#A0FFFF" | Lecture (CPU 1) || bgcolor="#FFA0FF" | Lecture (CPU 2) || || bgcolor="#A0FFFF" | Lecture (CPU 1) || || || bgcolor="#FFA0FF" | Lecture (CPU 2) || || ||
|-
! Bus de données
| || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#FFA0FF" | READ 2 || || || bgcolor="#A0FFFF" | READ 1 || || || bgcolor="#FFA0FF" | READ 2
|}
Un autre exemple est celui d'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.
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
cj5ikpfuopnatrymg0fioi3q8izpy9g
764579
764578
2026-04-22T23:50:51Z
Mewtow
31375
/* Les banques internes aux chips mémoires SDRAM */
764579
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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===
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é.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
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 : celui d'une mémoire partagée entre plusieurs processeurs. Les deux processeurs ou cœurs exécutent deux programmes différents, sur des données différentes. Par exemple, le premier processeur exécute le navigateur web, alors que le second lit de la musique. Dans ce cas, les deux processeurs accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple), qui sont potentiellement dans des banques séparées.
Le contrôleur mémoire reçoit des requêtes mémoires des deux processeurs, mais il les exécute sur la SDRAM. Il détecte alors si les accès mémoire tombent dans des banques séparées ou non. Si c'est le cas, il lance des commandes séparées sur des banques séparée. Concrètement, dans l'exemple plus haut, les requêtes du premier processeur tomberont dans la banque numéro 5, alors que l'autre processeur accédera à la banque numéro 205. Le contrôleur mémoire peut alors lancer deux commandes presque en même temps : la première atterrit dans une banque, la seconde atterrit dans une autre banque.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10
|-
! Bus de commande/adresse
| || bgcolor="#A0FFFF" | Lecture (CPU 1) || bgcolor="#FFA0FF" | Lecture (CPU 2) || || bgcolor="#A0FFFF" | Lecture (CPU 1) || || bgcolor="#FFA0FF" | Lecture (CPU 2) || ||
|-
! Bus de données
| || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#FFA0FF" | READ 2 || || bgcolor="#A0FFFF" | READ 1 || ||bgcolor="#FFA0FF" | READ 2
|}
Un autre exemple est celui d'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.
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
lw4s35gypa6187l46zuanbmqi2fuhcw
764580
764579
2026-04-22T23:54:42Z
Mewtow
31375
/* Les banques internes aux chips mémoires SDRAM */
764580
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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===
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é.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
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 : celui d'une mémoire partagée entre plusieurs processeurs. Les deux processeurs ou cœurs exécutent deux programmes différents, sur des données différentes. Par exemple, le premier processeur exécute le navigateur web, alors que le second lit de la musique. Dans ce cas, les deux processeurs accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple), qui sont potentiellement dans des banques séparées.
Le contrôleur mémoire reçoit des requêtes mémoires des deux processeurs, mais il les exécute sur la SDRAM. Il détecte alors si les accès mémoire tombent dans des banques séparées ou non. Si c'est le cas, il lance des commandes séparées sur des banques séparée. Concrètement, dans l'exemple plus haut, les requêtes du premier processeur tomberont dans la banque numéro 5, alors que l'autre processeur accédera à la banque numéro 205. Le contrôleur mémoire peut alors lancer deux commandes presque en même temps : la première atterrit dans une banque, la seconde atterrit dans une autre banque.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10
|-
! Bus de commande/adresse
| || bgcolor="#A0FFFF" | Lecture (CPU 1) || bgcolor="#FFA0FF" | Lecture (CPU 2) || || bgcolor="#A0FFFF" | Lecture (CPU 1) || || bgcolor="#FFA0FF" | Lecture (CPU 2) || ||
|-
! Bus de données
| || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#FFA0FF" | READ 2 || || bgcolor="#A0FFFF" | READ 1 || ||bgcolor="#FFA0FF" | READ 2
|}
Un autre exemple est celui d'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.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! 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
| || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || || colspan="3" bgcolor="#A0FFFF" | Accès CPU || ||
|-
! Banque Numéro 2
| || || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique ||
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
fk48097nhcfk5h7tu14sajryyj3g5hs
764581
764580
2026-04-22T23:55:36Z
Mewtow
31375
/* Les banques internes aux chips mémoires SDRAM */
764581
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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===
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é.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
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.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! 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
| || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || || colspan="3" bgcolor="#A0FFFF" | Accès CPU || ||
|-
! Banque Numéro 2
| || || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique ||
|}
Un autre exemple,a ssez similaire, est celui d'une mémoire partagée entre plusieurs processeurs. Les deux processeurs ou cœurs exécutent deux programmes différents, sur des données différentes. Par exemple, le premier processeur exécute le navigateur web, alors que le second lit de la musique. Dans ce cas, les deux processeurs accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple), qui sont potentiellement dans des banques séparées.
Le contrôleur mémoire reçoit des requêtes mémoires des deux processeurs, mais il les exécute sur la SDRAM. Il détecte alors si les accès mémoire tombent dans des banques séparées ou non. Si c'est le cas, il lance des commandes séparées sur des banques séparée. Concrètement, dans l'exemple plus haut, les requêtes du premier processeur tomberont dans la banque numéro 5, alors que l'autre processeur accédera à la banque numéro 205. Le contrôleur mémoire peut alors lancer deux commandes presque en même temps : la première atterrit dans une banque, la seconde atterrit dans une autre banque.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10
|-
! Bus de commande/adresse
| || bgcolor="#A0FFFF" | Lecture (CPU 1) || bgcolor="#FFA0FF" | Lecture (CPU 2) || || bgcolor="#A0FFFF" | Lecture (CPU 1) || || bgcolor="#FFA0FF" | Lecture (CPU 2) || ||
|-
! Bus de données
| || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#FFA0FF" | READ 2 || || bgcolor="#A0FFFF" | READ 1 || ||bgcolor="#FFA0FF" | READ 2
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
1cwzvont3zbmj389dvaicxv9phmhb4z
764582
764581
2026-04-22T23:56:26Z
Mewtow
31375
/* Les banques internes aux chips mémoires SDRAM */
764582
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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===
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é.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
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.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! 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
| || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || || colspan="3" bgcolor="#A0FFFF" | Accès CPU || ||
|-
! Banque Numéro 2
| || || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique ||
|}
Un autre exemple,a ssez similaire, est celui d'une mémoire partagée entre plusieurs processeurs. Les deux processeurs ou cœurs exécutent deux programmes différents, sur des données différentes. Par exemple, le premier processeur exécute le navigateur web, alors que le second lit de la musique. Dans ce cas, les deux processeurs accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple), qui sont potentiellement dans des banques séparées.
Le contrôleur mémoire reçoit des requêtes mémoires des deux processeurs, mais il les exécute sur la SDRAM. Il détecte alors si les accès mémoire tombent dans des banques séparées ou non. Si c'est le cas, il lance des commandes séparées sur des banques séparée. Concrètement, dans l'exemple plus haut, les requêtes du premier processeur tomberont dans la banque numéro 5, alors que l'autre processeur accédera à la banque numéro 205. Le contrôleur mémoire peut alors lancer deux commandes presque en même temps : la première atterrit dans une banque, la seconde atterrit dans une autre banque.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10
|-
! Bus de commande/adresse
| || bgcolor="#A0FFFF" | Lecture (CPU 1) || bgcolor="#FFA0FF" | Lecture (CPU 2) || || bgcolor="#A0FFFF" | Lecture (CPU 1) || || bgcolor="#FFA0FF" | Lecture (CPU 2) || ||
|-
! Bus de données
| || || || bgcolor="#A0FFFF" | Donnée lue CPU 1 || bgcolor="#FFA0FF" | Donnée lue CPU 2 || || bgcolor="#A0FFFF" | Donnée lue CPU 1 || ||bgcolor="#FFA0FF" | Donnée lue CPU 2
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
1h2ttguq3xd6ny7fcy7ie6f9i2hktmp
764583
764582
2026-04-22T23:57:48Z
Mewtow
31375
/* L'arrangement vertical : cumuler des adresses mémoire */
764583
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses avec arrangement vertical.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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===
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é.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
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.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! 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
| || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || || colspan="3" bgcolor="#A0FFFF" | Accès CPU || ||
|-
! Banque Numéro 2
| || || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique ||
|}
Un autre exemple,a ssez similaire, est celui d'une mémoire partagée entre plusieurs processeurs. Les deux processeurs ou cœurs exécutent deux programmes différents, sur des données différentes. Par exemple, le premier processeur exécute le navigateur web, alors que le second lit de la musique. Dans ce cas, les deux processeurs accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple), qui sont potentiellement dans des banques séparées.
Le contrôleur mémoire reçoit des requêtes mémoires des deux processeurs, mais il les exécute sur la SDRAM. Il détecte alors si les accès mémoire tombent dans des banques séparées ou non. Si c'est le cas, il lance des commandes séparées sur des banques séparée. Concrètement, dans l'exemple plus haut, les requêtes du premier processeur tomberont dans la banque numéro 5, alors que l'autre processeur accédera à la banque numéro 205. Le contrôleur mémoire peut alors lancer deux commandes presque en même temps : la première atterrit dans une banque, la seconde atterrit dans une autre banque.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10
|-
! Bus de commande/adresse
| || bgcolor="#A0FFFF" | Lecture (CPU 1) || bgcolor="#FFA0FF" | Lecture (CPU 2) || || bgcolor="#A0FFFF" | Lecture (CPU 1) || || bgcolor="#FFA0FF" | Lecture (CPU 2) || ||
|-
! Bus de données
| || || || bgcolor="#A0FFFF" | Donnée lue CPU 1 || bgcolor="#FFA0FF" | Donnée lue CPU 2 || || bgcolor="#A0FFFF" | Donnée lue CPU 1 || ||bgcolor="#FFA0FF" | Donnée lue CPU 2
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
p3qu7vrzz0blvco8pc6pt1yvc4tfxwe
764584
764583
2026-04-22T23:59:27Z
Mewtow
31375
/* Les banques internes aux chips mémoires SDRAM */
764584
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses avec arrangement vertical.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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===
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é.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
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.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! 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
| || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || || colspan="3" bgcolor="#A0FFFF" | Accès CPU || ||
|-
! Banque Numéro 2
| || || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique ||
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
ahb6y2m3khaue8gkzn6wxh3s4655ava
764589
764584
2026-04-23T00:15:27Z
Mewtow
31375
/* Les banques internes aux chips mémoires SDRAM */
764589
wikitext
text/x-wiki
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.
[[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]]
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==
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 bus d'adresse des DRAM est multiplexé===
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.
[[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]]
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.
[[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]]
===Le rafraichissement mémoire===
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.
[[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]]
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.
===Le contrôleur de DRAM===
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.
Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Par exemple, les contrôleur de DRAM Intel 8202, Intel 8203 et Intel 8207 étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs.
Il est possible de connecter plusieurs barrettes sur le même bus mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre.
==Les rangées : l'arrangement horizontal et vertical==
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===
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.
[[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses avec arrangement vertical.]]
Pour cela, il faut que chaque mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de la 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'''. Les bits de poids fort sont utilisés pour sélectionner le chip mémoire adéquat. 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.
[[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]]
===L'arrangement horizontal : élargir le bus de données===
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.
[[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]]
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'').
[[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]]
===L'arrangement horizontal et vertical combinés===
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.
[[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]]
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==
[[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]]
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.
[[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]]
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é.
{|class="wikitable"
|-
!Type de barrette
!Type de mémoire
!Nombre de broches
|-
| rowspan="2" | SIMM
| rowspan="2" | FPM/EDO
|30
|-
|72
|-
| rowspan="4" | 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===
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.
{| class="flexible"
|+ '''Barrette SIMM'''
|-
|[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]]
|[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]]
|}
: 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.
{|
|-
|[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]]
|[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]]
|}
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===
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.
[[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]]
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.
[[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']]
===Les barrettes tamponnées (à registres)===
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.
[[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]]
===Le ''Serial Presence Detect''===
[[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]]
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 : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect].
==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM==
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===
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.
[[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]]
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.
[[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]]
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.
[[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]]
===Les mémoires EDO-RAM===
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.
[[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]]
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===
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.
[[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]]
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.
[[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]]
===Le rafraichissement mémoire===
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''.
[[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]]
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'''.
[[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]]
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.
[[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]]
==Les mémoires SDRAM==
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 :
{| class="wikitable"
! 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===
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é.
[[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]]
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.
{|class="wikitable"
|+ Pipelining basique sur les SDRAM
|-
! !! 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
| || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || || colspan="3" bgcolor="#A0FFFF" | Accès CPU || ||
|-
! Banque Numéro 3
| || || || || || || || || || ||
|-
! Banque Numéro 4
| || || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique ||
|}
===Le mode rafale des SDRAM===
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 :
{|class="wikitable"
|+ Signification des bits du registre de mode des SDRAM
|-
! 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===
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===
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.
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.
{| class="wikitable" style="text-align:center"
! 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || 1 || 1 || 0 || colspan="3" | 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 || colspan="2" | 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 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || 0 || 0 || 0 || 00 || colspan="2" | 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 :
[[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]]
===Les délais mémoires===
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 :
{|class="wikitable"
|-
!Timing!!Description
|-
| colspan="2" |
|-
! colspan="2" | 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.
|-
! colspan="2" | Délais secondaires
|-
||tWTR|| Temps entre une lecture et une écriture consécutives.
|-
||tRAS || Temps entre une commande ACT et une commande PRECHARGE.
|}
La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM.
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.
==Les mémoires DDR==
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===
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.
{|class="wikitable"
|-
! 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===
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.
{| class="wikitable" style="text-align:center"
|+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM
! Bit CS || style="background: #CCFFCC" | 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
| colspan="6" | X
| Absence de commandes.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours.
|-
| 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active.
|-
| 0 || style="background: #CCFFCC" | 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.
|- style="background: #CCFFCC"
| 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM.
|-
| 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode.
|}
==Les VRAM des cartes vidéo==
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===
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===
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==
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'')===
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. A 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.
{|class="wikitable" style="text-align:center"
|+SLDRAM Read, write or row op request packet
! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0
|-
! 1
| colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande
|-
! 0
| colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne
|-
! 0
| colspan=9 bgcolor=#ffffcc| Ligne || 0
|-
! 0
| 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne
|}
===Les mémoires Rambus===
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''==
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 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce 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.
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les mémoires SRAM synchrones
| prevText=Les mémoires SRAM synchrones
| next=Contrôleur mémoire externe
| nextText=Le contrôleur mémoire externe
}}{{autocat}}
</noinclude>
qwa7c4ke8ukzxs7crpkj451sp4aafhe
Pour lire Platon/Sommaire
0
75119
764599
763986
2026-04-23T05:24:49Z
PandaMystique
119061
764599
wikitext
text/x-wiki
* [[Pour lire Platon/Premiers pas|Premiers pas]]
* [[Pour lire Platon/Conseils pour la lecture|Conseils pour la lecture]]
* [[Pour lire Platon/Introduction par les dialogues|Introduction par les dialogues]]
* [[Pour lire Platon/Introduction par les mythes|Introduction par les mythes]]
* [[Pour lire Platon/Guide des dialogues|Guide des dialogues]]
** [[Pour lire Platon/Guide des dialogues/Introduction|Introduction]]
* [[Pour lire Platon/Vocabulaire|Vocabulaire]]
* [[Pour lire Platon/Bibliographie|Bibliographie]]
{{AutoCat}}
8n3us01l7kzjnyz043x8ix5cgx1y0ox
764600
764599
2026-04-23T05:25:50Z
PandaMystique
119061
764600
wikitext
text/x-wiki
* [[Pour lire Platon/Premiers pas|Premiers pas]]
* [[Pour lire Platon/Conseils pour la lecture|Conseils pour la lecture]]
* [[Pour lire Platon/Introduction par les dialogues|Introduction par les dialogues]]
* [[Pour lire Platon/Introduction par les mythes|Introduction par les mythes]]
* [[Pour lire Platon/Guide des dialogues|Guide des dialogues]]
** [[Pour lire Platon/Guide des dialogues/Introduction|Introduction]]
* [[Pour lire Platon/Vocabulaire|Vocabulaire]]
* [[Pour lire Platon/Bibliographie|Bibliographie]]
<br>
{{AutoCat}}
t7811s4s2r56tqp6kgg5eg2b1q9wldr
764601
764600
2026-04-23T05:26:24Z
PandaMystique
119061
764601
wikitext
text/x-wiki
* [[Pour lire Platon/Premiers pas|Premiers pas]]
* [[Pour lire Platon/Conseils pour la lecture|Conseils pour la lecture]]
* [[Pour lire Platon/Introduction par les dialogues|Introduction par les dialogues]]
* [[Pour lire Platon/Introduction par les mythes|Introduction par les mythes]]
* [[Pour lire Platon/Guide des dialogues|Guide des dialogues]]
** [[Pour lire Platon/Guide des dialogues/Introduction|Introduction]]
* [[Pour lire Platon/Vocabulaire|Vocabulaire]]
* [[Pour lire Platon/Bibliographie|Bibliographie]]
{{AutoCat}}
<br>
0mx79t1rrgbhesemnv5fmmq39tkhal4
764602
764601
2026-04-23T05:27:09Z
PandaMystique
119061
764602
wikitext
text/x-wiki
* [[Pour lire Platon/Premiers pas|Premiers pas]]
* [[Pour lire Platon/Conseils pour la lecture|Conseils pour la lecture]]
* [[Pour lire Platon/Introduction par les dialogues|Introduction par les dialogues]]
* [[Pour lire Platon/Introduction par les mythes|Introduction par les mythes]]
* [[Pour lire Platon/Guide des dialogues|Guide des dialogues]]
** [[Pour lire Platon/Guide des dialogues/Introduction|Introduction]]
* [[Pour lire Platon/Vocabulaire|Vocabulaire]]
* [[Pour lire Platon/Bibliographie|Bibliographie]]
{{AutoCat}}
8n3us01l7kzjnyz043x8ix5cgx1y0ox
Le mouvement Wikimédia/L'encyclopédie libre et universelle
0
79272
764624
757389
2026-04-23T06:39:29Z
Lionel Scheepmans
20012
764624
wikitext
text/x-wiki
<noinclude>{{Le mouvement Wikimédia}}</noinclude>
Dans les chapitres précédents, nous avons découvert toutes les innovations techniques et culturelles sans lesquelles Wikipédia n’aurait jamais pu devenir la plus grande encyclopédie libre et universelle connue au monde. Son objectif est de synthétiser la totalité du savoir humain. Ce qui n’est autre, finalement, qu’un vieux rêve de notre humanité. Trois cents ans avant Jésus-Christ et durant la création de la bibliothèque d’Alexandrie, ce désir était aussi celui de [[w:fr: Ptolémée_Ier|Ptolémée <abbr>Iᵉʳ</abbr>]]. Puis, deux siècles plus tard, celui de [[w:Denis Diderot|Denis Diderot]], qui est mort en 1784 après avoir coproduit l’''[[w:Encyclopédie ou Dictionnaire raisonné des sciences, des arts et des métiers|Encyclopédie ou Dictionnaire raisonné des sciences, des arts et des métiers]]''. De manière plus récente encore, celui de [[w:fr: Paul Otlet|Paul Otlet]], qui s’était mis en tête de répertorier l’ensemble du savoir humain, durant la première moitié du vingtième siècle.
Peu connu à ce jour, ce Belge est pourtant le cocréateur de la [[w:fr: Classification décimale universelle|classification décimale universelle]], en usage depuis 1905, dans des bibliothèques du monde entier. Ce documentaliste avait pour rêve de cataloguer le monde et de rassembler toutes les connaissances humaines, sous la forme d’un gigantesque [[w:Répertoire_bibliographique_universel|répertoire bibliographique universel]], situé au sein d’un [[w:Mundaneum|Mundaneum]]<ref>{{Ouvrage|prénom1=Alex|nom1=Wright|titre=Cataloging the world : Paul Otlet and the birth of the information age|éditeur=Oxford University Press|date=2014|isbn=978-0-19-993141-5|oclc=861478071}}.</ref>. En 1934, dans le [[s:fr: Traité de documentation|''Traité de documentation'']] écrit par cet homme qui voulait « classer le monde<ref>{{Ouvrage|langue=|auteur=|prénom1=Françoise|nom1=Levie|titre=L' homme qui voulait classer le monde: Paul Otlet et le Mundaneum|passage=|lieu=|éditeur=Impressions Nouvelles|date=2008|pages totales=|isbn=978-2-87449-022-4|oclc=699650184}}.</ref> », apparait un songe particulièrement visionnaire concernant un possible partage du savoir et l’information''<ref>{{ouvrage|langue=|auteur=|prénom1=Paul|nom1=Otlet|titre=[[w: fr: Traité de documentation|Traité de documentation]]|sous-titre=Le Livre sur le livre, théorie et pratique|passage=428|lieu=Bruxelles|éditeur=Editions Mundaneum|année=1934|date=|pages totales=431|isbn=}}.</ref>'' :
<blockquote>
Ici, la Table de Travail n’est plus chargée d’aucun livre. À leur place se dresse un écran et à portée un téléphone. Là-bas, au loin, dans un édifice immense, sont tous les livres et tous les renseignements, avec tout l’espace que requiert leur enregistrement et leur manutention…
De là, on fait apparaître sur l’écran la page à lire pour connaître la question posée par téléphone avec ou sans fil. Un écran serait double, quadruple ou décuple s’il s’agissait de multiplier les textes et les documents à confronter simultanément ; il y aurait un haut-parleur si la vue devrait être aidée par une audition. Une telle hypothèse, un [[w:fr: H. G. Wells|Wells]] certes l’aimerait. Utopie aujourd’hui parce qu’elle n’existe encore nulle part, mais elle pourrait devenir la réalité de demain pourvu que se perfectionnent encore nos méthodes et notre instrumentation.
</blockquote>
[[Fichier:Le_Répertoire_Bibliographique_Universel_vers_1900.jpg|vignette|<small>Figure 13. Photographie de l’intérieur du Répertoire Bibliographique Universel prise aux alentours de 1900.</small>|400x400px]]
À peu de choses près, cette utopie décrite en 1934 par Otlet correspond à ce qui se passe pour beaucoup d'usagers du réseau Internet aujourd'hui, lorsqu'ils recherchent du savoir et des informations. Premièrement, allumer un écran d’ordinateur, avec ou sans fil, ensuite, poser une question dans un moteur de recherche, puis, dans la plupart des cas, être redirigé vers l'une des versions linguistiques de Wikipédia<ref>{{Lien web|langue=|auteur=Alexa|titre=Wikipedia.org Competitive Analysis, Marketing Mix and Traffic|url=https://web.archive.org/web/20201002021753/https://www.alexa.com/siteinfo/wikipedia.org|site=|date=|consulté le=}}.</ref>.
Ce scénario, dans lequel les moteurs de recherche jouent un rôle central, explique la popularité de l'encyclopédie libre. D'autres projets similaires étaient pourtant apparus sur le Web avant l'arrivée de Wikipédia. Environ trois ans avant sa création, [[w:fr: Aaron Swartz|Aaron Swartz]], un activiste de la culture libre qui n'avait que douze ans à l'époque, avait par exemple lancé une sorte de site encyclopédique produit et géré par ses usagers<ref>Brian Knappenberger, {{Lien web|titre=The Internet's own boy: The Story of Aaron Swartz{{!}}The Internet's own boy: The Story of Aaron Swartz|url=https://archive.org/details/youtube-gpvcc9C8SbM|éditeur=[[w:fr:Participant Media|Participant Medi]]|année=2014|passage=6:29 - 7:31 min|Auteur1=Brian Knappenberger}}.</ref>. Appelé ''The Info Network,'' ce site web avait d'ailleurs permis à son auteur de recevoir l'''[[w:en:ArsDigita|ArsDigita]] Prize'', un prix décerné aux jeunes créateurs de projets « utiles, éducatifs, collaboratifs et non commerciaux<ref>{{Lien web|auteur=David Amsden|titre=The Brilliant Life and Tragic Death of Aaron Swarz|url=https://web.archive.org/web/20211010013454/https://www.rollingstone.com/culture/culture-news/the-brilliant-life-and-tragic-death-of-aaron-swartz-177191/|site=Penske Media Corporation|éditeur=|date=28/02/2013|consulté le=}}.</ref> ». Soit autant de qualificatifs que l'on pourrait attribuer aujourd'hui au projet Wikipédia.
Il faut savoir ensuite que le concept d' « encyclopédie libre et universelle » fut formulée sur internet pour la première fois par Richard Stallman en 1998, soit un an avant la naissance de Wikipédia. C'était dans un essai intitulé ''[[metawiki:The Free Universal Encyclopedia and Learning Resource|The Free Universal Encyclopedia and Learning Resource]]''<ref>{{Lien web|auteur=Richard Stallman|titre=The Free Universal Encyclopedia and Learning Resource (1998 draft)|url=https://web.archive.org/web/20211029155052/https://www.gnu.org/encyclopedia/free-encyclopedia-1998-draft.html|site=GNU|date=2021/01/04}}.</ref>, qui selon son auteur avait été rédigé deux ans avant sa publication sur la liste de diffusion du projet GNU en décembre 2000<ref name="Stallman">{{Lien web|langue=|auteur=Richard Stallman|titre=The Free Universal Encyclopedia and Learning Resource|url=https://web.archive.org/web/20090201021222/http://www.gnu.org:80/encyclopedia/anencyc.txt|site=GNU|date=18 décembre 2000|consulté le=}}.</ref>. Repris ci-dessous, un extrait de ce texte, présente les particularités du projet de Stallman :
<blockquote>
Le World Wide Web a le potentiel de devenir une encyclopédie universelle couvrant tous les domaines de la connaissance et une bibliothèque complète de cours d’enseignement. Ce résultat pourrait être atteint sans effort particulier, si personne n’intervient. Mais les entreprises se mobilisent aujourd’hui pour orienter l’avenir vers une voie différente, dans laquelle elles contrôlent et limitent l’accès au matériel pédagogique, afin de soutirer de l’argent aux personnes qui veulent apprendre.
Nous ne pouvons pas empêcher les entreprises de restreindre l’information qu’elles mettent à disposition ; ce que nous pouvons faire, c’est proposer une alternative. Nous devons lancer un mouvement pour développer une encyclopédie libre universelle, tout comme le mouvement des logiciels libres nous a donné le système d’exploitation libre GNU/Linux. L’encyclopédie libre fournira une alternative aux encyclopédies restreintes que les entreprises de médias rédigeront<ref>Texte original avant sa traduction par www.deepl.com/translator : ''The World Wide Web has the potential to develop into a universal encyclopedia covering all areas of knowledge, and a complete library of instructional courses. This outcome could happen without any special effort, if no one interferes. But corporations are mobilizing now to direct the future down a different track--one in which they control and restrict access to learning materials, so as to extract money from people who want to learn. […] We cannot stop business from restricting the information it makes available ; what we can do is provide an alternative. We need to launch a movement to develop a universal free encyclopedia, much as the Free Software movement gave us the free software operating system GNU/Linux. The free encyclopedia will provide an alternative to the restricted ones that media corporations will write.''</ref>.
</blockquote>
[[Fichier:Wikimania_2016_-_Press_conference_with_Jimmy_Wales_and_Katherine_Maher_01_(centred_crop).jpg|vignette|<small>Figure 14. Jimmy Wales en 2016.</small>|gauche]]
En parlant d'un « mouvement pour développer une encyclopédie libre universelle », Stallman anticipait donc, sans le savoir, l'arrivée du mouvement Wikimédia, qui ne fut conceptualisé que bien des années plus tard. Quant à la soixantaine de paragraphes qui décrivent son projet, on y retrouve, dans une forme presque identique, les cinq principes fondateurs de l'encyclopédie Wikipédia<ref>{{Lien web|langue=|auteur=Wikipédia|titre=Principes fondateurs|url=https://web.archive.org/web/20230610010746/https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Principes_fondateurs|site=|date=|consulté le=}}.</ref>.
Le premier consiste bien sûr à [[w:fr:Wikipédia:Wikipédia est une encyclopédie|créer une encyclopédie]]. Le deuxième fait repose sur une recherche de [[w:fr: wikipédia: Neutralité de point de vue|neutralité de point de vue]]<ref>{{Lien web|langue=|auteur=Wikipedia|titre=Information for "Wikipedia: Neutral point of view"|url=https://web.archive.org/web/20201115191610/https://en.wikipedia.org/w/index.php?title=Wikipedia%3ANeutral_point_of_view&action=info|site=|date=|consulté le=}}.</ref>, tandis que Stallman expliquait qu’« en cas de controverse, plusieurs points de vue seront représentés ». Le troisième souligne l’usage et le respect des droits d’auteur et l’adoption d'une [[w:fr:Wikipédia:Droit d'auteur|licence libre]], un concept dont Stallman était à l'origine. Le quatrième, inscrit le projet dans une [[w:fr:Wikipédia:Règles de savoir-vivre|démarche collaborative]], alors que Stallman précisait déjà que « tout le monde est le bienvenu pour écrire des articles ». Et le cinquième, finalement, stipule qu’il n’y a [[w:fr:Wikipédia:Interprétation créative des règles|pas d’autres règles fixes]], une position très courante parmi les hackers dont Stallman faisait partie.
[[Fichier:L_Sanger.jpg|vignette|<small>Figure 15. Larry Sanger en 2010.</small>]]
Il apparaît donc clairement que le projet Wikipédia n'était pas une idée originale en soi, mais plutôt une opportunité saisie par la société [[w:fr:Bomis|Bomis]] pour enrichir sa propre encyclopédie commerciale, [[w:fr: Nupedia|Nupedia]]. Cette dernière avait en effet été lancée en avril 2000, soit environ dix mois avant Wikipédia, et sa rédaction était assurée par des experts engagés au sein d’un processus éditorial strict et formel<ref>{{Cite book|first1=Ned|last1=Kock|first2=Yusun|last2=Jung|first3=Thant|last3=Syn|title=Wikipedia and e-Collaboration Research: Opportunities and Challenges|journal=[[International Journal of e-Collaboration]]|volume=12|issue=2|publisher=IGI Global|date=2016|issn=1548-3681|doi=10.4018/IJeC.2016040101|url=http://cits.tamiu.edu/kock/pubs/journals/2016JournalIJeC_WikipediaEcollaboration/Kock_etal_2016_IJeC_WikipediaEcollaboration.pdf|archive-url=https://web.archive.org/web/20160927001627/https://cits.tamiu.edu/kock/pubs/journals/2016JournalIJeC_WikipediaEcollaboration/Kock_etal_2016_IJeC_WikipediaEcollaboration.pdf|archive-date=September 27, 2016|pages=1–8|author1-link=Ned Kock|url-status=live}}.</ref>. Malheureusement pour la firme Bomis, le nombre d’articles ne progressait que très lentement. Cette situation changea par la suite lorsque [[w:fr: Larry Sanger|Larry Sanger]], docteur en philosophie et rédacteur en chef de Nupedia, installa un logiciel wiki sur les serveurs de son entreprise, malgré le manque d’enthousiasme de son employeur, [[w:fr: Jimmy Wales|Jimmy Wales]]<ref>{{Lien web|langue=|auteur=|nom1=Sanger|prénom1=Larry|titre=Let's make a wiki|url=https://web.archive.org/web/20030822044513/www.nupedia.com/pipermail/nupedia-l/2001-January/000676.html|site=Nupedia-l|lieu=|date=10 janvier 2001|consulté le=}}.</ref>.
Ainsi débuta l’[[w:fr:Histoire de Wikipédia|histoire de Wikipédia]]<ref>{{Lien web|langue=|auteur=Geere Duncan|titre=Timeline:Wikipedia's history and milestones|url=http://archive.wikiwix.com/cache/index2.php?url=https://www.wired.co.uk/news/archive/2011-01/11/wikipedia-timeline|site=Wired UK|date=11 janvier 2011|consulté le=}}.</ref>. C’était le 15 janvier 2001 et précisément le même mois où Richard Stallman mis en ligne son propre projet d’encyclopédie libre et universelle qu'il souhaitait intituler [[w:fr: GNUPedia|GNUPedia]]. Mais comme les noms de domaine gnupedia .com .net et .org avaient déjà été enregistrés au nom de Jimmy Wales<ref>{{Lien web|auteur=Jimmy Wales|titre=Re: [Bug-gnupedia] gnupedia.org resolves to nupedia|url=https://web.archive.org/web/20210302175447/https://lists.gnu.org/archive/html/bug-gne/2001-01/msg00472.html|site=GNU Mailing Lists|date=21 janvier 2001|consulté le=}}.</ref>, il décida alors de rebaptiser son projet GNE. Un fait surprenant, puisque que Wales affirma plus tard<ref name="Poe">{{Lien web|langue=|auteur=Marshall Poe|titre=The Hive|url=https://web.archive.org/web/20210427075913/https://www.theatlantic.com/magazine/archive/2006/09/the-hive/305118/?single_page=true|site=The Atlantic|date=27-04-2021|consulté le=}}.</ref> : « n’avoir eu aucune connaissance directe de l’essai de Stallman lorsqu’il s’est lancé dans son projet d’encyclopédie<ref>Texte original avant sa traduction par www.deepl.com/translator : ''« had no direct knowledge of Stallman’s essay when he embarked on his encyclopedia project »''</ref> ».
Le site GNE ne ressemblait cependant pas vraiment à une encyclopédie, mais plutôt à un blog collectif<ref>{{Cite book|title=The Future of the Internet--And How to Stop It|last=Zittrain|first=Jonathan|authorlink=Jonathan Zittrain|publisher=Yale University Press|year=2008|isbn=9780300145342|pages=140|url=https://archive.org/details/futureoftheinternetandhow00zitt}}.</ref> ou une [[w:fr:Base de connaissance|base de connaissances]]<ref>{{Cite book|title=Good Faith Collaboration: The Culture of Wikipedia|last=Reagle|first=Joseph Michael|publisher=MIT Press|year=2010|isbn=9780262014472|pages=54|url=https://archive.org/details/goodfaithcol_reag_2010_000_10578531|url-access=registration}}.</ref>, tandis que la page d’accueil du projet précisait clairement qu’il s’agissait d’une bibliothèque d’opinions<ref>{{Lien web|titre=Home|url=https://web.archive.org/web/20210307060715/http://gne.sourceforge.net/eng/|date=|consulté le=|auteur=GNE}}.</ref>. Une personne a alors été engagée pour assurer la modération du projet, qui, finalement, s'est avérée plus compliquée que prévu. Pendant ce temps, et probablement en raison des spécificités de l’environnement wiki combinée à la supervision de Jimmy Wales, une organisation communautaire s'est progressivement mise en place au sein du projet Wikipédia.
[[Fichier:En_Wikipedia_Articles.png|vignette|<small>Figure 16. Évolution graphique du nombre d’articles sur Wikipédia.</small>|gauche|300x300px]]
[[Fichier:Citizendium_number_of_articles_graph.png|vignette|<small>Figure 17. Évolution graphique du nombre d’articles sur Citizendium.</small>|gauche|300x300px]]
Par la suite, et probablement en raison de la concurrence faite par le projet GNE, Jimmy Wales abandonna le copyright que Bomis détenait sur son encyclopédie, pour le remplacer par une licence Nupedia Open Content<ref>{{Ouvrage|langue=|prénom1=Andrew|nom1=Lih|titre=The Wikipedia revolution: how a bunch of nobodies created the world's greatest encyclopedia|passage=35|éditeur=Aurum|date=2010|isbn=978-1-84513-516-4|oclc=717360697|consulté le=}}.</ref>, avant d'adopter finalement la [[w:fr: Licence de documentation libre GNU|licence de documentation libre GNU]]. Ce dernier choix apparut comme une stratégie payante, puisqu'il incita Richard Stallman à transférer tout le contenu de son projet vers Nupedia, avant de fermer le site web et d'encourager les gens à contribuer sur Wikipédia<ref>{{Lien web|langue=|auteur=GNU|titre=Le projet d'encyclopédie libre|url=https://web.archive.org/web/20201031191252/http://www.gnu.org/encyclopedia/encyclopedia.fr.html|site=|date=|consulté le=}}.</ref>.
Parmi les autres actions de Jimmy Wales favorables succès de Wikipédia, figure l'ouverture du projet aux « gens ordinaires<ref>{{Lien web|langue=|auteur=Timothy|titre=The Early History of Nupedia and Wikipedia : A Memoir|url=https://web.archive.org/web/20201002023421/https://features.slashdot.org/story/05/04/18/164213/the-early-history-of-nupedia-and-wikipedia-a-memoir|site=Slashdot|lieu=|date=2005|consulté le=}}.</ref> ». C’était un choix qui s’opposait aux idéaux de Larry Sanger, qui de loin préférait le modèle de Nupedia avec son système de relecture par des experts. Sauf que pour Jimmy Wales, l’homme d’affaires, l'ouverture permettait de garantir une croissance plus rapide du contenu de l'encyclopédie<ref name="Poe" />.
Cette croissance ne s'est toutefois pas faite sans heur. Puisque le 26 février 2002, [[w:Enciclopedia_Libre_Universal_en_Español|Enciclopedia Libre Universal en Español]], un projet dissident du projet Wikipédia en espagnol fit son apparition. Ce schisme communautaire était une réaction à de la censure, l'existence d'une ligne éditoriale et la possibilité d'inclure des publicités au sein des projets Wikipédia<ref>{{Lien web|titre=Good luck with your WikiPAIDia: Reflections on the 2002 Fork of the Spanish Wikipedia|url=https://web.archive.org/web/20250927011327/https://networkcultures.org/cpov/2011/01/15/spanish_fork/|auteur1=Institute of network cultures}}</ref>. Bien que le développement du nouveau projet n'a pas empêché une croissance supérieure du projet Wikipédia, cet évènement suscita des remises en question parmi les bénévoles et du côté de Jimmy Wales, dont la plus significative fut certainement l'abandon d'une recherche de profit par l'usage de la publicité.
Par la suite, l’éclatement de la [[w:Bulle spéculative (Internet)|bulle spéculative Internet]] et des restrictions budgétaires qui suivirent le [[w:fr:Krach boursier de 2001-2002|Krach boursier de 2001-2002]], placèrent la société Bomis dans l'incapacité de payer le salaire de Sanger. En mars 2002, et après un mois d’activité bénévole, l’ex-employé de la firme décida de quitter ses fonctions au sein de Nupedia et de Wikipédia<ref>{{Lien web|auteur=Meta-Wiki|titre=My resignation|url=https://web.archive.org/web/20210226005328/https://meta.wikimedia.org/w/index.php?title=My_resignation--Larry_Sanger&oldid=23899|site=|consulté le=}}.</ref>. Avec le soutien de Jimmy Wales, les deux encyclopédies ont ainsi poursuivi leur développement conjoint, avec le concours d'experts dans Nupedia et d’une communauté bénévole dans Wikipédia. C'est ainsi que les choses se poursuivirent jusqu’en septembre 2003, où, faute de productivité et juste avant sa fermeture, le contenu de Nupedia fut transféré vers le projet Wikipédia.
Trois ans plus tard, Larry Sanger n’avait pas dit son dernier mot. Il décida de lancer en septembre 2006 et sur fonds propres, un projet analogue à Nupedia intitulée [[w:Citizendium|Citizendium]]. Il s’agissait d’une encyclopédie écrite en anglais, qui reposait sur un système d’expertise dans lequel les contributrices et les contributeurs doivent s’enregistrer sous leur identité réelle. En 2010 cependant, Citizendium ne dépassait pas les 30 000 articles, tandis que le projet Wikipédia en anglais dépassait déjà les 3 millions d’articles.
En soutenant le projet Wikipédia, Jimmy Wales a donc contribué à la construction d’une encyclopédie dont la taille et la visibilité n’avait jamais été égalée. Une encyclopédie, qui, de plus, c'est rapidement déclinée en de nombreuses versions linguistiques, telles que sa version francophone, lancée moins de quatre mois après le projet original anglophone<ref>{{Lien web|langue=|auteur=Jason Richey|titre=new language wikis|url=https://web.archive.org/web/20210131074026/https://lists.wikimedia.org/pipermail/wikipedia-l/2001-May/000116.html|site=Wikipedia-l|lieu=|date=11 mai 2001|consulté le=}}.</ref>. Toutes ces versions ont formé les premières bases d’une organisation mondiale, bientôt chapeautée par une fondation. Mais avant cela, divers projets pédagogiques et collaboratifs ont fait leur apparition au côté de Wikipédia. Intitulés « projets frères », ceux-ci se multiplièrent à leur tour, en de nombreuses versions linguistiques, tout en poursuivant le processus de création du mouvement Wikimédia.{{AutoCat}}
44v2b7aavmouhsd2snc4lt5jwddbz4v
764625
764624
2026-04-23T08:06:33Z
Lionel Scheepmans
20012
764625
wikitext
text/x-wiki
<noinclude>{{Le mouvement Wikimédia}}</noinclude>
Dans les chapitres précédents, nous avons découvert toutes les innovations techniques et culturelles sans lesquelles Wikipédia n’aurait jamais pu devenir la plus grande encyclopédie libre et universelle connue au monde. Son objectif est de synthétiser la totalité du savoir humain. Ce qui n’est autre, finalement, qu’un vieux rêve de notre humanité. Trois cents ans avant Jésus-Christ et durant la création de la bibliothèque d’Alexandrie, ce désir était aussi celui de [[w:fr: Ptolémée_Ier|Ptolémée <abbr>Iᵉʳ</abbr>]]. C'était deux siècles avant que [[w:Denis Diderot|Denis Diderot]] publie, avec [[w:Jean_Le_Rond_d'Alembert|Jean Le Rond d'Alembert]] et [[w:Louis_de_Jaucourt|Louis de]] Jaucourt en 1751, la première édition de l’''[[w:Encyclopédie ou Dictionnaire raisonné des sciences, des arts et des métiers|Encyclopédie ou Dictionnaire raisonné des sciences, des arts et des métiers]]''. Quant à [[w:fr: Paul Otlet|Paul Otlet]], qui a créé avec Henri La Fontaine la [[w:fr: Classification décimale universelle|classification décimale universelle]] en usage depuis 1905, il s’était mis en tête de répertorier l’ensemble du savoir humain au sein d'un seul édifice.
Peu connu à ce jour, ce [[w:Documentaliste|documentaliste]] belge avait pour rêve de cataloguer le monde et de rassembler toutes les connaissances humaines, sous la forme d’un gigantesque [[w:Répertoire_bibliographique_universel|répertoire bibliographique universel]], situé à l'intérieur d'un [[w:Mundaneum|Mundaneum]]<ref>{{Ouvrage|prénom1=Alex|nom1=Wright|titre=Cataloging the world : Paul Otlet and the birth of the information age|éditeur=Oxford University Press|date=2014|isbn=978-0-19-993141-5|oclc=861478071}}.</ref>. En 1934, dans le [[s:fr: Traité de documentation|''Traité de documentation'']] écrit par cet homme qui voulait « classer le monde<ref>{{Ouvrage|langue=|auteur=|prénom1=Françoise|nom1=Levie|titre=L' homme qui voulait classer le monde: Paul Otlet et le Mundaneum|passage=|lieu=|éditeur=Impressions Nouvelles|date=2008|pages totales=|isbn=978-2-87449-022-4|oclc=699650184}}.</ref> », il décrit de manière particulièrement visionnaire un possible partage du savoir et de l’information''<ref>{{ouvrage|langue=|auteur=|prénom1=Paul|nom1=Otlet|titre=[[w: fr: Traité de documentation|Traité de documentation]]|sous-titre=Le Livre sur le livre, théorie et pratique|passage=428|lieu=Bruxelles|éditeur=Editions Mundaneum|année=1934|date=|pages totales=431|isbn=}}.</ref>''.
<blockquote>
Ici, la Table de Travail n’est plus chargée d’aucun livre. À leur place se dresse un écran et à portée un téléphone. Là-bas, au loin, dans un édifice immense, sont tous les livres et tous les renseignements, avec tout l’espace que requiert leur enregistrement et leur manutention…
De là, on fait apparaître sur l’écran la page à lire pour connaître la question posée par téléphone avec ou sans fil. Un écran serait double, quadruple ou décuple s’il s’agissait de multiplier les textes et les documents à confronter simultanément ; il y aurait un haut-parleur si la vue devrait être aidée par une audition. Une telle hypothèse, un [[w:fr: H. G. Wells|Wells]] certes l’aimerait. Utopie aujourd’hui parce qu’elle n’existe encore nulle part, mais elle pourrait devenir la réalité de demain pourvu que se perfectionnent encore nos méthodes et notre instrumentation.
</blockquote>
[[Fichier:Le_Répertoire_Bibliographique_Universel_vers_1900.jpg|vignette|<small>Figure 13. Photographie de l’intérieur du Répertoire Bibliographique Universel prise aux alentours de 1900.</small>|400x400px]]
À peu de choses près, cette utopie décrite en 1934 par Otlet correspond parfaitement à l'usage que l'on fait du réseau Internet et de son espace web, lorsqu'on recherche de l'information aujourd'hui. Premièrement, allumer un système informatique, avec ou sans fil, muni d'un écran ; ensuite, poser une question dans un moteur de recherche ; puis, comme cela arrive très souvent, être redirigé vers l'une des versions linguistiques de Wikipédia<ref>{{Lien web|langue=|auteur=Alexa|titre=Wikipedia.org Competitive Analysis, Marketing Mix and Traffic|url=https://web.archive.org/web/20201002021753/https://www.alexa.com/siteinfo/wikipedia.org|site=|date=|consulté le=}}.</ref>.
Ce scénario, dans lequel les moteurs de recherche jouent un rôle central, explique la popularité de l'encyclopédie libre. D'autres projets similaires étaient pourtant apparus sur le Web avant l'arrivée de Wikipédia. Environ trois ans avant sa création, [[w:fr: Aaron Swartz|Aaron Swartz]], un activiste de la culture libre qui n'avait que douze ans à l'époque, avait par exemple lancé une sorte de site encyclopédique produit et géré par ses usagers<ref>Brian Knappenberger, {{Lien web|titre=The Internet's own boy: The Story of Aaron Swartz{{!}}The Internet's own boy: The Story of Aaron Swartz|url=https://archive.org/details/youtube-gpvcc9C8SbM|éditeur=[[w:fr:Participant Media|Participant Medi]]|année=2014|passage=6:29 - 7:31 min|Auteur1=Brian Knappenberger}}.</ref>. Appelé ''The Info Network,'' ce site web avait d'ailleurs permis à son auteur de recevoir l'''[[w:en:ArsDigita|ArsDigita]] Prize'', un prix décerné aux jeunes créateurs de projets « utiles, éducatifs, collaboratifs et non commerciaux »<ref>{{Lien web|auteur=David Amsden|titre=The Brilliant Life and Tragic Death of Aaron Swarz|url=https://web.archive.org/web/20211010013454/https://www.rollingstone.com/culture/culture-news/the-brilliant-life-and-tragic-death-of-aaron-swartz-177191/|site=Penske Media Corporation|éditeur=|date=28/02/2013|consulté le=}}.</ref>.
Il faut savoir ensuite que le concept d' « encyclopédie libre et universelle » fut formulé sur internet pour la première fois par Richard Stallman en 1998, soit un an avant la naissance de Wikipédia. C'était dans un essai intitulé ''[[metawiki:The Free Universal Encyclopedia and Learning Resource|The Free Universal Encyclopedia and Learning Resource]]''<ref>{{Lien web|auteur=Richard Stallman|titre=The Free Universal Encyclopedia and Learning Resource (1998 draft)|url=https://web.archive.org/web/20211029155052/https://www.gnu.org/encyclopedia/free-encyclopedia-1998-draft.html|site=GNU|date=2021/01/04}}.</ref>, qui, selon son auteur, avait été rédigé deux ans avant sa publication sur la liste de diffusion du projet GNU en décembre 2000<ref name="Stallman">{{Lien web|langue=|auteur=Richard Stallman|titre=The Free Universal Encyclopedia and Learning Resource|url=https://web.archive.org/web/20090201021222/http://www.gnu.org:80/encyclopedia/anencyc.txt|site=GNU|date=18 décembre 2000|consulté le=}}.</ref>. Repris ci-dessous, un extrait de ce texte, présente les particularités du projet.
<blockquote>
Le World Wide Web a le potentiel de devenir une encyclopédie universelle couvrant tous les domaines de la connaissance et une bibliothèque complète de cours d’enseignement. Ce résultat pourrait être atteint sans effort particulier, si personne n’intervient. Mais les entreprises se mobilisent aujourd’hui pour orienter l’avenir vers une voie différente, dans laquelle elles contrôlent et limitent l’accès au matériel pédagogique, afin de soutirer de l’argent aux personnes qui veulent apprendre.
Nous ne pouvons pas empêcher les entreprises de restreindre l’information qu’elles mettent à disposition ; ce que nous pouvons faire, c’est proposer une alternative. Nous devons lancer un mouvement pour développer une encyclopédie libre universelle, tout comme le mouvement des logiciels libres nous a donné le système d’exploitation libre GNU/Linux. L’encyclopédie libre fournira une alternative aux encyclopédies restreintes que les entreprises de médias rédigeront<ref>Texte original avant sa traduction par www.deepl.com/translator : ''The World Wide Web has the potential to develop into a universal encyclopedia covering all areas of knowledge, and a complete library of instructional courses. This outcome could happen without any special effort, if no one interferes. But corporations are mobilizing now to direct the future down a different track--one in which they control and restrict access to learning materials, so as to extract money from people who want to learn. […] We cannot stop business from restricting the information it makes available ; what we can do is provide an alternative. We need to launch a movement to develop a universal free encyclopedia, much as the Free Software movement gave us the free software operating system GNU/Linux. The free encyclopedia will provide an alternative to the restricted ones that media corporations will write.''</ref>.
</blockquote>
[[Fichier:Wikimania_2016_-_Press_conference_with_Jimmy_Wales_and_Katherine_Maher_01_(centred_crop).jpg|vignette|<small>Figure 14. Jimmy Wales en 2016.</small>|gauche]]
En parlant d'un « mouvement pour développer une encyclopédie libre universelle », Stallman anticipait donc, sans le savoir, l'arrivée du mouvement Wikimédia, qui ne se concrétisa que bien des années plus tard. Quant à la soixantaine de paragraphes qui décrivent son projet, on y retrouve, dans une forme presque identique, les cinq principes fondateurs qui ont guidé la création de Wikipédia et qui sont toujours actifs à ce jour<ref>{{Lien web|langue=|auteur=Wikipédia|titre=Principes fondateurs|url=https://web.archive.org/web/20230610010746/https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Principes_fondateurs|site=|date=|consulté le=}}.</ref>.
Le premier consiste bien sûr à [[w:fr:Wikipédia:Wikipédia est une encyclopédie|créer une encyclopédie]] ; le deuxième réclame une [[w:fr: wikipédia: Neutralité de point de vue|neutralité de point de vue]]<ref>{{Lien web|langue=|auteur=Wikipedia|titre=Information for "Wikipedia: Neutral point of view"|url=https://web.archive.org/web/20201115191610/https://en.wikipedia.org/w/index.php?title=Wikipedia%3ANeutral_point_of_view&action=info|site=|date=|consulté le=}}.</ref>, chose que Stallman expliquait déjà en écrivant qu’« en cas de controverse, plusieurs points de vue seront représentés » ; le troisième implique le respect des droits d’auteur et l’adoption d'une [[w:fr:Wikipédia:Droit d'auteur|licence libre]], celle précisément dont Stallman avait été l'initiateur ; le quatrième inscrit le projet dans une [[w:fr:Wikipédia:Règles de savoir-vivre|démarche collaborative]], alors que Stallman précisait déjà que « tout le monde est le bienvenu pour écrire des articles » ; et le cinquième enfin, stipule qu’il n’y a [[w:fr:Wikipédia:Interprétation créative des règles|pas d’autres règles fixes]], une position très courante dans le milieu des hackers dont Stallman faisait partie.
[[Fichier:L_Sanger.jpg|vignette|<small>Figure 15. Larry Sanger en 2010.</small>]]
Il apparaît donc clairement que le projet Wikipédia n'était pas une idée originale en soi, mais plutôt une opportunité saisie par la société [[w:fr:Bomis|Bomis]] pour enrichir sa propre encyclopédie commerciale, [[w:fr: Nupedia|Nupedia]]. Cette dernière avait été lancée en avril 2000, soit environ dix mois avant Wikipédia, et sa rédaction était assurée par des experts engagés au sein d’un processus éditorial strict et formel<ref>{{Cite book|first1=Ned|last1=Kock|first2=Yusun|last2=Jung|first3=Thant|last3=Syn|title=Wikipedia and e-Collaboration Research: Opportunities and Challenges|journal=[[International Journal of e-Collaboration]]|volume=12|issue=2|publisher=IGI Global|date=2016|issn=1548-3681|doi=10.4018/IJeC.2016040101|url=http://cits.tamiu.edu/kock/pubs/journals/2016JournalIJeC_WikipediaEcollaboration/Kock_etal_2016_IJeC_WikipediaEcollaboration.pdf|archive-url=https://web.archive.org/web/20160927001627/https://cits.tamiu.edu/kock/pubs/journals/2016JournalIJeC_WikipediaEcollaboration/Kock_etal_2016_IJeC_WikipediaEcollaboration.pdf|archive-date=September 27, 2016|pages=1–8|author1-link=Ned Kock|url-status=live}}.</ref>. Malheureusement pour la firme Bomis, le nombre d’articles ne progressait que très lentement.
Dans l'idée d'accélérer le processus, [[w:fr: Larry Sanger|Larry Sanger]], docteur en philosophie et rédacteur en chef de Nupedia, eut l'idée d'installer un logiciel wiki sur les serveurs de l'entreprise Bomis. L'idée était d'ouvrir un site web communautaire dans lequel des volontaires pourraient créer des articles encyclopédiques, pour ensuite les intégrer dans l'encyclopédie commerciale. Malgré le manque d’enthousiasme de son employeur [[w:fr: Jimmy Wales|Jimmy Wales]]<ref>{{Lien web|langue=|auteur=|nom1=Sanger|prénom1=Larry|titre=Let's make a wiki|url=https://web.archive.org/web/20030822044513/www.nupedia.com/pipermail/nupedia-l/2001-January/000676.html|site=Nupedia-l|lieu=|date=10 janvier 2001|consulté le=}}.</ref>, Sanger mit ses idées en application, et c'est ainsi que l’[[w:fr:Histoire de Wikipédia|histoire de Wikipédia]]<ref>{{Lien web|langue=|auteur=Geere Duncan|titre=Timeline:Wikipedia's history and milestones|url=http://archive.wikiwix.com/cache/index2.php?url=https://www.wired.co.uk/news/archive/2011-01/11/wikipedia-timeline|site=Wired UK|date=11 janvier 2011|consulté le=}}.</ref> commença, avec un tout premier site en anglais.
C’était le 15 janvier 2001, précisément le même mois où Richard Stallman mit en ligne son propre projet d’encyclopédie libre et universelle, qu'il souhaitait intituler [[w:fr: GNUPedia|GNUPedia]]. Étonnamment, les noms de domaine gnupedia .com .net et .org avaient déjà été enregistrés au nom de Jimmy Wales<ref>{{Lien web|auteur=Jimmy Wales|titre=Re: [Bug-gnupedia] gnupedia.org resolves to nupedia|url=https://web.archive.org/web/20210302175447/https://lists.gnu.org/archive/html/bug-gne/2001-01/msg00472.html|site=GNU Mailing Lists|date=21 janvier 2001|consulté le=}}.</ref>, ce qui obligea Stallman à rebaptiser son projet GNE. Ce fait est d'autant plus surprenant que Wales affirma des années plus tard<ref name="Poe">{{Lien web|langue=|auteur=Marshall Poe|titre=The Hive|url=https://web.archive.org/web/20210427075913/https://www.theatlantic.com/magazine/archive/2006/09/the-hive/305118/?single_page=true|site=The Atlantic|date=27-04-2021|consulté le=}}.</ref> : « n’avoir eu aucune connaissance directe de l’essai de Stallman lorsqu’il s’est lancé dans son projet d’encyclopédie »<ref>Texte original avant sa traduction par www.deepl.com/translator : ''« had no direct knowledge of Stallman’s essay when he embarked on his encyclopedia project »''</ref>.
Le site GNE ne ressemblait cependant pas vraiment à une encyclopédie, mais plutôt à un blog collectif<ref>{{Cite book|title=The Future of the Internet--And How to Stop It|last=Zittrain|first=Jonathan|authorlink=Jonathan Zittrain|publisher=Yale University Press|year=2008|isbn=9780300145342|pages=140|url=https://archive.org/details/futureoftheinternetandhow00zitt}}.</ref> ou une [[w:fr:Base de connaissance|base de connaissances]]<ref>{{Cite book|title=Good Faith Collaboration: The Culture of Wikipedia|last=Reagle|first=Joseph Michael|publisher=MIT Press|year=2010|isbn=9780262014472|pages=54|url=https://archive.org/details/goodfaithcol_reag_2010_000_10578531|url-access=registration}}.</ref>, tandis que la page d’accueil du projet précisait clairement qu’il s’agissait d’une bibliothèque d’opinions<ref>{{Lien web|titre=Home|url=https://web.archive.org/web/20210307060715/http://gne.sourceforge.net/eng/|date=|consulté le=|auteur=GNE}}.</ref>. Quant à sa modération, elle avait demandé d'engager un employé, car elle s'est avérée bien plus compliquée que prévu. À côté de cela, et probablement grâce aux spécificités de l’environnement wiki et aux soutiens apportés par Jimmy Wales et Larry Sanger, Wikipédia réussit à mettre en place une organisation efficace au sein d'une communauté d'éditeurs grandissante.
[[Fichier:En_Wikipedia_Articles.png|vignette|<small>Figure 16. Évolution graphique du nombre d’articles sur Wikipédia.</small>|gauche|300x300px]]
[[Fichier:Citizendium_number_of_articles_graph.png|vignette|<small>Figure 17. Évolution graphique du nombre d’articles sur Citizendium.</small>|gauche|300x300px]]
Peut-être en raison de la concurrence libre faite par le projet GNE, Jimmy Wales décida d'abandonner le copyright que Bomis détenait sur son encyclopédie commerciale Nupedia, pour le remplacer par une licence Nupedia Open Content<ref>{{Ouvrage|langue=|prénom1=Andrew|nom1=Lih|titre=The Wikipedia revolution: how a bunch of nobodies created the world's greatest encyclopedia|passage=35|éditeur=Aurum|date=2010|isbn=978-1-84513-516-4|oclc=717360697|consulté le=}}.</ref>. Peu de temps après, il décida finalement d'adopter la [[w:fr: Licence de documentation libre GNU|licence de documentation libre GNU]] conçue pour protéger les textes de documentation des logiciels libres. Ce dernier choix fut une stratégie payante, puisque cela incita Richard Stallman à transférer tout le contenu de son projet GNE vers Nupedia, et à encourager tout le monde à contribuer sur Wikipédia<ref>{{Lien web|langue=|auteur=GNU|titre=Le projet d'encyclopédie libre|url=https://web.archive.org/web/20201031191252/http://www.gnu.org/encyclopedia/encyclopedia.fr.html|site=|date=|consulté le=}}.</ref>.
Parmi les autres actions de Jimmy Wales qui ont contribué au succès de Wikipédia, il y eu cette idée d'ouvrir le projet aux « gens ordinaires<ref>{{Lien web|langue=|auteur=Timothy|titre=The Early History of Nupedia and Wikipedia : A Memoir|url=https://web.archive.org/web/20201002023421/https://features.slashdot.org/story/05/04/18/164213/the-early-history-of-nupedia-and-wikipedia-a-memoir|site=Slashdot|lieu=|date=2005|consulté le=}}.</ref> ». C’était un choix qui s’opposait aux idéaux de Larry Sanger, qui de loin préférait le modèle de Nupedia avec son système de relecture par des experts. Jimmy Wales, quant à lui et en tant qu'homme d’affaires, visait une croissance plus rapide du contenu de l'encyclopédie<ref name="Poe" />.
Cette croissance ne s'est toutefois pas faite sans heur. Puisque le 26 février 2002, [[w:Enciclopedia_Libre_Universal_en_Español|Enciclopedia Libre Universal en Español]], un projet dissident du projet Wikipédia en espagnol fit son apparition. Ce schisme communautaire était une réaction à de la censure, l'existence d'une ligne éditoriale et la possibilité d'inclure des publicités au sein des projets Wikipédia<ref>{{Lien web|titre=Good luck with your WikiPAIDia: Reflections on the 2002 Fork of the Spanish Wikipedia|url=https://web.archive.org/web/20250927011327/https://networkcultures.org/cpov/2011/01/15/spanish_fork/|auteur1=Institute of network cultures}}</ref>. Bien que le développement du nouveau projet n'a pas empêché une croissance supérieure du projet Wikipédia, cet évènement suscita des remises en question parmi les bénévoles et du côté de Jimmy Wales, dont la plus significative fut certainement l'abandon d'une recherche de profit par l'usage de la publicité.
Par la suite, l’éclatement de la [[w:Bulle spéculative (Internet)|bulle spéculative Internet]] et des restrictions budgétaires qui suivirent le [[w:fr:Krach boursier de 2001-2002|Krach boursier de 2001-2002]], placèrent la société Bomis dans l'incapacité de payer le salaire de Sanger. En mars 2002, et après un mois d’activité bénévole, l’ex-employé de la firme décida de quitter ses fonctions au sein de Nupedia et de Wikipédia<ref>{{Lien web|auteur=Meta-Wiki|titre=My resignation|url=https://web.archive.org/web/20210226005328/https://meta.wikimedia.org/w/index.php?title=My_resignation--Larry_Sanger&oldid=23899|site=|consulté le=}}.</ref>. Avec le soutien de Jimmy Wales, les deux encyclopédies ont ainsi poursuivi leur développement conjoint, avec le concours d'experts dans Nupedia et d’une communauté bénévole dans Wikipédia. C'est ainsi que les choses se poursuivirent jusqu’en septembre 2003, où, faute de productivité et juste avant sa fermeture, le contenu de Nupedia fut transféré vers le projet Wikipédia.
Trois ans plus tard, Larry Sanger n’avait pas dit son dernier mot. Il décida de lancer en septembre 2006 et sur fonds propres, un projet analogue à Nupedia intitulée [[w:Citizendium|Citizendium]]. Il s’agissait d’une encyclopédie écrite en anglais, qui reposait sur un système d’expertise dans lequel les contributrices et les contributeurs doivent s’enregistrer sous leur identité réelle. En 2010 cependant, Citizendium ne dépassait pas les 30 000 articles, tandis que le projet Wikipédia en anglais dépassait déjà les 3 millions d’articles.
En soutenant le projet Wikipédia, Jimmy Wales a donc contribué à la construction d’une encyclopédie dont la taille et la visibilité n’avait jamais été égalée. Une encyclopédie, qui, de plus, c'est rapidement déclinée en de nombreuses versions linguistiques, telles que sa version francophone, lancée moins de quatre mois après le projet original anglophone<ref>{{Lien web|langue=|auteur=Jason Richey|titre=new language wikis|url=https://web.archive.org/web/20210131074026/https://lists.wikimedia.org/pipermail/wikipedia-l/2001-May/000116.html|site=Wikipedia-l|lieu=|date=11 mai 2001|consulté le=}}.</ref>. Toutes ces versions ont formé les premières bases d’une organisation mondiale, bientôt chapeautée par une fondation. Mais avant cela, divers projets pédagogiques et collaboratifs ont fait leur apparition au côté de Wikipédia. Intitulés « projets frères », ceux-ci se multiplièrent à leur tour, en de nombreuses versions linguistiques, tout en poursuivant le processus de création du mouvement Wikimédia.{{AutoCat}}
r8sudw58jt5btesrww0idhigar34a94
764626
764625
2026-04-23T09:00:20Z
Lionel Scheepmans
20012
764626
wikitext
text/x-wiki
<noinclude>{{Le mouvement Wikimédia}}</noinclude>
Dans les chapitres précédents, nous avons découvert toutes les innovations techniques et culturelles sans lesquelles Wikipédia n’aurait jamais pu devenir la plus grande encyclopédie libre et universelle connue au monde. Son objectif est de synthétiser la totalité du savoir humain. Ce qui n’est autre, finalement, qu’un vieux rêve de notre humanité. Trois cents ans avant Jésus-Christ et durant la création de la bibliothèque d’Alexandrie, ce désir était aussi celui de [[w:fr: Ptolémée_Ier|Ptolémée <abbr>Iᵉʳ</abbr>]]. C'était deux siècles avant que [[w:Denis Diderot|Denis Diderot]] publie, avec [[w:Jean_Le_Rond_d'Alembert|Jean Le Rond d'Alembert]] et [[w:Louis_de_Jaucourt|Louis de]] Jaucourt en 1751, la première édition de l’''[[w:Encyclopédie ou Dictionnaire raisonné des sciences, des arts et des métiers|Encyclopédie ou Dictionnaire raisonné des sciences, des arts et des métiers]]''. Quant à [[w:fr: Paul Otlet|Paul Otlet]], qui a créé avec Henri La Fontaine la [[w:fr: Classification décimale universelle|classification décimale universelle]] en usage depuis 1905, il s’était mis en tête de répertorier l’ensemble du savoir humain au sein d'un seul édifice.
Peu connu à ce jour, ce [[w:Documentaliste|documentaliste]] belge avait pour rêve de cataloguer le monde et de rassembler toutes les connaissances humaines, sous la forme d’un gigantesque [[w:Répertoire_bibliographique_universel|répertoire bibliographique universel]], situé à l'intérieur d'un [[w:Mundaneum|Mundaneum]]<ref>{{Ouvrage|prénom1=Alex|nom1=Wright|titre=Cataloging the world : Paul Otlet and the birth of the information age|éditeur=Oxford University Press|date=2014|isbn=978-0-19-993141-5|oclc=861478071}}.</ref>. En 1934, dans le [[s:fr: Traité de documentation|''Traité de documentation'']] écrit par cet homme qui voulait « classer le monde<ref>{{Ouvrage|langue=|auteur=|prénom1=Françoise|nom1=Levie|titre=L' homme qui voulait classer le monde: Paul Otlet et le Mundaneum|passage=|lieu=|éditeur=Impressions Nouvelles|date=2008|pages totales=|isbn=978-2-87449-022-4|oclc=699650184}}.</ref> », il décrit de manière particulièrement visionnaire un possible partage du savoir et de l’information''<ref>{{ouvrage|langue=|auteur=|prénom1=Paul|nom1=Otlet|titre=[[w: fr: Traité de documentation|Traité de documentation]]|sous-titre=Le Livre sur le livre, théorie et pratique|passage=428|lieu=Bruxelles|éditeur=Editions Mundaneum|année=1934|date=|pages totales=431|isbn=}}.</ref>''.
<blockquote>
Ici, la Table de Travail n’est plus chargée d’aucun livre. À leur place se dresse un écran et à portée un téléphone. Là-bas, au loin, dans un édifice immense, sont tous les livres et tous les renseignements, avec tout l’espace que requiert leur enregistrement et leur manutention…
De là, on fait apparaître sur l’écran la page à lire pour connaître la question posée par téléphone avec ou sans fil. Un écran serait double, quadruple ou décuple s’il s’agissait de multiplier les textes et les documents à confronter simultanément ; il y aurait un haut-parleur si la vue devrait être aidée par une audition. Une telle hypothèse, un [[w:fr: H. G. Wells|Wells]] certes l’aimerait. Utopie aujourd’hui parce qu’elle n’existe encore nulle part, mais elle pourrait devenir la réalité de demain pourvu que se perfectionnent encore nos méthodes et notre instrumentation.
</blockquote>
[[Fichier:Le_Répertoire_Bibliographique_Universel_vers_1900.jpg|vignette|<small>Figure 13. Photographie de l’intérieur du Répertoire Bibliographique Universel prise aux alentours de 1900.</small>|400x400px]]
À peu de choses près, cette utopie décrite en 1934 par Otlet correspond parfaitement à l'usage que l'on fait du réseau Internet et de son espace web, lorsqu'on recherche de l'information aujourd'hui. Premièrement, allumer un système informatique, avec ou sans fil, muni d'un écran ; ensuite, poser une question dans un moteur de recherche ; puis, comme cela arrive très souvent, être redirigé vers l'une des versions linguistiques de Wikipédia<ref>{{Lien web|langue=|auteur=Alexa|titre=Wikipedia.org Competitive Analysis, Marketing Mix and Traffic|url=https://web.archive.org/web/20201002021753/https://www.alexa.com/siteinfo/wikipedia.org|site=|date=|consulté le=}}.</ref>.
Ce scénario, dans lequel les moteurs de recherche jouent un rôle central, explique la popularité de l'encyclopédie libre. D'autres projets similaires étaient pourtant apparus sur le Web avant l'arrivée de Wikipédia. Environ trois ans avant sa création, [[w:fr: Aaron Swartz|Aaron Swartz]], un activiste de la culture libre qui n'avait que douze ans à l'époque, avait par exemple lancé une sorte de site encyclopédique produit et géré par ses usagers<ref>Brian Knappenberger, {{Lien web|titre=The Internet's own boy: The Story of Aaron Swartz{{!}}The Internet's own boy: The Story of Aaron Swartz|url=https://archive.org/details/youtube-gpvcc9C8SbM|éditeur=[[w:fr:Participant Media|Participant Medi]]|année=2014|passage=6:29 - 7:31 min|Auteur1=Brian Knappenberger}}.</ref>. Appelé ''The Info Network,'' ce site web avait d'ailleurs permis à son auteur de recevoir l'''[[w:en:ArsDigita|ArsDigita]] Prize'', un prix décerné aux jeunes créateurs de projets « utiles, éducatifs, collaboratifs et non commerciaux »<ref>{{Lien web|auteur=David Amsden|titre=The Brilliant Life and Tragic Death of Aaron Swarz|url=https://web.archive.org/web/20211010013454/https://www.rollingstone.com/culture/culture-news/the-brilliant-life-and-tragic-death-of-aaron-swartz-177191/|site=Penske Media Corporation|éditeur=|date=28/02/2013|consulté le=}}.</ref>.
Il faut savoir ensuite que le concept d' « encyclopédie libre et universelle » fut formulé sur internet pour la première fois par Richard Stallman en 1998, soit un an avant la naissance de Wikipédia. C'était dans un essai intitulé ''[[metawiki:The Free Universal Encyclopedia and Learning Resource|The Free Universal Encyclopedia and Learning Resource]]''<ref>{{Lien web|auteur=Richard Stallman|titre=The Free Universal Encyclopedia and Learning Resource (1998 draft)|url=https://web.archive.org/web/20211029155052/https://www.gnu.org/encyclopedia/free-encyclopedia-1998-draft.html|site=GNU|date=2021/01/04}}.</ref>, qui, selon son auteur, avait été rédigé deux ans avant sa publication sur la liste de diffusion du projet GNU en décembre 2000<ref name="Stallman">{{Lien web|langue=|auteur=Richard Stallman|titre=The Free Universal Encyclopedia and Learning Resource|url=https://web.archive.org/web/20090201021222/http://www.gnu.org:80/encyclopedia/anencyc.txt|site=GNU|date=18 décembre 2000|consulté le=}}.</ref>. Repris ci-dessous, un extrait de ce texte, présente les particularités du projet.
<blockquote>
Le World Wide Web a le potentiel de devenir une encyclopédie universelle couvrant tous les domaines de la connaissance et une bibliothèque complète de cours d’enseignement. Ce résultat pourrait être atteint sans effort particulier, si personne n’intervient. Mais les entreprises se mobilisent aujourd’hui pour orienter l’avenir vers une voie différente, dans laquelle elles contrôlent et limitent l’accès au matériel pédagogique, afin de soutirer de l’argent aux personnes qui veulent apprendre.
Nous ne pouvons pas empêcher les entreprises de restreindre l’information qu’elles mettent à disposition ; ce que nous pouvons faire, c’est proposer une alternative. Nous devons lancer un mouvement pour développer une encyclopédie libre universelle, tout comme le mouvement des logiciels libres nous a donné le système d’exploitation libre GNU/Linux. L’encyclopédie libre fournira une alternative aux encyclopédies restreintes que les entreprises de médias rédigeront<ref>Texte original avant sa traduction par www.deepl.com/translator : ''The World Wide Web has the potential to develop into a universal encyclopedia covering all areas of knowledge, and a complete library of instructional courses. This outcome could happen without any special effort, if no one interferes. But corporations are mobilizing now to direct the future down a different track--one in which they control and restrict access to learning materials, so as to extract money from people who want to learn. […] We cannot stop business from restricting the information it makes available ; what we can do is provide an alternative. We need to launch a movement to develop a universal free encyclopedia, much as the Free Software movement gave us the free software operating system GNU/Linux. The free encyclopedia will provide an alternative to the restricted ones that media corporations will write.''</ref>.
</blockquote>
[[Fichier:Wikimania_2016_-_Press_conference_with_Jimmy_Wales_and_Katherine_Maher_01_(centred_crop).jpg|vignette|<small>Figure 14. Jimmy Wales en 2016.</small>|gauche]]
En parlant d'un « mouvement pour développer une encyclopédie libre universelle », Stallman anticipait donc, sans le savoir, l'arrivée du mouvement Wikimédia, qui ne se concrétisa que bien des années plus tard. Quant à la soixantaine de paragraphes qui décrivent son projet, on y retrouve, dans une forme presque identique, les cinq principes fondateurs qui ont guidé la création de Wikipédia et qui sont toujours actifs à ce jour<ref>{{Lien web|langue=|auteur=Wikipédia|titre=Principes fondateurs|url=https://web.archive.org/web/20230610010746/https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Principes_fondateurs|site=|date=|consulté le=}}.</ref>.
Le premier consiste bien sûr à [[w:fr:Wikipédia:Wikipédia est une encyclopédie|créer une encyclopédie]] ; le deuxième réclame une [[w:fr: wikipédia: Neutralité de point de vue|neutralité de point de vue]]<ref>{{Lien web|langue=|auteur=Wikipedia|titre=Information for "Wikipedia: Neutral point of view"|url=https://web.archive.org/web/20201115191610/https://en.wikipedia.org/w/index.php?title=Wikipedia%3ANeutral_point_of_view&action=info|site=|date=|consulté le=}}.</ref>, chose que Stallman expliquait déjà en écrivant qu’« en cas de controverse, plusieurs points de vue seront représentés » ; le troisième implique le respect des droits d’auteur et l’adoption d'une [[w:fr:Wikipédia:Droit d'auteur|licence libre]], celle précisément dont Stallman avait été l'initiateur ; le quatrième inscrit le projet dans une [[w:fr:Wikipédia:Règles de savoir-vivre|démarche collaborative]], alors que Stallman précisait déjà que « tout le monde est le bienvenu pour écrire des articles » ; et le cinquième enfin, stipule qu’il n’y a [[w:fr:Wikipédia:Interprétation créative des règles|pas d’autres règles fixes]], une position très courante dans le milieu des hackers dont Stallman faisait partie.
[[Fichier:L_Sanger.jpg|vignette|<small>Figure 15. Larry Sanger en 2010.</small>]]
Il apparaît donc clairement que le projet Wikipédia n'était pas une idée originale en soi, mais plutôt une opportunité saisie par la société [[w:fr:Bomis|Bomis]] pour enrichir sa propre encyclopédie commerciale, [[w:fr: Nupedia|Nupedia]]. Cette dernière avait été lancée en avril 2000, soit environ dix mois avant Wikipédia, et sa rédaction était assurée par des experts engagés au sein d’un processus éditorial strict et formel<ref>{{Cite book|first1=Ned|last1=Kock|first2=Yusun|last2=Jung|first3=Thant|last3=Syn|title=Wikipedia and e-Collaboration Research: Opportunities and Challenges|journal=[[International Journal of e-Collaboration]]|volume=12|issue=2|publisher=IGI Global|date=2016|issn=1548-3681|doi=10.4018/IJeC.2016040101|url=http://cits.tamiu.edu/kock/pubs/journals/2016JournalIJeC_WikipediaEcollaboration/Kock_etal_2016_IJeC_WikipediaEcollaboration.pdf|archive-url=https://web.archive.org/web/20160927001627/https://cits.tamiu.edu/kock/pubs/journals/2016JournalIJeC_WikipediaEcollaboration/Kock_etal_2016_IJeC_WikipediaEcollaboration.pdf|archive-date=September 27, 2016|pages=1–8|author1-link=Ned Kock|url-status=live}}.</ref>. Malheureusement pour la firme Bomis, le nombre d’articles ne progressait que très lentement.
Dans l'idée d'accélérer le processus, [[w:fr: Larry Sanger|Larry Sanger]], docteur en philosophie et rédacteur en chef de Nupedia, eut l'idée d'installer un logiciel wiki sur les serveurs de l'entreprise Bomis. L'idée était d'ouvrir un site web communautaire dans lequel des volontaires pourraient créer des articles encyclopédiques, pour ensuite les intégrer dans l'encyclopédie commerciale. Malgré le manque d’enthousiasme de son employeur [[w:fr: Jimmy Wales|Jimmy Wales]]<ref>{{Lien web|langue=|auteur=|nom1=Sanger|prénom1=Larry|titre=Let's make a wiki|url=https://web.archive.org/web/20030822044513/www.nupedia.com/pipermail/nupedia-l/2001-January/000676.html|site=Nupedia-l|lieu=|date=10 janvier 2001|consulté le=}}.</ref>, Sanger mit ses idées en application, et c'est ainsi que l’[[w:fr:Histoire de Wikipédia|histoire de Wikipédia]]<ref>{{Lien web|langue=|auteur=Geere Duncan|titre=Timeline:Wikipedia's history and milestones|url=http://archive.wikiwix.com/cache/index2.php?url=https://www.wired.co.uk/news/archive/2011-01/11/wikipedia-timeline|site=Wired UK|date=11 janvier 2011|consulté le=}}.</ref> commença, avec un tout premier site en anglais.
C’était le 15 janvier 2001, précisément le même mois où Richard Stallman mit en ligne son propre projet d’encyclopédie libre et universelle, qu'il souhaitait intituler [[w:fr: GNUPedia|GNUPedia]]. Étonnamment, les noms de domaine gnupedia .com .net et .org avaient déjà été enregistrés au nom de Jimmy Wales<ref>{{Lien web|auteur=Jimmy Wales|titre=Re: [Bug-gnupedia] gnupedia.org resolves to nupedia|url=https://web.archive.org/web/20210302175447/https://lists.gnu.org/archive/html/bug-gne/2001-01/msg00472.html|site=GNU Mailing Lists|date=21 janvier 2001|consulté le=}}.</ref>, ce qui obligea Stallman à rebaptiser son projet GNE. Ce fait est d'autant plus surprenant que Wales affirma des années plus tard<ref name="Poe">{{Lien web|langue=|auteur=Marshall Poe|titre=The Hive|url=https://web.archive.org/web/20210427075913/https://www.theatlantic.com/magazine/archive/2006/09/the-hive/305118/?single_page=true|site=The Atlantic|date=27-04-2021|consulté le=}}.</ref> : « n’avoir eu aucune connaissance directe de l’essai de Stallman lorsqu’il s’est lancé dans son projet d’encyclopédie »<ref>Texte original avant sa traduction par www.deepl.com/translator : ''« had no direct knowledge of Stallman’s essay when he embarked on his encyclopedia project »''</ref>.
Le site GNE ne ressemblait cependant pas vraiment à une encyclopédie, mais plutôt à un blog collectif<ref>{{Cite book|title=The Future of the Internet--And How to Stop It|last=Zittrain|first=Jonathan|authorlink=Jonathan Zittrain|publisher=Yale University Press|year=2008|isbn=9780300145342|pages=140|url=https://archive.org/details/futureoftheinternetandhow00zitt}}.</ref> ou une [[w:fr:Base de connaissance|base de connaissances]]<ref>{{Cite book|title=Good Faith Collaboration: The Culture of Wikipedia|last=Reagle|first=Joseph Michael|publisher=MIT Press|year=2010|isbn=9780262014472|pages=54|url=https://archive.org/details/goodfaithcol_reag_2010_000_10578531|url-access=registration}}.</ref>, tandis que la page d’accueil du projet précisait clairement qu’il s’agissait d’une bibliothèque d’opinions<ref>{{Lien web|titre=Home|url=https://web.archive.org/web/20210307060715/http://gne.sourceforge.net/eng/|date=|consulté le=|auteur=GNE}}.</ref>. Quant à sa modération, elle avait demandé d'engager un employé, car elle s'est avérée bien plus compliquée que prévu. À côté de cela, et probablement grâce aux spécificités de l’environnement wiki et aux soutiens apportés par Jimmy Wales et Larry Sanger, Wikipédia réussit à mettre en place une organisation efficace au sein d'une communauté d'éditeurs grandissante.
[[Fichier:En_Wikipedia_Articles.png|vignette|<small>Figure 16. Évolution graphique du nombre d’articles sur Wikipédia.</small>|gauche|300x300px]]
[[Fichier:Citizendium_number_of_articles_graph.png|vignette|<small>Figure 17. Évolution graphique du nombre d’articles sur Citizendium.</small>|gauche|300x300px]]
Peut-être en raison de la concurrence libre faite par le projet GNE, Jimmy Wales décida d'abandonner le copyright que Bomis détenait sur son encyclopédie commerciale Nupedia, pour le remplacer par une licence Nupedia Open Content<ref>{{Ouvrage|langue=|prénom1=Andrew|nom1=Lih|titre=The Wikipedia revolution: how a bunch of nobodies created the world's greatest encyclopedia|passage=35|éditeur=Aurum|date=2010|isbn=978-1-84513-516-4|oclc=717360697|consulté le=}}.</ref>. Peu de temps après, il décida finalement d'adopter la [[w:fr: Licence de documentation libre GNU|licence de documentation libre GNU]] conçue pour protéger les textes de documentation des logiciels libres. Ce dernier choix fut une stratégie payante, puisque cela incita Richard Stallman à transférer tout le contenu de son projet GNE vers Nupedia, et à encourager tout le monde à contribuer sur Wikipédia<ref>{{Lien web|langue=|auteur=GNU|titre=Le projet d'encyclopédie libre|url=https://web.archive.org/web/20201031191252/http://www.gnu.org/encyclopedia/encyclopedia.fr.html|site=|date=|consulté le=}}.</ref>.
Parmi les autres actions de Jimmy Wales qui ont contribué au succès de Wikipédia, il y eu cette idée d'ouvrir le projet aux « gens ordinaires<ref>{{Lien web|langue=|auteur=Timothy|titre=The Early History of Nupedia and Wikipedia : A Memoir|url=https://web.archive.org/web/20201002023421/https://features.slashdot.org/story/05/04/18/164213/the-early-history-of-nupedia-and-wikipedia-a-memoir|site=Slashdot|lieu=|date=2005|consulté le=}}.</ref> ». C’était un choix qui s’opposait aux idéaux de Larry Sanger, qui de loin préférait le modèle de Nupedia avec son système de relecture par des experts. Cependant, Jimmy Wales, en tant qu'homme d’affaires, visait une croissance plus rapide du contenu de l'encyclopédie<ref name="Poe" />.
Cette croissance ne s'est toutefois pas faite sans difficulté. Le 26 février 2002 en effet, l'[[w:Enciclopedia_Libre_Universal_en_Español|Enciclopedia Libre Universal en Español]], un projet dissident du projet Wikipédia, fit son apparition. Ce choix communautaire était une réaction à de la censure, l'existence d'une ligne éditoriale et la possibilité d'inclure des publicités au sein des projets Wikipédia<ref>{{Lien web|titre=Good luck with your WikiPAIDia: Reflections on the 2002 Fork of the Spanish Wikipedia|url=https://web.archive.org/web/20250927011327/https://networkcultures.org/cpov/2011/01/15/spanish_fork/|auteur1=Institute of network cultures}}</ref>. Cet évènement suscita beaucoup de remises en question parmi les bénévoles actif dans le projet et Jimmy Wales renonça finalement à l'usage de la publicité qui réduisait fortement ses visions en matière de recherche de profit.
Cet évènement est survenu en plein éclatement de la [[w:Bulle spéculative (Internet)|bulle spéculative Internet]] et du [[w:fr:Krach boursier de 2001-2002|Krach boursier de 2001-2002]], qui plaçaient la société Bomis dans des difficultés financières et dans l'incapacité de payer le salaire de son employé Larry Sanger. En mars 2002, et après un mois d’activité bénévole, l’ex-employé décida alors de quitter les fonctions qu'il occupait au sein de Nupedia et de Wikipédia<ref>{{Lien web|auteur=Meta-Wiki|titre=My resignation|url=https://web.archive.org/web/20210226005328/https://meta.wikimedia.org/w/index.php?title=My_resignation--Larry_Sanger&oldid=23899|site=|consulté le=}}.</ref>. Avec le seul soutien de Jimmy Wales, les deux encyclopédies purent toutefois poursuivre leurs développements, toujours avec le concours d'experts dans Nupedia et d'une communauté bénévole au niveau de Wikipédia. Cependant, en septembre 2003, vu l'écart qui se creusait entre les deux projets, l'encyclopédie Nupedia fut fermée, et ses quelques dizaines d'articles transférés vers les milliers d'autres que comprenait déjà le projet Wikipédia.
Trois ans plus tard, Larry Sanger n’avait pas dit son dernier mot. En septembre 2006, il décida en effet de lancer sur fonds propres une encyclopédie intitulée [[w:Citizendium|Citizendium]]. Cette plateforme écrite en anglais uniquement et toujours active à ce jour, repose sur un système d’expertise, dans lequel les contributrices et les contributeurs doivent déclarer leur identité réelle. En avril 2026 cependant, Citizendium reprenait moins de 2000 articles<ref>{{Lien web|url=https://web.archive.org/web/20260414234905/https://www.citizendium.org/|titre=Welcome to Cityzendium|auteur=Cityzendium}}</ref>, tout avancement confondu, tandis que le projet Wikipédia en anglais en regroupait déjà plus de 7 millions.
En soutenant le projet Wikipédia, Jimmy Wales a donc contribué à la construction d’une encyclopédie dont la taille et la visibilité n’avait jamais été égalée. Une encyclopédie, qui, de plus, c'est rapidement déclinée en de nombreuses versions linguistiques, telles que sa version francophone, lancée moins de quatre mois après le projet original anglophone<ref>{{Lien web|langue=|auteur=Jason Richey|titre=new language wikis|url=https://web.archive.org/web/20210131074026/https://lists.wikimedia.org/pipermail/wikipedia-l/2001-May/000116.html|site=Wikipedia-l|lieu=|date=11 mai 2001|consulté le=}}.</ref>. Toutes ces versions ont formé les premières bases d’une organisation mondiale, bientôt chapeautée par une fondation. Mais avant cela, divers projets pédagogiques et collaboratifs ont fait leur apparition au côté de Wikipédia. Intitulés « projets frères », ceux-ci se multiplièrent à leur tour, en de nombreuses versions linguistiques, tout en poursuivant le processus de création du mouvement Wikimédia.{{AutoCat}}
tkfgiq9iym64hh5dcev7e3wadlisvb4
764627
764626
2026-04-23T09:09:31Z
Lionel Scheepmans
20012
764627
wikitext
text/x-wiki
<noinclude>{{Le mouvement Wikimédia}}</noinclude>
Dans les chapitres précédents, nous avons découvert toutes les innovations techniques et culturelles sans lesquelles Wikipédia n’aurait jamais pu devenir la plus grande encyclopédie libre et universelle connue au monde. Son objectif est de synthétiser la totalité du savoir humain. Ce qui n’est autre, finalement, qu’un vieux rêve de notre humanité. Trois cents ans avant Jésus-Christ et durant la création de la bibliothèque d’Alexandrie, ce désir était aussi celui de [[w:fr: Ptolémée_Ier|Ptolémée <abbr>Iᵉʳ</abbr>]]. C'était deux siècles avant que [[w:Denis Diderot|Denis Diderot]] publie, avec [[w:Jean_Le_Rond_d'Alembert|Jean Le Rond d'Alembert]] et [[w:Louis_de_Jaucourt|Louis de]] Jaucourt en 1751, la première édition de l’''[[w:Encyclopédie ou Dictionnaire raisonné des sciences, des arts et des métiers|Encyclopédie ou Dictionnaire raisonné des sciences, des arts et des métiers]]''. Quant à [[w:fr: Paul Otlet|Paul Otlet]], qui a créé avec Henri La Fontaine la [[w:fr: Classification décimale universelle|classification décimale universelle]] en usage depuis 1905, il s’était mis en tête de répertorier l’ensemble du savoir humain au sein d'un seul édifice.
Peu connu à ce jour, ce [[w:Documentaliste|documentaliste]] belge avait pour rêve de cataloguer le monde et de rassembler toutes les connaissances humaines, sous la forme d’un gigantesque [[w:Répertoire_bibliographique_universel|répertoire bibliographique universel]], situé à l'intérieur d'un [[w:Mundaneum|Mundaneum]]<ref>{{Ouvrage|prénom1=Alex|nom1=Wright|titre=Cataloging the world : Paul Otlet and the birth of the information age|éditeur=Oxford University Press|date=2014|isbn=978-0-19-993141-5|oclc=861478071}}.</ref>. En 1934, dans le [[s:fr: Traité de documentation|''Traité de documentation'']] écrit par cet homme qui voulait « classer le monde<ref>{{Ouvrage|langue=|auteur=|prénom1=Françoise|nom1=Levie|titre=L' homme qui voulait classer le monde: Paul Otlet et le Mundaneum|passage=|lieu=|éditeur=Impressions Nouvelles|date=2008|pages totales=|isbn=978-2-87449-022-4|oclc=699650184}}.</ref> », il décrit de manière particulièrement visionnaire un possible partage du savoir et de l’information''<ref>{{ouvrage|langue=|auteur=|prénom1=Paul|nom1=Otlet|titre=[[w: fr: Traité de documentation|Traité de documentation]]|sous-titre=Le Livre sur le livre, théorie et pratique|passage=428|lieu=Bruxelles|éditeur=Editions Mundaneum|année=1934|date=|pages totales=431|isbn=}}.</ref>''.
<blockquote>
Ici, la Table de Travail n’est plus chargée d’aucun livre. À leur place se dresse un écran et à portée un téléphone. Là-bas, au loin, dans un édifice immense, sont tous les livres et tous les renseignements, avec tout l’espace que requiert leur enregistrement et leur manutention…
De là, on fait apparaître sur l’écran la page à lire pour connaître la question posée par téléphone avec ou sans fil. Un écran serait double, quadruple ou décuple s’il s’agissait de multiplier les textes et les documents à confronter simultanément ; il y aurait un haut-parleur si la vue devrait être aidée par une audition. Une telle hypothèse, un [[w:fr: H. G. Wells|Wells]] certes l’aimerait. Utopie aujourd’hui parce qu’elle n’existe encore nulle part, mais elle pourrait devenir la réalité de demain pourvu que se perfectionnent encore nos méthodes et notre instrumentation.
</blockquote>
[[Fichier:Le_Répertoire_Bibliographique_Universel_vers_1900.jpg|vignette|<small>Figure 13. Photographie de l’intérieur du Répertoire Bibliographique Universel prise aux alentours de 1900.</small>|400x400px]]
À peu de choses près, cette utopie décrite en 1934 par Otlet correspond parfaitement à l'usage que l'on fait du réseau Internet et de son espace web, lorsqu'on recherche de l'information aujourd'hui. Premièrement, allumer un système informatique, avec ou sans fil, muni d'un écran ; ensuite, poser une question dans un moteur de recherche ; puis, comme cela arrive très souvent, être redirigé vers l'une des versions linguistiques de Wikipédia<ref>{{Lien web|langue=|auteur=Alexa|titre=Wikipedia.org Competitive Analysis, Marketing Mix and Traffic|url=https://web.archive.org/web/20201002021753/https://www.alexa.com/siteinfo/wikipedia.org|site=|date=|consulté le=}}.</ref>.
Ce scénario, dans lequel les moteurs de recherche jouent un rôle central, explique la popularité de l'encyclopédie libre. D'autres projets similaires étaient pourtant apparus sur le Web avant l'arrivée de Wikipédia. Environ trois ans avant sa création, [[w:fr: Aaron Swartz|Aaron Swartz]], un activiste de la culture libre qui n'avait que douze ans à l'époque, avait par exemple lancé une sorte de site encyclopédique produit et géré par ses usagers<ref>Brian Knappenberger, {{Lien web|titre=The Internet's own boy: The Story of Aaron Swartz{{!}}The Internet's own boy: The Story of Aaron Swartz|url=https://archive.org/details/youtube-gpvcc9C8SbM|éditeur=[[w:fr:Participant Media|Participant Medi]]|année=2014|passage=6:29 - 7:31 min|Auteur1=Brian Knappenberger}}.</ref>. Appelé ''The Info Network,'' ce site web avait d'ailleurs permis à son auteur de recevoir l'''[[w:en:ArsDigita|ArsDigita]] Prize'', un prix décerné aux jeunes créateurs de projets « utiles, éducatifs, collaboratifs et non commerciaux »<ref>{{Lien web|auteur=David Amsden|titre=The Brilliant Life and Tragic Death of Aaron Swarz|url=https://web.archive.org/web/20211010013454/https://www.rollingstone.com/culture/culture-news/the-brilliant-life-and-tragic-death-of-aaron-swartz-177191/|site=Penske Media Corporation|éditeur=|date=28/02/2013|consulté le=}}.</ref>.
Il faut savoir ensuite que le concept d' « encyclopédie libre et universelle » fut formulé sur internet pour la première fois par Richard Stallman en 1998, soit un an avant la naissance de Wikipédia. C'était dans un essai intitulé ''[[metawiki:The Free Universal Encyclopedia and Learning Resource|The Free Universal Encyclopedia and Learning Resource]]''<ref>{{Lien web|auteur=Richard Stallman|titre=The Free Universal Encyclopedia and Learning Resource (1998 draft)|url=https://web.archive.org/web/20211029155052/https://www.gnu.org/encyclopedia/free-encyclopedia-1998-draft.html|site=GNU|date=2021/01/04}}.</ref>, qui, selon son auteur, avait été rédigé deux ans avant sa publication sur la liste de diffusion du projet GNU en décembre 2000<ref name="Stallman">{{Lien web|langue=|auteur=Richard Stallman|titre=The Free Universal Encyclopedia and Learning Resource|url=https://web.archive.org/web/20090201021222/http://www.gnu.org:80/encyclopedia/anencyc.txt|site=GNU|date=18 décembre 2000|consulté le=}}.</ref>. Repris ci-dessous, un extrait de ce texte, présente les particularités du projet.
<blockquote>
Le World Wide Web a le potentiel de devenir une encyclopédie universelle couvrant tous les domaines de la connaissance et une bibliothèque complète de cours d’enseignement. Ce résultat pourrait être atteint sans effort particulier, si personne n’intervient. Mais les entreprises se mobilisent aujourd’hui pour orienter l’avenir vers une voie différente, dans laquelle elles contrôlent et limitent l’accès au matériel pédagogique, afin de soutirer de l’argent aux personnes qui veulent apprendre.
Nous ne pouvons pas empêcher les entreprises de restreindre l’information qu’elles mettent à disposition ; ce que nous pouvons faire, c’est proposer une alternative. Nous devons lancer un mouvement pour développer une encyclopédie libre universelle, tout comme le mouvement des logiciels libres nous a donné le système d’exploitation libre GNU/Linux. L’encyclopédie libre fournira une alternative aux encyclopédies restreintes que les entreprises de médias rédigeront<ref>Texte original avant sa traduction par www.deepl.com/translator : ''The World Wide Web has the potential to develop into a universal encyclopedia covering all areas of knowledge, and a complete library of instructional courses. This outcome could happen without any special effort, if no one interferes. But corporations are mobilizing now to direct the future down a different track--one in which they control and restrict access to learning materials, so as to extract money from people who want to learn. […] We cannot stop business from restricting the information it makes available ; what we can do is provide an alternative. We need to launch a movement to develop a universal free encyclopedia, much as the Free Software movement gave us the free software operating system GNU/Linux. The free encyclopedia will provide an alternative to the restricted ones that media corporations will write.''</ref>.
</blockquote>
[[Fichier:Wikimania_2016_-_Press_conference_with_Jimmy_Wales_and_Katherine_Maher_01_(centred_crop).jpg|vignette|<small>Figure 14. Jimmy Wales en 2016.</small>|gauche]]
En parlant d'un « mouvement pour développer une encyclopédie libre universelle », Stallman anticipait donc, sans le savoir, l'arrivée du mouvement Wikimédia, qui ne se concrétisa que bien des années plus tard. Quant à la soixantaine de paragraphes qui décrivent son projet, on y retrouve, dans une forme presque identique, les cinq principes fondateurs qui ont guidé la création de Wikipédia et qui sont toujours actifs à ce jour<ref>{{Lien web|langue=|auteur=Wikipédia|titre=Principes fondateurs|url=https://web.archive.org/web/20230610010746/https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Principes_fondateurs|site=|date=|consulté le=}}.</ref>.
Le premier consiste bien sûr à [[w:fr:Wikipédia:Wikipédia est une encyclopédie|créer une encyclopédie]] ; le deuxième réclame une [[w:fr: wikipédia: Neutralité de point de vue|neutralité de point de vue]]<ref>{{Lien web|langue=|auteur=Wikipedia|titre=Information for "Wikipedia: Neutral point of view"|url=https://web.archive.org/web/20201115191610/https://en.wikipedia.org/w/index.php?title=Wikipedia%3ANeutral_point_of_view&action=info|site=|date=|consulté le=}}.</ref>, chose que Stallman expliquait déjà en écrivant qu’« en cas de controverse, plusieurs points de vue seront représentés » ; le troisième implique le respect des droits d’auteur et l’adoption d'une [[w:fr:Wikipédia:Droit d'auteur|licence libre]], celle précisément dont Stallman avait été l'initiateur ; le quatrième inscrit le projet dans une [[w:fr:Wikipédia:Règles de savoir-vivre|démarche collaborative]], alors que Stallman précisait déjà que « tout le monde est le bienvenu pour écrire des articles » ; et le cinquième enfin, stipule qu’il n’y a [[w:fr:Wikipédia:Interprétation créative des règles|pas d’autres règles fixes]], une position très courante dans le milieu des hackers dont Stallman faisait partie.
[[Fichier:L_Sanger.jpg|vignette|<small>Figure 15. Larry Sanger en 2010.</small>]]
Il apparaît donc clairement que le projet Wikipédia n'était pas une idée originale en soi, mais plutôt une opportunité saisie par la société [[w:fr:Bomis|Bomis]] pour enrichir sa propre encyclopédie commerciale, [[w:fr: Nupedia|Nupedia]]. Cette dernière avait été lancée en avril 2000, soit environ dix mois avant Wikipédia, et sa rédaction était assurée par des experts engagés au sein d’un processus éditorial strict et formel<ref>{{Cite book|first1=Ned|last1=Kock|first2=Yusun|last2=Jung|first3=Thant|last3=Syn|title=Wikipedia and e-Collaboration Research: Opportunities and Challenges|journal=[[International Journal of e-Collaboration]]|volume=12|issue=2|publisher=IGI Global|date=2016|issn=1548-3681|doi=10.4018/IJeC.2016040101|url=http://cits.tamiu.edu/kock/pubs/journals/2016JournalIJeC_WikipediaEcollaboration/Kock_etal_2016_IJeC_WikipediaEcollaboration.pdf|archive-url=https://web.archive.org/web/20160927001627/https://cits.tamiu.edu/kock/pubs/journals/2016JournalIJeC_WikipediaEcollaboration/Kock_etal_2016_IJeC_WikipediaEcollaboration.pdf|archive-date=September 27, 2016|pages=1–8|author1-link=Ned Kock|url-status=live}}.</ref>. Malheureusement pour la firme Bomis, le nombre d’articles ne progressait que très lentement.
Dans l'idée d'accélérer le processus, [[w:fr: Larry Sanger|Larry Sanger]], docteur en philosophie et rédacteur en chef de Nupedia, eut l'idée d'installer un logiciel wiki sur les serveurs de l'entreprise Bomis. L'idée était d'ouvrir un site web communautaire dans lequel des volontaires pourraient créer des articles encyclopédiques, pour ensuite les intégrer dans l'encyclopédie commerciale. Malgré le manque d’enthousiasme de son employeur [[w:fr: Jimmy Wales|Jimmy Wales]]<ref>{{Lien web|langue=|auteur=|nom1=Sanger|prénom1=Larry|titre=Let's make a wiki|url=https://web.archive.org/web/20030822044513/www.nupedia.com/pipermail/nupedia-l/2001-January/000676.html|site=Nupedia-l|lieu=|date=10 janvier 2001|consulté le=}}.</ref>, Sanger mit ses idées en application, et c'est ainsi que l’[[w:fr:Histoire de Wikipédia|histoire de Wikipédia]]<ref>{{Lien web|langue=|auteur=Geere Duncan|titre=Timeline:Wikipedia's history and milestones|url=http://archive.wikiwix.com/cache/index2.php?url=https://www.wired.co.uk/news/archive/2011-01/11/wikipedia-timeline|site=Wired UK|date=11 janvier 2011|consulté le=}}.</ref> commença, avec un tout premier site en anglais.
C’était le 15 janvier 2001, précisément le même mois où Richard Stallman mit en ligne son propre projet d’encyclopédie libre et universelle, qu'il souhaitait intituler [[w:fr: GNUPedia|GNUPedia]]. Étonnamment, les noms de domaine gnupedia .com .net et .org avaient déjà été enregistrés au nom de Jimmy Wales<ref>{{Lien web|auteur=Jimmy Wales|titre=Re: [Bug-gnupedia] gnupedia.org resolves to nupedia|url=https://web.archive.org/web/20210302175447/https://lists.gnu.org/archive/html/bug-gne/2001-01/msg00472.html|site=GNU Mailing Lists|date=21 janvier 2001|consulté le=}}.</ref>, ce qui obligea Stallman à rebaptiser son projet GNE. Ce fait est d'autant plus surprenant que Wales affirma des années plus tard<ref name="Poe">{{Lien web|langue=|auteur=Marshall Poe|titre=The Hive|url=https://web.archive.org/web/20210427075913/https://www.theatlantic.com/magazine/archive/2006/09/the-hive/305118/?single_page=true|site=The Atlantic|date=27-04-2021|consulté le=}}.</ref> : « n’avoir eu aucune connaissance directe de l’essai de Stallman lorsqu’il s’est lancé dans son projet d’encyclopédie »<ref>Texte original avant sa traduction par www.deepl.com/translator : ''« had no direct knowledge of Stallman’s essay when he embarked on his encyclopedia project »''</ref>.
Le site GNE ne ressemblait cependant pas vraiment à une encyclopédie, mais plutôt à un blog collectif<ref>{{Cite book|title=The Future of the Internet--And How to Stop It|last=Zittrain|first=Jonathan|authorlink=Jonathan Zittrain|publisher=Yale University Press|year=2008|isbn=9780300145342|pages=140|url=https://archive.org/details/futureoftheinternetandhow00zitt}}.</ref> ou une [[w:fr:Base de connaissance|base de connaissances]]<ref>{{Cite book|title=Good Faith Collaboration: The Culture of Wikipedia|last=Reagle|first=Joseph Michael|publisher=MIT Press|year=2010|isbn=9780262014472|pages=54|url=https://archive.org/details/goodfaithcol_reag_2010_000_10578531|url-access=registration}}.</ref>, tandis que la page d’accueil du projet précisait clairement qu’il s’agissait d’une bibliothèque d’opinions<ref>{{Lien web|titre=Home|url=https://web.archive.org/web/20210307060715/http://gne.sourceforge.net/eng/|date=|consulté le=|auteur=GNE}}.</ref>. Quant à sa modération, elle avait demandé d'engager un employé, car elle s'est avérée bien plus compliquée que prévu. À côté de cela, et probablement grâce aux spécificités de l’environnement wiki et aux soutiens apportés par Jimmy Wales et Larry Sanger, Wikipédia réussit à mettre en place une organisation efficace au sein d'une communauté d'éditeurs grandissante.
[[Fichier:En_Wikipedia_Articles.png|vignette|<small>Figure 16. Évolution graphique du nombre d’articles sur Wikipédia.</small>|gauche|300x300px]]
[[Fichier:Citizendium_number_of_articles_graph.png|vignette|<small>Figure 17. Évolution graphique du nombre d’articles sur Citizendium.</small>|gauche|300x300px]]
Peut-être en raison de la concurrence libre faite par le projet GNE, Jimmy Wales décida d'abandonner le copyright que Bomis détenait sur son encyclopédie commerciale Nupedia, pour le remplacer par une licence Nupedia Open Content<ref>{{Ouvrage|langue=|prénom1=Andrew|nom1=Lih|titre=The Wikipedia revolution: how a bunch of nobodies created the world's greatest encyclopedia|passage=35|éditeur=Aurum|date=2010|isbn=978-1-84513-516-4|oclc=717360697|consulté le=}}.</ref>. Peu de temps après, il décida finalement d'adopter la [[w:fr: Licence de documentation libre GNU|licence de documentation libre GNU]] conçue pour protéger les textes de documentation des logiciels libres. Ce dernier choix fut une stratégie payante, puisque cela incita Richard Stallman à transférer tout le contenu de son projet GNE vers Nupedia, et à encourager tout le monde à contribuer sur Wikipédia<ref>{{Lien web|langue=|auteur=GNU|titre=Le projet d'encyclopédie libre|url=https://web.archive.org/web/20201031191252/http://www.gnu.org/encyclopedia/encyclopedia.fr.html|site=|date=|consulté le=}}.</ref>.
Parmi les autres actions de Jimmy Wales qui ont contribué au succès de Wikipédia, il y eu cette idée d'ouvrir le projet aux « gens ordinaires<ref>{{Lien web|langue=|auteur=Timothy|titre=The Early History of Nupedia and Wikipedia : A Memoir|url=https://web.archive.org/web/20201002023421/https://features.slashdot.org/story/05/04/18/164213/the-early-history-of-nupedia-and-wikipedia-a-memoir|site=Slashdot|lieu=|date=2005|consulté le=}}.</ref> ». C’était un choix qui s’opposait aux idéaux de Larry Sanger, qui de loin préférait le modèle de Nupedia avec son système de relecture par des experts. Cependant, Jimmy Wales, en tant qu'homme d’affaires, visait une croissance plus rapide du contenu de l'encyclopédie<ref name="Poe" />.
Cette croissance ne s'est toutefois pas faite sans difficulté. Le 26 février 2002 en effet, l'[[w:Enciclopedia_Libre_Universal_en_Español|Enciclopedia Libre Universal en Español]], un projet dissident du projet Wikipédia, fit son apparition. Ce choix communautaire était une réaction à de la censure, l'existence d'une ligne éditoriale et la possibilité d'inclure des publicités au sein des projets Wikipédia<ref>{{Lien web|titre=Good luck with your WikiPAIDia: Reflections on the 2002 Fork of the Spanish Wikipedia|url=https://web.archive.org/web/20250927011327/https://networkcultures.org/cpov/2011/01/15/spanish_fork/|auteur1=Institute of network cultures}}</ref>. Cet évènement suscita beaucoup de remises en question parmi les bénévoles actif dans le projet et Jimmy Wales renonça finalement à l'usage de la publicité qui réduisait fortement ses visions en matière de recherche de profit.
Cet évènement est survenu en plein éclatement de la [[w:Bulle spéculative (Internet)|bulle spéculative Internet]] et du [[w:fr:Krach boursier de 2001-2002|Krach boursier de 2001-2002]], qui plaçaient la société Bomis dans des difficultés financières et dans l'incapacité de payer le salaire de son employé Larry Sanger. En mars 2002, et après un mois d’activité bénévole, l’ex-employé décida alors de quitter les fonctions qu'il occupait au sein de Nupedia et de Wikipédia<ref>{{Lien web|auteur=Meta-Wiki|titre=My resignation|url=https://web.archive.org/web/20210226005328/https://meta.wikimedia.org/w/index.php?title=My_resignation--Larry_Sanger&oldid=23899|site=|consulté le=}}.</ref>. Avec le seul soutien de Jimmy Wales, les deux encyclopédies purent toutefois poursuivre leurs développements, toujours avec le concours d'experts dans Nupedia et d'une communauté bénévole au niveau de Wikipédia. Cependant, en septembre 2003, vu l'écart qui se creusait entre les deux projets, l'encyclopédie Nupedia fut fermée, et ses quelques dizaines d'articles transférés vers les milliers d'autres que comprenait déjà le projet Wikipédia.
Trois ans plus tard, Larry Sanger n’avait pas dit son dernier mot. En septembre 2006, il décida en effet de lancer sur fonds propres une encyclopédie intitulée [[w:Citizendium|Citizendium]]. Cette plateforme écrite en anglais uniquement et toujours active à ce jour, repose sur un système d’expertise, dans lequel les contributrices et les contributeurs doivent déclarer leur identité réelle. En avril 2026 cependant, Citizendium reprenait moins de 2000 articles<ref>{{Lien web|url=https://web.archive.org/web/20260414234905/https://www.citizendium.org/|titre=Welcome to Cityzendium|auteur=Cityzendium}}</ref>, tout avancement confondu, tandis que le projet Wikipédia en anglais en regroupait déjà plus de 7 millions{{Lien web|url=https://web.archive.org/web/20260423065306/https://en.wikipedia.org/wiki/Main_Page|titre=Welcome to Wikipedia|auteur=Wikipedia}}
En soutenant le projet Wikipédia, Jimmy Wales a donc contribué à la construction d’une encyclopédie dont la taille et la visibilité n'avaient jamais été égalées. Une encyclopédie qui, de plus, s'est rapidement déclinée en de nombreuses versions linguistiques, à l'instar de sa version francophone, lancée moins de quatre mois après le projet original en anglais<ref>{{Lien web|langue=|auteur=Jason Richey|titre=new language wikis|url=https://web.archive.org/web/20210131074026/https://lists.wikimedia.org/pipermail/wikipedia-l/2001-May/000116.html|site=Wikipedia-l|lieu=|date=11 mai 2001|consulté le=}}.</ref>. Toutes ces versions ont formé les premières bases d’une organisation mondiale, bientôt chapeautée par une fondation. Avant cela, d'autres projets pédagogiques et collaboratifs ont vu le jour au côté de Wikipédia. Intitulés « projets frères », ceux-ci se constituent à leur tour, en de nombreuses versions linguistiques, tout en poursuivant le processus de création du mouvement Wikimédia.{{AutoCat}}
ouu6nkksn3yaqk1hm4o97ndkckqup2d
764628
764627
2026-04-23T09:15:40Z
Lionel Scheepmans
20012
764628
wikitext
text/x-wiki
<noinclude>{{Le mouvement Wikimédia}}</noinclude>
Dans les chapitres précédents, nous avons découvert toutes les innovations techniques et culturelles sans lesquelles Wikipédia n’aurait jamais pu devenir la plus grande encyclopédie libre et universelle connue au monde. Son objectif est de synthétiser la totalité du savoir humain. Ce qui n’est autre, finalement, qu’un vieux rêve de notre humanité. Trois cents ans avant Jésus-Christ et durant la création de la bibliothèque d’Alexandrie, ce désir était aussi celui de [[w:fr: Ptolémée_Ier|Ptolémée <abbr>Iᵉʳ</abbr>]]. C'était deux siècles avant que [[w:Denis Diderot|Denis Diderot]] publie, avec [[w:Jean_Le_Rond_d'Alembert|Jean Le Rond d'Alembert]] et [[w:Louis_de_Jaucourt|Louis de]] Jaucourt en 1751, la première édition de l’''[[w:Encyclopédie ou Dictionnaire raisonné des sciences, des arts et des métiers|Encyclopédie ou Dictionnaire raisonné des sciences, des arts et des métiers]]''. Quant à [[w:fr: Paul Otlet|Paul Otlet]], qui a créé avec Henri La Fontaine la [[w:fr: Classification décimale universelle|classification décimale universelle]] en usage depuis 1905, il s’était mis en tête de répertorier l’ensemble du savoir humain au sein d'un seul édifice.
Peu connu à ce jour, ce [[w:Documentaliste|documentaliste]] belge avait pour rêve de cataloguer le monde et de rassembler toutes les connaissances humaines, sous la forme d’un gigantesque [[w:Répertoire_bibliographique_universel|répertoire bibliographique universel]], situé à l'intérieur d'un [[w:Mundaneum|Mundaneum]]<ref>{{Ouvrage|prénom1=Alex|nom1=Wright|titre=Cataloging the world : Paul Otlet and the birth of the information age|éditeur=Oxford University Press|date=2014|isbn=978-0-19-993141-5|oclc=861478071}}.</ref>. En 1934, dans le [[s:fr: Traité de documentation|''Traité de documentation'']] écrit par cet homme qui voulait « classer le monde<ref>{{Ouvrage|langue=|auteur=|prénom1=Françoise|nom1=Levie|titre=L' homme qui voulait classer le monde: Paul Otlet et le Mundaneum|passage=|lieu=|éditeur=Impressions Nouvelles|date=2008|pages totales=|isbn=978-2-87449-022-4|oclc=699650184}}.</ref> », il décrit de manière particulièrement visionnaire un possible partage du savoir et de l’information''<ref>{{ouvrage|langue=|auteur=|prénom1=Paul|nom1=Otlet|titre=[[w: fr: Traité de documentation|Traité de documentation]]|sous-titre=Le Livre sur le livre, théorie et pratique|passage=428|lieu=Bruxelles|éditeur=Editions Mundaneum|année=1934|date=|pages totales=431|isbn=}}.</ref>''.
<blockquote>
Ici, la Table de Travail n’est plus chargée d’aucun livre. À leur place se dresse un écran et à portée un téléphone. Là-bas, au loin, dans un édifice immense, sont tous les livres et tous les renseignements, avec tout l’espace que requiert leur enregistrement et leur manutention…
De là, on fait apparaître sur l’écran la page à lire pour connaître la question posée par téléphone avec ou sans fil. Un écran serait double, quadruple ou décuple s’il s’agissait de multiplier les textes et les documents à confronter simultanément ; il y aurait un haut-parleur si la vue devrait être aidée par une audition. Une telle hypothèse, un [[w:fr: H. G. Wells|Wells]] certes l’aimerait. Utopie aujourd’hui parce qu’elle n’existe encore nulle part, mais elle pourrait devenir la réalité de demain pourvu que se perfectionnent encore nos méthodes et notre instrumentation.
</blockquote>
[[Fichier:Le_Répertoire_Bibliographique_Universel_vers_1900.jpg|vignette|<small>Figure 13. Photographie de l’intérieur du Répertoire Bibliographique Universel prise aux alentours de 1900.</small>|400x400px]]
À peu de choses près, cette utopie décrite en 1934 par Otlet correspond parfaitement à l'usage que l'on fait du réseau Internet et de son espace web, lorsqu'on recherche de l'information aujourd'hui. Premièrement, allumer un système informatique, avec ou sans fil, muni d'un écran ; ensuite, poser une question dans un moteur de recherche ; puis, comme cela arrive très souvent, être redirigé vers l'une des versions linguistiques de Wikipédia<ref>{{Lien web|langue=|auteur=Alexa|titre=Wikipedia.org Competitive Analysis, Marketing Mix and Traffic|url=https://web.archive.org/web/20201002021753/https://www.alexa.com/siteinfo/wikipedia.org|site=|date=|consulté le=}}.</ref>.
Ce scénario, dans lequel les moteurs de recherche jouent un rôle central, explique la popularité de l'encyclopédie libre. D'autres projets similaires étaient pourtant apparus sur le Web avant l'arrivée de Wikipédia. Environ trois ans avant sa création, [[w:fr: Aaron Swartz|Aaron Swartz]], un activiste de la culture libre qui n'avait que douze ans à l'époque, avait par exemple lancé une sorte de site encyclopédique produit et géré par ses usagers<ref>Brian Knappenberger, {{Lien web|titre=The Internet's own boy: The Story of Aaron Swartz{{!}}The Internet's own boy: The Story of Aaron Swartz|url=https://archive.org/details/youtube-gpvcc9C8SbM|éditeur=[[w:fr:Participant Media|Participant Medi]]|année=2014|passage=6:29 - 7:31 min|Auteur1=Brian Knappenberger}}.</ref>. Appelé ''The Info Network,'' ce site web avait d'ailleurs permis à son auteur de recevoir l'''[[w:en:ArsDigita|ArsDigita]] Prize'', un prix décerné aux jeunes créateurs de projets « utiles, éducatifs, collaboratifs et non commerciaux »<ref>{{Lien web|auteur=David Amsden|titre=The Brilliant Life and Tragic Death of Aaron Swarz|url=https://web.archive.org/web/20211010013454/https://www.rollingstone.com/culture/culture-news/the-brilliant-life-and-tragic-death-of-aaron-swartz-177191/|site=Penske Media Corporation|éditeur=|date=28/02/2013|consulté le=}}.</ref>.
Il faut savoir ensuite que le concept d' « encyclopédie libre et universelle » fut formulé sur internet pour la première fois par Richard Stallman en 1998, soit un an avant la naissance de Wikipédia. C'était dans un essai intitulé ''[[metawiki:The Free Universal Encyclopedia and Learning Resource|The Free Universal Encyclopedia and Learning Resource]]''<ref>{{Lien web|auteur=Richard Stallman|titre=The Free Universal Encyclopedia and Learning Resource (1998 draft)|url=https://web.archive.org/web/20211029155052/https://www.gnu.org/encyclopedia/free-encyclopedia-1998-draft.html|site=GNU|date=2021/01/04}}.</ref>, qui, selon son auteur, avait été rédigé deux ans avant sa publication sur la liste de diffusion du projet GNU en décembre 2000<ref name="Stallman">{{Lien web|langue=|auteur=Richard Stallman|titre=The Free Universal Encyclopedia and Learning Resource|url=https://web.archive.org/web/20090201021222/http://www.gnu.org:80/encyclopedia/anencyc.txt|site=GNU|date=18 décembre 2000|consulté le=}}.</ref>. Repris ci-dessous, un extrait de ce texte, présente les particularités du projet.
<blockquote>
Le World Wide Web a le potentiel de devenir une encyclopédie universelle couvrant tous les domaines de la connaissance et une bibliothèque complète de cours d’enseignement. Ce résultat pourrait être atteint sans effort particulier, si personne n’intervient. Mais les entreprises se mobilisent aujourd’hui pour orienter l’avenir vers une voie différente, dans laquelle elles contrôlent et limitent l’accès au matériel pédagogique, afin de soutirer de l’argent aux personnes qui veulent apprendre.
Nous ne pouvons pas empêcher les entreprises de restreindre l’information qu’elles mettent à disposition ; ce que nous pouvons faire, c’est proposer une alternative. Nous devons lancer un mouvement pour développer une encyclopédie libre universelle, tout comme le mouvement des logiciels libres nous a donné le système d’exploitation libre GNU/Linux. L’encyclopédie libre fournira une alternative aux encyclopédies restreintes que les entreprises de médias rédigeront<ref>Texte original avant sa traduction par www.deepl.com/translator : ''The World Wide Web has the potential to develop into a universal encyclopedia covering all areas of knowledge, and a complete library of instructional courses. This outcome could happen without any special effort, if no one interferes. But corporations are mobilizing now to direct the future down a different track--one in which they control and restrict access to learning materials, so as to extract money from people who want to learn. […] We cannot stop business from restricting the information it makes available ; what we can do is provide an alternative. We need to launch a movement to develop a universal free encyclopedia, much as the Free Software movement gave us the free software operating system GNU/Linux. The free encyclopedia will provide an alternative to the restricted ones that media corporations will write.''</ref>.
</blockquote>
[[Fichier:Wikimania_2016_-_Press_conference_with_Jimmy_Wales_and_Katherine_Maher_01_(centred_crop).jpg|vignette|<small>Figure 14. Jimmy Wales en 2016.</small>|gauche]]
En parlant d'un « mouvement pour développer une encyclopédie libre universelle », Stallman anticipait donc, sans le savoir, l'arrivée du mouvement Wikimédia, qui ne se concrétisa que bien des années plus tard. Quant à la soixantaine de paragraphes qui décrivent son projet, on y retrouve, dans une forme presque identique, les cinq principes fondateurs qui ont guidé la création de Wikipédia et qui sont toujours actifs à ce jour<ref>{{Lien web|langue=|auteur=Wikipédia|titre=Principes fondateurs|url=https://web.archive.org/web/20230610010746/https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Principes_fondateurs|site=|date=|consulté le=}}.</ref>.
Le premier consiste bien sûr à [[w:fr:Wikipédia:Wikipédia est une encyclopédie|créer une encyclopédie]] ; le deuxième réclame une [[w:fr: wikipédia: Neutralité de point de vue|neutralité de point de vue]]<ref>{{Lien web|langue=|auteur=Wikipedia|titre=Information for "Wikipedia: Neutral point of view"|url=https://web.archive.org/web/20201115191610/https://en.wikipedia.org/w/index.php?title=Wikipedia%3ANeutral_point_of_view&action=info|site=|date=|consulté le=}}.</ref>, chose que Stallman expliquait déjà en écrivant qu’« en cas de controverse, plusieurs points de vue seront représentés » ; le troisième implique le respect des droits d’auteur et l’adoption d'une [[w:fr:Wikipédia:Droit d'auteur|licence libre]], celle précisément dont Stallman avait été l'initiateur ; le quatrième inscrit le projet dans une [[w:fr:Wikipédia:Règles de savoir-vivre|démarche collaborative]], alors que Stallman précisait déjà que « tout le monde est le bienvenu pour écrire des articles » ; et le cinquième enfin, stipule qu’il n’y a [[w:fr:Wikipédia:Interprétation créative des règles|pas d’autres règles fixes]], une position très courante dans le milieu des hackers dont Stallman faisait partie.
[[Fichier:L_Sanger.jpg|vignette|<small>Figure 15. Larry Sanger en 2010.</small>]]
Il apparaît donc clairement que le projet Wikipédia n'était pas une idée originale en soi, mais plutôt une opportunité saisie par la société [[w:fr:Bomis|Bomis]] pour enrichir sa propre encyclopédie commerciale, [[w:fr: Nupedia|Nupedia]]. Cette dernière avait été lancée en avril 2000, soit environ dix mois avant Wikipédia, et sa rédaction était assurée par des experts engagés au sein d’un processus éditorial strict et formel<ref>{{Cite book|first1=Ned|last1=Kock|first2=Yusun|last2=Jung|first3=Thant|last3=Syn|title=Wikipedia and e-Collaboration Research: Opportunities and Challenges|journal=[[International Journal of e-Collaboration]]|volume=12|issue=2|publisher=IGI Global|date=2016|issn=1548-3681|doi=10.4018/IJeC.2016040101|url=http://cits.tamiu.edu/kock/pubs/journals/2016JournalIJeC_WikipediaEcollaboration/Kock_etal_2016_IJeC_WikipediaEcollaboration.pdf|archive-url=https://web.archive.org/web/20160927001627/https://cits.tamiu.edu/kock/pubs/journals/2016JournalIJeC_WikipediaEcollaboration/Kock_etal_2016_IJeC_WikipediaEcollaboration.pdf|archive-date=September 27, 2016|pages=1–8|author1-link=Ned Kock|url-status=live}}.</ref>. Malheureusement pour la firme Bomis, le nombre d’articles ne progressait que très lentement.
Dans l'idée d'accélérer le processus, [[w:fr: Larry Sanger|Larry Sanger]], docteur en philosophie et rédacteur en chef de Nupedia, eut l'idée d'installer un logiciel wiki sur les serveurs de l'entreprise Bomis. L'idée était d'ouvrir un site web communautaire dans lequel des volontaires pourraient créer des articles encyclopédiques, pour ensuite les intégrer dans l'encyclopédie commerciale. Malgré le manque d’enthousiasme de son employeur [[w:fr: Jimmy Wales|Jimmy Wales]]<ref>{{Lien web|langue=|auteur=|nom1=Sanger|prénom1=Larry|titre=Let's make a wiki|url=https://web.archive.org/web/20030822044513/www.nupedia.com/pipermail/nupedia-l/2001-January/000676.html|site=Nupedia-l|lieu=|date=10 janvier 2001|consulté le=}}.</ref>, Sanger mit ses idées en application, et c'est ainsi que l’[[w:fr:Histoire de Wikipédia|histoire de Wikipédia]]<ref>{{Lien web|langue=|auteur=Geere Duncan|titre=Timeline:Wikipedia's history and milestones|url=http://archive.wikiwix.com/cache/index2.php?url=https://www.wired.co.uk/news/archive/2011-01/11/wikipedia-timeline|site=Wired UK|date=11 janvier 2011|consulté le=}}.</ref> commença, avec un tout premier site en anglais.
C’était le 15 janvier 2001, précisément le même mois où Richard Stallman mit en ligne son propre projet d’encyclopédie libre et universelle, qu'il souhaitait intituler [[w:fr: GNUPedia|GNUPedia]]. Étonnamment, les noms de domaine gnupedia .com .net et .org avaient déjà été enregistrés au nom de Jimmy Wales<ref>{{Lien web|auteur=Jimmy Wales|titre=Re: [Bug-gnupedia] gnupedia.org resolves to nupedia|url=https://web.archive.org/web/20210302175447/https://lists.gnu.org/archive/html/bug-gne/2001-01/msg00472.html|site=GNU Mailing Lists|date=21 janvier 2001|consulté le=}}.</ref>, ce qui obligea Stallman à rebaptiser son projet GNE. Ce fait est d'autant plus surprenant que Wales affirma des années plus tard<ref name="Poe">{{Lien web|langue=|auteur=Marshall Poe|titre=The Hive|url=https://web.archive.org/web/20210427075913/https://www.theatlantic.com/magazine/archive/2006/09/the-hive/305118/?single_page=true|site=The Atlantic|date=27-04-2021|consulté le=}}.</ref> : « n’avoir eu aucune connaissance directe de l’essai de Stallman lorsqu’il s’est lancé dans son projet d’encyclopédie »<ref>Texte original avant sa traduction par www.deepl.com/translator : ''« had no direct knowledge of Stallman’s essay when he embarked on his encyclopedia project »''</ref>.
Le site GNE ne ressemblait cependant pas vraiment à une encyclopédie, mais plutôt à un blog collectif<ref>{{Cite book|title=The Future of the Internet--And How to Stop It|last=Zittrain|first=Jonathan|authorlink=Jonathan Zittrain|publisher=Yale University Press|year=2008|isbn=9780300145342|pages=140|url=https://archive.org/details/futureoftheinternetandhow00zitt}}.</ref> ou une [[w:fr:Base de connaissance|base de connaissances]]<ref>{{Cite book|title=Good Faith Collaboration: The Culture of Wikipedia|last=Reagle|first=Joseph Michael|publisher=MIT Press|year=2010|isbn=9780262014472|pages=54|url=https://archive.org/details/goodfaithcol_reag_2010_000_10578531|url-access=registration}}.</ref>, tandis que la page d’accueil du projet précisait clairement qu’il s’agissait d’une bibliothèque d’opinions<ref>{{Lien web|titre=Home|url=https://web.archive.org/web/20210307060715/http://gne.sourceforge.net/eng/|date=|consulté le=|auteur=GNE}}.</ref>. Quant à sa modération, elle avait demandé d'engager un employé, car elle s'est avérée bien plus compliquée que prévu. À côté de cela, et probablement grâce aux spécificités de l’environnement wiki et aux soutiens apportés par Jimmy Wales et Larry Sanger, Wikipédia réussit à mettre en place une organisation efficace au sein d'une communauté d'éditeurs grandissante.
[[Fichier:En_Wikipedia_Articles.png|vignette|<small>Figure 16. Évolution graphique du nombre d’articles sur Wikipédia.</small>|gauche|300x300px]]
[[Fichier:Citizendium_number_of_articles_graph.png|vignette|<small>Figure 17. Évolution graphique du nombre d’articles sur Citizendium.</small>|gauche|300x300px]]
Peut-être en raison de la concurrence libre faite par le projet GNE, Jimmy Wales décida d'abandonner le copyright que Bomis détenait sur son encyclopédie commerciale Nupedia, pour le remplacer par une licence Nupedia Open Content<ref>{{Ouvrage|langue=|prénom1=Andrew|nom1=Lih|titre=The Wikipedia revolution: how a bunch of nobodies created the world's greatest encyclopedia|passage=35|éditeur=Aurum|date=2010|isbn=978-1-84513-516-4|oclc=717360697|consulté le=}}.</ref>. Peu de temps après, il décida finalement d'adopter la [[w:fr: Licence de documentation libre GNU|licence de documentation libre GNU]] conçue pour protéger les textes de documentation des logiciels libres. Ce dernier choix fut une stratégie payante, puisque cela incita Richard Stallman à transférer tout le contenu de son projet GNE vers Nupedia, et à encourager tout le monde à contribuer sur Wikipédia<ref>{{Lien web|langue=|auteur=GNU|titre=Le projet d'encyclopédie libre|url=https://web.archive.org/web/20201031191252/http://www.gnu.org/encyclopedia/encyclopedia.fr.html|site=|date=|consulté le=}}.</ref>.
Parmi les autres actions de Jimmy Wales qui ont contribué au succès de Wikipédia, il y eu cette idée d'ouvrir le projet aux « gens ordinaires<ref>{{Lien web|langue=|auteur=Timothy|titre=The Early History of Nupedia and Wikipedia : A Memoir|url=https://web.archive.org/web/20201002023421/https://features.slashdot.org/story/05/04/18/164213/the-early-history-of-nupedia-and-wikipedia-a-memoir|site=Slashdot|lieu=|date=2005|consulté le=}}.</ref> ». C’était un choix qui s’opposait aux idéaux de Larry Sanger, qui de loin préférait le modèle de Nupedia avec son système de relecture par des experts. Cependant, Jimmy Wales, en tant qu'homme d’affaires, visait une croissance plus rapide du contenu de l'encyclopédie<ref name="Poe" />.
Cette croissance ne s'est toutefois pas faite sans difficulté. Le 26 février 2002 en effet, l'[[w:Enciclopedia_Libre_Universal_en_Español|Enciclopedia Libre Universal en Español]], un projet dissident du projet Wikipédia, fit son apparition. Ce choix communautaire était une réaction à de la censure, l'existence d'une ligne éditoriale et la possibilité d'inclure des publicités au sein des projets Wikipédia<ref>{{Lien web|titre=Good luck with your WikiPAIDia: Reflections on the 2002 Fork of the Spanish Wikipedia|url=https://web.archive.org/web/20250927011327/https://networkcultures.org/cpov/2011/01/15/spanish_fork/|auteur1=Institute of network cultures}}</ref>. Cet évènement suscita beaucoup de remises en question parmi les bénévoles actif dans le projet et Jimmy Wales renonça finalement à l'usage de la publicité qui réduisait fortement ses visions en matière de recherche de profit.
Cet évènement est survenu en plein éclatement de la [[w:Bulle spéculative (Internet)|bulle spéculative Internet]] et du [[w:fr:Krach boursier de 2001-2002|Krach boursier de 2001-2002]], qui plaçaient la société Bomis dans des difficultés financières et dans l'incapacité de payer le salaire de son employé Larry Sanger. En mars 2002, et après un mois d’activité bénévole, l’ex-employé décida alors de quitter les fonctions qu'il occupait au sein de Nupedia et de Wikipédia<ref>{{Lien web|auteur=Meta-Wiki|titre=My resignation|url=https://web.archive.org/web/20210226005328/https://meta.wikimedia.org/w/index.php?title=My_resignation--Larry_Sanger&oldid=23899|site=|consulté le=}}.</ref>. Avec le seul soutien de Jimmy Wales, les deux encyclopédies purent toutefois poursuivre leurs développements, toujours avec le concours d'experts dans Nupedia et d'une communauté bénévole au niveau de Wikipédia. Cependant, en septembre 2003, vu l'écart qui se creusait entre les deux projets, l'encyclopédie Nupedia fut fermée, et ses quelques dizaines d'articles transférés vers les milliers d'autres que comprenait déjà le projet Wikipédia.
Trois ans plus tard, Larry Sanger n’avait pas dit son dernier mot. En septembre 2006, il décida en effet de lancer sur fonds propres une encyclopédie intitulée [[w:Citizendium|Citizendium]]. Cette plateforme écrite en anglais uniquement et toujours active à ce jour, repose sur un système d’expertise, dans lequel les contributrices et les contributeurs doivent déclarer leur identité réelle. En avril 2026 cependant, Citizendium reprenait moins de 2000 articles<ref>{{Lien web|url=https://web.archive.org/web/20260414234905/https://www.citizendium.org/|titre=Welcome to Cityzendium|auteur=Cityzendium}}</ref>, tout avancement confondu, tandis que le projet Wikipédia en anglais en regroupait déjà plus de 7 millions<ref>{{Lien web|url=https://web.archive.org/web/20260423065306/https://en.wikipedia.org/wiki/Main_Page|titre=Welcome to Wikipedia|auteur=Wikipedia}}</ref>
Voici donc comment est née la plus grande encyclopédie au monde, dont la taille et la visibilité n'avaient jamais été égalées auparavant. Une encyclopédie qui, de plus, s'est rapidement déclinée en de nombreuses versions linguistiques, à l'instar de sa version francophone, lancée moins de quatre mois après le projet original en anglais<ref>{{Lien web|langue=|auteur=Jason Richey|titre=new language wikis|url=https://web.archive.org/web/20210131074026/https://lists.wikimedia.org/pipermail/wikipedia-l/2001-May/000116.html|site=Wikipedia-l|lieu=|date=11 mai 2001|consulté le=}}.</ref>. Toutes ces versions ont formé les premières bases d’une organisation mondiale, bientôt chapeautée par une fondation. Avant cela, d'autres projets pédagogiques et collaboratifs ont vu le jour au côté de Wikipédia. Intitulés « projets frères », ceux-ci se constituent à leur tour, en de nombreuses versions linguistiques, tout en poursuivant le processus de création du mouvement Wikimédia.{{AutoCat}}
boorqtnwms8inle6xgei8c4zz9p79gf
Le mouvement Wikimédia/L'arrivée des projets frères
0
79273
764629
757556
2026-04-23T10:51:31Z
Lionel Scheepmans
20012
764629
wikitext
text/x-wiki
<noinclude>{{Le mouvement Wikimédia}}</noinclude>
Dans le but de développer des contenus pédagogiques qui ne trouvaient pas leur place dans Wikipédia, d’autres projets pédagogiques et collaboratifs ont vu le jour, pour former ce que l'on appelle couramment aujourd'hui : l’écosystème Wikimedia. La naissance de tous ces projets, ainsi que les évènements importants qui ont contribué au développement du mouvement, ont été repris dans [[c:File:WikipediaTimeline.png|ligne du temps]] réalisée par [[m:user:Guillom|Guillaume Paumier]] à l’occasion du dixième anniversaire de Wikipédia. Dans ce graphique, qui peut être complété par [[m:Wikimedia News|une page web]] régulièrement mise à jour, on peut ainsi voir en détail l'évolution du nombre de projets, de versions linguistiques, de contributeurs et d'articles, pour avoir une vie précise de la vitesse à laquelle s'est développé le mouvement Wikimédia.[[Fichier:Wikimedia logo family complete-2022.svg|alt=Logo du mouvement Wikimédia entouré de 15 autres logos de projets actifs en son sein|vignette|<small>Figure 18. Logo de la Fondation Wikimédia entouré de 15 autres logos de projets actifs au sein du mouvement.</small>|300x300px]]Parmi tous les projets frères de Wikipédia, le premier apparu fut Méta-Wiki, une plateforme de référence pour centraliser la gestion de l'ensemble des sites web hébergés par la fondation Wikimédia. Dans un premier temps, cet espace communautaire en ligne a répondu à la nécessité de traiter en un seul lieu les questions communes aux différentes versions linguistiques de Wikipédia. Aujourd'hui, le site web est le principal endroit de coordination et de gestion de l'ensemble du mouvement Wikimédia. On y retrouve énormément d'informations au sujet des projets en ligne, mais aussi, et surtout, concernant la Fondation et tous les organismes affiliés.
Après Méta-Wiki, sept autres projets de partage de la connaissance ont fait leur apparition, avant d'être déclinés à leur tour en plusieurs versions linguistiques. Tous ces projets émergent en général sur l’initiative d’un petit groupe de personnes actives au sein d’un projet préexistant. Ce fut le cas du projet Wiktionnaire en anglais, le deuxième projet à voir le jour après Méta-Wiki, en décembre 2002, soit deux ans avant la version francophone apparue en mars 2004<ref>{{Lien web|auteur=Wiktionnaire|titre=Wiktionnaire:Historique du Wiktionnaire|url=https://web.archive.org/web/20200416091043/https://fr.wiktionary.org/wiki/Wiktionnaire:Historique_du_Wiktionnaire|consulté le=}}.</ref>.
Il est intéressant d'observer que la version francophone du Wiktionnaire n’a pas été créée à partir du projet anglophone, mais bien depuis le projet Wikipédia en français. D'ailleurs, on peut retrouver dans les archives de ce dernier projet, tout un débat concernant la pertinence de cette création, dont voici un extrait.
<blockquote>
En fait, ce qui me peine vraiment avec le projet Wiktionary, c’est que alors qu’on essaie de rassembler les gens (pas facile) pour créer une sorte de tour de Babel de la connaissance (tâche bien longue et difficile), ce nouveau projet va disperser les énergies pour une raison qui ne me semble pas valable. C’est la création de Wiktionary qui va créer des redondances. À mon avis il existera rapidement des pages sur le même mot, mais ne contenant pas les mêmes informations. Pour quelle raison ces connaissances devraient-elles être séparées ? Les encyclopédies sur papier devaient faire des choix à cause du manque de place, mais nous, pourquoi le ferions-nous ??? "Wikipédia n’est pas un dictionnaire" n’est pas un argument à mon avis... si vraiment c’était pas un dictionnaire, il faudrait virer tout un tas d’article. Je ne comprends vraiment pas cette volonté de séparer la connaissance entre ce qui est "encyclopédique" et ce qui n’est "qu’une définition".
[Réponse]
Pour moi ce qu’est Wiktionary, c’est une partie de Wikipédia s’intéressant plus particulièrement aux aspects linguistiques des mots. La différence que je verrais entre la partie ''dictionnaire'' de Wikipédia et sa partie dite encyclopédique, c’est que la partie dictionnaire s’intéresserait au sens des mots eux-mêmes alors que la partie encyclopédie s’attache plus à faire ressortir un état des connaissances à un moment donné. Le pourquoi de la séparation d’avec la partie encyclopédie tient plus à des raisons techniques qu’à une volonté de monter un projet indépendant, en effet, à mon humble avis, un dictionnaire nécessite une plus grande rigueur (de présentation) qu’une encyclopédie. Ceci entraîne beaucoup de problème et entre autres le choix de la mise en forme des articles du dictionnaire.<ref>{{Lien web|auteur=Wiktionnaire|titre=Wiktionnaire:Historique du Wiktionnaire/Discussion Wikipédia:Wiktionary|url=https://web.archive.org/web/20140831102908/http://fr.wiktionary.org/wiki/Wiktionnaire:Historique_du_Wiktionnaire/Discussion_Wikip%C3%A9dia:Wiktionary|date=|consulté le=}}.</ref>
</blockquote>
Créer un nouveau projet, c’est effectivement créer un nouveau site web, qui devra faire l’objet d’une nouvelle gestion, tant pour les serveurs de la Fondation, que pour la nouvelle communauté de contributeurs. L’importation de pages d’un projet à l'autre ou la traduction de celles-ci sont bien sûr toujours possibles, mais cela duplique alors aussi la maintenance et les mises à jour. Le choix de scinder un projet, en faveur d’une plus grande liberté, comporte donc certains coûts humains et financiers.
Ce prix à payer n'a pour autant pas empêché le projet anglophone Wikibooks de faire son apparition le 10 juin 2003, soit près d’un an avant Wikilivres, la version francophone du projet, apparue le 22 juillet 2004. Cette dernière création avait de nouveau été débattue au sein de la communauté Wikipédia en français, et non pas dans le Wikibooks en anglais. Quant à l'objectif commun aux deux projets linguistiques, il était de créer une « bibliothèque de livres pédagogiques libres que chacun peut améliorer »<ref>{{Lien web|auteur=Wikilivres|url=https://fr.wikibooks.org/w/index.php?title=Accueil&oldid=586825|titre=Acceuil|consulté le=}}.</ref>.
Environ un an après la création du projet en anglais, un nouvel [[w:fr:Espace de noms|espace de noms]] intitulé Wikijunior fut mis en place au sein de la bibliothèque en ligne. Ce sous-projet avait été créé pour répondre à un financement de la fondation ''[[w:en:Graham_Beck|Beck]],'' qui cherchait à promouvoir la production de nouvelles littératures pour des enfants de huit à onze ans<ref>{{Lien web|auteur=Méta-Wiki|titre=Wikijunior/proposal to Beck Foundation|url=https://web.archive.org/web/20150925041619/https://meta.wikimedia.org/wiki/Wikijunior/proposal_to_Beck_Foundation|consulté le=}}.</ref>. Peu de temps après, cette tranche d’âge fut toutefois élargie de zéro à douze ans au niveau du projet francophone, quand le sous-projet y fut adopté<ref>{{Lien web|auteur=Wikilivres|titre=Wikijunior|url=https://web.archive.org/web/20210414045051/https://fr.wikibooks.org/wiki/Wikijunior|consulté le=}}.</ref>.
Ces deux évènements témoignent ainsi qu'il est toujours possible qu'un sous-projet apparaisse dans un projet Wikimédia. Comme autre exemple, il y a aussi le WikiJournal, un sous-projet développé au sein du projet Wikiversité en anglais. Après réception du prix de l’''Open Publishing Awards'' en 2019<ref>{{Lien web|langue=|auteur=Open Publishing Awards|titre=Results|url=https://web.archive.org/web/20201125093419/https://openpublishingawards.org/|site=|consulté le=}}.</ref>, ce sous-projet fit ainsi l'objet d'une demande de lancement d'un nouveau site web indépendant pour permettre un développement autonome de WikiJournal en dehors de Wikiversité. Malheureusement pour les demandeurs, la demande est restée sans suite jusqu'à ce jour<ref>{{Lien web|langue=|auteur1=Wikimedia Foundation Wiki|titre=Minutes/2020-02|url=https://web.archive.org/web/20201015115053/https://foundation.wikimedia.org/wiki/Minutes/2020-02#WikiJournal|site=|éditeur=|date=|consulté le=}}.</ref>, après que le conseil d’administration de la Fondation, chargé de répondre à leur demande, considéra que le projet n’était pas suffisamment abouti.
Il faut savoir qu'avant cela, le projet Wikiversité, dans lequel est né Wikijournal, avait lui-même été un sous-projet du projet Wikibook<ref>{{Lien web|auteur=Méta-Wiki|titre=Talk:Wikiversity/Old|url=https://web.archive.org/web/20130723232149/http://meta.wikimedia.org/wiki/Talk:Wikiversity/Old|date=|consulté le=}}.</ref>. Initialement, il visait à « créer une communauté de personnes qui se soutiennent mutuellement dans leurs efforts éducatifs<ref>Texte original avant sa traduction par www.deepl.com/translator : « ''create a community of people who support each other in their educational endeavors »''</ref> »<ref>{{Lien web|auteur=Wikibooks|titre=Wikiversity|url=https://web.archive.org/web/20210506184146/https://en.wikibooks.org/wiki/Wikiversity|date=|consulté le=}}.</ref>. Cependant, le 13 août 2005, une longue discussion remit en question l’existence du sous-projet Wikiversité dans Wikibooks. Au terme de celle-ci, la décision fut prise de transférer Wikiversité et son contenu sur le site Méta-Wiki<ref name="Wikibooks">{{Lien web|titre=Wikibooks:Requests for deletion/Wikiversity|url=https://en.wikibooks.org/w/index.php?title=Wikibooks:Requests_for_deletion/Wikiversity&oldid=3490139|auteur=Wikibooks|consulté le=}}.</ref>, là où de nouvelles discussions ont abouti à l’idée de faire de Wikiversité un nouveau projet indépendant<ref>{{Lien web|titre=Wikiversity|url=https://meta.wikimedia.org/w/index.php?title=Wikiversity&oldid=232819|auteur=Méta-Wiki|date=|consulté le=}}.</ref>. Déjà à l'époque, le conseil d’administration de la Fondation Wikimédia se montrait réticent et demanda qu'un sondage au sein de la communauté rassemble une majorité des deux tiers en faveur de l'ouverture du nouveau site web<ref>{{Lien web|titre=Wikiversity/Vote/fr|url=https://meta.wikimedia.org/w/index.php?title=Wikiversity/Vote/fr&oldid=316555|consulté le=|auteur=Méta-Wiki}}.</ref>. Ce vote fut bien sûr accompagné de débats dont voici un extrait<ref name="Wikibooks" />.
<blockquote>
La principale raison pour laquelle la Fondation Wikimédia ne veut pas "lâcher le morceau" est une simple question de bureaucratie et la crainte que le projet ne devienne une autre Wikispecies [un projet de répertoire du vivant]. Wikispecies est une idée cool, mais les "fondateurs" du projet se sont dégonflés à mi-chemin de la mise en place du contenu et ont décidé de faire une révision majeure qui a pris plus de temps que ce que tout le monde était prêt à mettre.
Le même problème s’applique à Wikiversity en ce qui concerne la Fondation, parce que les objectifs et les buts de ce projet ne sont pas clairement définis, et il semble que les participants essaient de mordre plus qu’ils ne peuvent mâcher en proposant une université de recherche multi-collèges entière (avec un statut de recherche et une accréditation) à former de toutes pièces plutôt qu’un simple centre d’éducation pour adultes avec quelques classes.<ref>Texte original avant sa traduction par deepl.com/translator : « ''The main reason why the Wikimedia Foundation doesn't want to "turn it loose" is pure bureaucratic BS and a fear that it will turn into another Wikispecies. Wikispecies is a cool idea, but the "founders" of the project got cold feet part-way into putting in content and decided to do a major revision that took more time than anybody was willing to put into it. The same issue applies to Wikiversity so far as the Foundation is concerned, because the goals and purposes of this project are not clearly defined, and it seems like the participants are trying to bite off more than they can chew by proposing an entire multi-college research university (with Carnegie-Mellon research status and accreditation as well) to be formed out of whole cloth rather than a simple adult education center with a few classes. If more thought is done on how to "bootstrap" this whole project, perhaps some thoughts on how to convince the Foundation board to let a separate wiki be kicked loose to let this project try to develop on its own can be made''.--Rob Horning 11:21, 14 August 2005 (UTC) »</ref>
</blockquote>
Le 13 novembre 2005, le projet ne fut toutefois pas accepté par cinq membres du conseil qui réclamèrent une « réécriture de la proposition pour en exclure la remise de titre de compétence, la conduite de cours en ligne, et de clarifier le concept de plate-forme ''e-learning''<ref>Texte original avant sa traduction par www.deepl.com/translator : « ''rewriting the proposal to'' ''exclude credentials, exclude online-courses and clarify the concept of elearning platform'' »</ref> »<ref>{{Lien web|auteur=Wikimedia Foundation Wiki|titre=Meetings/November 13, 2005|url=https://foundation.wikimedia.org/w/index.php?title=Meetings/November_13,_2005&oldid=118181|consulté le=}}.</ref>. Une fois ces rectifications faites, le projet bénéficia alors d'une période d’essai de plusieurs mois, jusqu'à ce que les amendements apportés au projet de départ soient acceptés le 31 juillet 2006. Ce temps d'attente était justifié par la création du ''[[m:Special_projects_committee|special projects committee]]''<ref>{{Lien web|titre=Wikiversity/Modified project proposal|url=https://meta.wikimedia.org/w/index.php?title=Wikiversity/Modified_project_proposal&oldid=395364#Scope_of_Wikiversity%20scope|auteur=Méta-Wiki|consulté le=}}.</ref>'','' chargé de soulager le conseil d’administration de la fondation concernant les demandes de création de nouveaux projets Wikimédia jusqu'en décembre 2021<ref>{{Lien web|titre=Difference between revisions of "Special projects committee/Resolutions" - Meta|url=https://meta.wikimedia.org/w/index.php?title=Special_projects_committee/Resolutions&diff=prev&oldid=418944&diffmode=source|auteur=Méta-Wiki|consulté le=}}.</ref>.
Un nouveau site, nomé Beta-Wikiversity, fut ainsi créé pour assister le lancement des différentes versions linguistiques de Wikiversité<ref>{{Lien web|titre=Wikiversité|url=https://fr.wikiversity.org/w/index.php?title=Wikiversité:Accueil&oldid=787344|auteur=Wikiversité|consulté le=}}.</ref>. Durant six mois, son premier objectif a d'abord été l'élaboration des lignes directrices concernant la potentialité de produire des recherches collaboratives au sein du projet<ref>Texte original avant sa traduction par www.deepl.com/translator : « ''six months, during which guidelines for further potential uses of the site, including collaborative research, will be developed'' »</ref>. Par la suite, chaque nouvelle version linguistique, développée dans le projet Beta, devait avoir plus de 10 modifications par mois, réalisées par au moins trois personnes distinctes, avant de pouvoir bénéficier de son propre site web.
Avec la plateforme de lancement des nouvelles déclinaisons linguistiques de la bibliothèque libre Wikisource<ref>{{Lien web|auteur=Wikisource|titre=Wikisource|url=https://web.archive.org/web/20210303213629/https://wikisource.org/wiki/Main_Page|date=|consulté le=}}.</ref>, Beta-Wikiversity est le deuxième espace indépendant de lancement de nouvelles déclinaisons linguistiques d'un projet. Pour tous les autres projets pédagogiques Wikimédia cela doit se faire sur [[incubator:Main_Page|Wikimedia Incubator]]<ref>{{Lien web|auteur=Wikimédia Incubator|titre=Welcome to Wikimedia Incubator!|url=https://web.archive.org/web/20210227091859/https://incubator.wikimedia.org/wiki/Incubator:Main_Page|date=|consulté le=}}.</ref>'','' une autre plateforme d'incubation créée à la même époque que Beta-Wikiversity.
Comme une exception à la règle, le seul projet qui aura échappé à ce processus d'incubation au sein du mouvement Wikimédia fut Wikivoyage. Ce guide de voyage a en effet été créé en 2003 dans un Wiki extérieur au mouvement Wikimédia, là où il portait le nom de Wikitravel<ref>{{Lien web|auteur=Giles Turnbull|titre=The DIY travel guide|url=https://web.archive.org/web/20210116050802/http://news.bbc.co.uk/2/hi/uk_news/magazine/3614517.stm|site=BBC News|éditeur=|date=12 avril 2004|consulté le=}}.</ref>. Comme cela arrive parfois, ce projet sans but lucratif fut acheté par une entreprise commerciale en 2006. Mais en raison du changement de gouvernance et de l'apparition de publicités, une scission est apparue au sein de la communauté d’éditeurs. Les personnes désireuses de quitter Wikitravel lancèrent alors un nouveau site appelé Wikivoyage, qui reçut en 2007, le [[w:fr:Webby Award|''Webby Award'']] du meilleur guide de voyage Internet<ref>{{Lien web|auteur=Jake Coyle|titre=On the Net: Web Sites to Travel By|url=https://web.archive.org/web/20210121071600/https://www.foxnews.com/printer_friendly_wires/2007May30/0,4675,OntheNet,00.html|site=Fox News|date=30 mai 2007|consulté le=}}.</ref>.
L'intégration de Wikivoyage dans l'écosystème Wikimédia n'a cependant été fait qu'en 2012, à la suite d'un appel à commentaires durant lequel 540 personnes se sont manifestées en faveur de l’intégration du projet, face à 153 oppositions et 6 abstentions <ref>{{Lien web|url=https://web.archive.org/web/20210311055050/https://meta.wikimedia.org/wiki/Requests_for_comment/Travel_Guide|titre=Requests for comment/Travel Guide|auteur=Méta-Wiki|consulté le=}}.</ref>. Comme cette nouvelle déclencha une migration importante depuis Wikitravel vers Wikivoyage, une plainte fut déposée par la société commerciale en charge du premier projet. Celle-ci fut toutefois rejetée et le projet Wikivoyage continua à prendre l’ampleur au sein du mouvement Wikimédia, avec la création de nouvelles versions linguistiques<ref>{{Lien web|auteur=Steven Musil|titre=Wikimedia, Internet Brands settle Wikivoyage lawsuits|url=https://web.archive.org/web/20211116013544/https://www.cnet.com/tech/services-and-software/wikimedia-internet-brands-settle-wikivoyage-lawsuits/|site=CNET|éditeur=|date=17 février 2013|consulté le=}}.</ref>.[[Fichier:WikiMOOC - vidéo 23 - Les projets frères.webm|vignette|<small>Vidéo 1. Présentation des projets frères dans le cadre du WIKIMOOC 2016.</small>|300x300px|gauche]]Comme ce fut le cas pour le projet [[n:fr:Accueil|Wikinews]], finalement accepté en 2004, des centaines de demandes d’ouvertures de nouveaux projets sont ainsi en attente d’évaluation suite au dépôt de leur candidature dans [[m:Proposals_for_new_projects|Méta-Wiki]]<ref>{{Lien web|auteur=Méta-Wiki|titre=Proposals for new projects|url=https://web.archive.org/web/20211019173812/https://meta.wikimedia.org/wiki/Proposals_for_new_projects|date=|consulté le=}}.</ref>. Ces attentes se soldent bien souvent par un refus, à l’image du projet WikiLang dont le but était de lancer un laboratoire linguistique<ref>{{Lien web|langue=|auteur=Méta-Wiki|titre=WikiLang|url=https://web.archive.org/web/20210109011449/https://meta.wikimedia.org/wiki/WikiLang|consulté le=}}</ref>. Mais cela n’empêche pas certains projets de voir le jour, comme ce fut le cas en octobre 2012, pour le projet de production d'une base de données structurée et sémantique nommée [[w:Wikidata|Wikidata]], et plus récement en 2020 avec ''[[w:Abstract_Wikipedia|Abstract Wikipedia]]''<ref>{{Lien web|langue=|auteur=Wikimedia Foundation Wiki|titre=Resolution:Abstract Wikipedia|url=https://web.archive.org/web/20201026191716/https://foundation.wikimedia.org/wiki/Resolution:Abstract_Wikipedia|date=|consulté le=}}.</ref> et son extension ''[[w:Wikifunctions|Wikifunctions]]''<ref>{{Lien web|langue=|auteur=Wikimedia Fundation|titre=Resolution:Abstract Wikipedia|url=https://web.archive.org/web/20200703234853/https://foundation.wikimedia.org/wiki/Resolution:Abstract_Wikipedia}}</ref>.
Ces trois projets interconnectés ont pour ambition de produire automatiquement des articles encyclopédiques dans tous les langages naturels pris en charge. Les phrases qui composent les articles seraient formées par des fonctions informatiques qui tireraient profit de la base de données Wikidata. À terme, le contenu de Wikidata devrait donc se retrouver traduit et agencé par ''Wikifunctions'', dans le but de produire des articles encyclopédiques rassemblés sur ''Abstract Wikipedia''<ref>{{Lien web|langue=|auteur=Thomas Douillard|titre=Abstract Wikipédia - LinuxFr.org|url=https://web.archive.org/web/20200923155546/https://linuxfr.org/news/abstract-wikipedia#fn1|site=Linux Fr|lieu=|date=05/09/20|consulté le=}}.</ref>.
Dans un autre cas de figure, il est possible qu’un projet ou une de ces versions linguistiques vienne à disparaître. Une liste de sites web proposés à la suppression est d'ailleurs mise à jour régulièrement sur la plateforme Méta-Wiki <ref>{{Lien web|auteur=Méta-Wiki|titre=Proposals for closing projects|url=https://web.archive.org/web/20210126030311/https://meta.wikimedia.org/wiki/Proposals_for_closing_projects|date=|consulté le=}}.</ref>. Dans celle-ci, on retrouve essentiellement des versions linguistiques de projets qui n’ont pas réussi à poursuivre leurs développements. Mais cela n'empêcherait pas qu'un jour, et faute d'activité dans toutes ses déclinaisons linguistiques, un projet tout entier soit soumis à suppression.
Le manque d'activité n'est pas non plus la seule raison valable de supression. En 2005 et peu de temps après son lancement, la version francophone du recueil de citations Wikiquote aurait en effet bien pu disparaitre. Le projet était accusé d’avoir récupéré le contenu d’une base de données soumise à un droit d’auteur restrictif et incompatible avec la licence Creative Commons appliquée sur l’ensemble des projets éditoriaux Wikimédia. La plainte fut adressée à l’association Wikimédia France, avant d’être relayée sur le site Méta-Wiki, où il fut question de fermier le projet<ref>{{Lien web|auteur1=Méta-Wiki|titre=Wikiquote FR/Closure of French Wikiquote|url=https://web.archive.org/web/20210204052058/https://meta.wikimedia.org/wiki/Wikiquote_FR/Closure_of_French_Wikiquote|date=}}.</ref>. Celui-ci fut toutefois maintenu, mais avec pour conditions de repartir de zéro, et d’établir une charte pour garantir la traçabilité des citations reprises par le projet<ref>{{Lien web|auteur1=Jean-Baptiste Soufron|titre=Redémarrage du Wikiquote Francophone / French Wikiquote Relaunch|url=https://web.archive.org/web/20200506074856/https://lists.wikimedia.org/pipermail/foundation-l/2006-March/019857.html|site=Foundation-l|lieu=|date=30 mars 2006}}.</ref>.
Sans prendre le temps de faire le tour de tous les projets apparus au sein du mouvement, voici donc de quoi se faire une idée sur la manière dont les projets frères et leurs versions linguistiques font leurs apparitions. Les exemples repris ci-dessus suffisent effectivement pour comprendre les principes généraux qui sous-tendent leurs créations. En dehors de Méta-Wiki, Wikidata, Wikifunctions'','' Abstract Wikipédia et Wikimedia Commons répondant à des besoins de coordination et de centralisation, les autres projets semblent effectivement provenir d’un désir de spécialisation d’un projet préexistant.
L'idée est généralement débattue dans un projet de même langue, avant d'être transmise vers Méta-Wiki, dans le but de discuter de la pertinence d'une candidature adressée au [[m:Wikimedia_Foundation_Community_Affairs_Committee/Sister_Projects_Task_Force/fr|groupe de travail des projets frères]] du [[m:Wikimedia_Foundation_Community_Affairs_Committee/fr|comité des affaires communautaires de la Fondation Wikimédia]]. Quant aux nouvelles versions linguistiques, elles doivent être soumises au [[m:Language_committee/fr|comité des langues]], avant de tester leur capacité de développement, sur Incubator, Beta-Wikiversité ou Wikisource Multilingue, pour bénéficier, une fois le test réussi, d’un site web indépendant.
Avant de clôtuer cette présentation des projets fères, il est important d'aborder une ambiguité courente concernant les sites dont les noms contiennent l’expression Wiki sont en relation avec le mouvement. Car 95 % des 20 000 sites web fonctionnant sur une technologie wiki n’ont en effet aucun lien avec le mouvement Wikimédia, à l’exception peut-être qu’ils utilisent le logiciel MediaWiki développé par la Fondation Wikimédia<ref>{{Lien web|langue=|auteur=WikiIndex|titre=the index of all wiki|url=https://web.archive.org/web/20201011073630/https://wikiindex.org/Category:All|site=|date=|consulté le=}}.</ref>.
[[w:fr:WikiLeaks|WikiLeaks]] par exemple, créé par [[w:fr:Julian Assange|Julian Assange]] dans le but de publier des documents classifiés provenant de sources anonymes, n’est ni un projet Wikimédia, ni un site collaboratif. Comme autre exemple, il y a ensuite le recueil universel et multilingue de guides illustrés [[w:fr:WikiHow|WikiHow]], qui fonctionne pour sa part de manière collaborative et avec le logiciel MediaWiki développé par la Fondation Wikimédia<ref>{{Lien web|auteur=WikiHow|titre=wikiHow:Powered and Inspired by MediaWiki|url=https://web.archive.org/web/20211030092737/https://www.wikihow.com/wikiHow:Powered-and-Inspired-by-MediaWiki|date=|consulté le=}}.</ref>, mais qui n'est pas pour autant en lien avec le mouvement Wikimédia. D'ailleurs, son ergonomie, radicalement différente de celle des projets Wikimédia, permet de le comprendre au premier coup d’œil.
L'encyclopédie libre pour enfant [[w:fr:Wikimini|Wikimini]], en revanche, a une apparence très proche de celle des projets Wikimédia. Mais contrairement au souhait de son fondateur, le projet n’aura jamais été accepté par la Fondation Wikimédia. Quant aux projets [[w:fr:WikiTribune|WikiTribune]] et [[w:fr:Wikia|Fandom]], ceux-ci entretienne encore une plus grande ambiguité, puisqu'ils ont été créé par [[w:fr:Jimmy Wales|Jimmy Wales]], le fondateur de Wikipédia et la [[w:fr:Wikimedia Foundation|Fondation Wikimédia]]<ref>{{Lien web|langue=|auteur=Terry Collins|titre=Wikipedia co-founder launches project to fight fake news|url=https://web.archive.org/web/20201014061304/https://www.cnet.com/news/wikipedia-jimmy-wales-wikitribune-fighting-fake-news/|site=CNET|date=24 avril 2017|consulté le=}}.</ref>, mais à des fins commerciales et lucrative. Ce qui les rends incompatibles avec le mouvement Wikimédia.
Au terme de ces explications concernant l'apparition des projets frères, il reste à signaler que certains projets et versions linguistiques, ont été créés bien avant que la perception du mouvement Wikimédia fasse son apparition. C'est en effet suite au brassage de projets, de langues et de cultures différentes, et grâce à une conscience collective, manifestée par une coordination centrale de toutes les activités via la plateforme Méta-Wiki, que l'idée d'un mouvement social a pris du sens au sein des activités Wikimédia. En ce sens, la naissance du mouvement ne fut pas un événement ponctuel, mais plutôt la réalisation d’un long processus de conscientisation.
{| class="wikitable"style="margin: auto;" "text-align:center;"
|+Codes QR
|[[Fichier:QR code page meta news.png|centré|sans_cadre|100x100px|lien=https://meta.wikimedia.org/wiki/Wikimedia_News]]
|[[Fichier:QR-Code ligne du temps projets Wikimédia.png|centré|sans_cadre|100x100px|lien=https://upload.wikimedia.org/wikipedia/commons/b/b0/WikipediaTimeline.png]]
|[[Fichier:Code QR vidéo présentation projets frères WikiMooc 2016.svg|centré|sans_cadre|100x100px]]
|-
|<small>Meta-Wiki</small>
|<small>Ligne du temps</small>
|<small>Vidéo projets frères</small>
|}
{{AutoCat}}
4o4tai63tld7m7avddprwl4id5icr1q
764631
764629
2026-04-23T10:55:59Z
Lionel Scheepmans
20012
764631
wikitext
text/x-wiki
<noinclude>{{Le mouvement Wikimédia}}</noinclude>
Dans le but de développer des contenus pédagogiques qui ne trouvaient pas leur place dans Wikipédia, d’autres projets pédagogiques et collaboratifs ont vu le jour, pour former ce que l'on appelle couramment aujourd'hui : l’écosystème Wikimedia. La naissance de tous ces projets, ainsi que les évènements importants qui ont contribué au développement du mouvement, ont été repris dans [[c:File:WikipediaTimeline.png|ligne du temps]] réalisée par [[m:user:Guillom|Guillaume Paumier]] à l’occasion du dixième anniversaire de Wikipédia. Dans ce graphique, qui peut être complété par [[m:Wikimedia News|une page web]] régulièrement mise à jour, on peut ainsi voir en détail l'évolution du nombre de projets, de versions linguistiques, de contributeurs et d'articles, pour avoir une vie précise de la vitesse à laquelle s'est développé le mouvement Wikimédia.[[Fichier:Wikimedia logo family complete-2022.svg|alt=Logo du mouvement Wikimédia entouré de 15 autres logos de projets actifs en son sein|vignette|<small>Figure 18. Logo de la Fondation Wikimédia entouré de 15 autres logos de projets actifs au sein du mouvement.</small>|300x300px]]Parmi tous les projets frères de Wikipédia, le premier apparu fut Méta-Wiki, une plateforme de référence pour centraliser la gestion de l'ensemble des sites web hébergés par la fondation Wikimédia. Dans un premier temps, cet espace communautaire en ligne a répondu à la nécessité de traiter en un seul lieu les questions communes aux différentes versions linguistiques de Wikipédia. Aujourd'hui, le site web est le principal endroit de coordination et de gestion de l'ensemble du mouvement Wikimédia. On y retrouve énormément d'informations au sujet des projets en ligne, mais aussi, et surtout, concernant la Fondation et tous les organismes affiliés.
Après Méta-Wiki, sept autres projets de partage de la connaissance ont fait leur apparition, avant d'être déclinés à leur tour en plusieurs versions linguistiques. Tous ces projets émergent en général sur l’initiative d’un petit groupe de personnes actives au sein d’un projet préexistant. Ce fut le cas du projet Wiktionnaire en anglais, le deuxième projet à voir le jour après Méta-Wiki, en décembre 2002, soit deux ans avant la version francophone apparue en mars 2004<ref>{{Lien web|auteur=Wiktionnaire|titre=Wiktionnaire:Historique du Wiktionnaire|url=https://web.archive.org/web/20200416091043/https://fr.wiktionary.org/wiki/Wiktionnaire:Historique_du_Wiktionnaire|consulté le=}}.</ref>.
Il est intéressant d'observer que la version francophone du Wiktionnaire n’a pas été créée à partir du projet anglophone, mais bien depuis le projet Wikipédia en français. D'ailleurs, on peut retrouver dans les archives de ce dernier projet, tout un débat concernant la pertinence de cette création, dont voici un extrait.
<blockquote>
En fait, ce qui me peine vraiment avec le projet Wiktionary, c’est que alors qu’on essaie de rassembler les gens (pas facile) pour créer une sorte de tour de Babel de la connaissance (tâche bien longue et difficile), ce nouveau projet va disperser les énergies pour une raison qui ne me semble pas valable. C’est la création de Wiktionary qui va créer des redondances. À mon avis il existera rapidement des pages sur le même mot, mais ne contenant pas les mêmes informations. Pour quelle raison ces connaissances devraient-elles être séparées ? Les encyclopédies sur papier devaient faire des choix à cause du manque de place, mais nous, pourquoi le ferions-nous ??? "Wikipédia n’est pas un dictionnaire" n’est pas un argument à mon avis... si vraiment c’était pas un dictionnaire, il faudrait virer tout un tas d’article. Je ne comprends vraiment pas cette volonté de séparer la connaissance entre ce qui est "encyclopédique" et ce qui n’est "qu’une définition".
[Réponse]
Pour moi ce qu’est Wiktionary, c’est une partie de Wikipédia s’intéressant plus particulièrement aux aspects linguistiques des mots. La différence que je verrais entre la partie ''dictionnaire'' de Wikipédia et sa partie dite encyclopédique, c’est que la partie dictionnaire s’intéresserait au sens des mots eux-mêmes alors que la partie encyclopédie s’attache plus à faire ressortir un état des connaissances à un moment donné. Le pourquoi de la séparation d’avec la partie encyclopédie tient plus à des raisons techniques qu’à une volonté de monter un projet indépendant, en effet, à mon humble avis, un dictionnaire nécessite une plus grande rigueur (de présentation) qu’une encyclopédie. Ceci entraîne beaucoup de problème et entre autres le choix de la mise en forme des articles du dictionnaire.<ref>{{Lien web|auteur=Wiktionnaire|titre=Wiktionnaire:Historique du Wiktionnaire/Discussion Wikipédia:Wiktionary|url=https://web.archive.org/web/20140831102908/http://fr.wiktionary.org/wiki/Wiktionnaire:Historique_du_Wiktionnaire/Discussion_Wikip%C3%A9dia:Wiktionary|date=|consulté le=}}.</ref>
</blockquote>
Créer un nouveau projet, c’est effectivement créer un nouveau site web, qui devra faire l’objet d’une nouvelle gestion, tant pour les serveurs de la Fondation, que pour la nouvelle communauté de contributeurs. L’importation de pages d’un projet à l'autre ou la traduction de celles-ci sont bien sûr toujours possibles, mais cela duplique alors aussi la maintenance et les mises à jour. Le choix de scinder un projet, en faveur d’une plus grande liberté, comporte donc certains coûts humains et financiers.
Ce prix à payer n'a pour autant pas empêché le projet anglophone Wikibooks de faire son apparition le 10 juin 2003, soit près d’un an avant Wikilivres, la version francophone du projet, apparue le 22 juillet 2004. Cette dernière création avait de nouveau été débattue au sein de la communauté Wikipédia en français, et non pas dans le Wikibooks en anglais. Quant à l'objectif commun aux deux projets linguistiques, il était de créer une « bibliothèque de livres pédagogiques libres que chacun peut améliorer »<ref>{{Lien web|auteur=Wikilivres|url=https://fr.wikibooks.org/w/index.php?title=Accueil&oldid=586825|titre=Acceuil|consulté le=}}.</ref>.
Environ un an après la création du projet en anglais, un nouvel [[w:fr:Espace de noms|espace de noms]] intitulé Wikijunior fut mis en place au sein de la bibliothèque en ligne. Ce sous-projet avait été créé pour répondre à un financement de la fondation ''[[w:en:Graham_Beck|Beck]],'' qui cherchait à promouvoir la production de nouvelles littératures pour des enfants de huit à onze ans<ref>{{Lien web|auteur=Méta-Wiki|titre=Wikijunior/proposal to Beck Foundation|url=https://web.archive.org/web/20150925041619/https://meta.wikimedia.org/wiki/Wikijunior/proposal_to_Beck_Foundation|consulté le=}}.</ref>. Peu de temps après, cette tranche d’âge fut toutefois élargie de zéro à douze ans au niveau du projet francophone, quand le sous-projet y fut adopté<ref>{{Lien web|auteur=Wikilivres|titre=Wikijunior|url=https://web.archive.org/web/20210414045051/https://fr.wikibooks.org/wiki/Wikijunior|consulté le=}}.</ref>.
Ces deux évènements témoignent ainsi qu'il est toujours possible qu'un sous-projet apparaisse dans un projet Wikimédia. Comme autre exemple, il y a aussi le WikiJournal, un sous-projet développé au sein du projet Wikiversité en anglais. Après réception du prix de l’''Open Publishing Awards'' en 2019<ref>{{Lien web|langue=|auteur=Open Publishing Awards|titre=Results|url=https://web.archive.org/web/20201125093419/https://openpublishingawards.org/|site=|consulté le=}}.</ref>, ce sous-projet fit ainsi l'objet d'une demande de lancement d'un nouveau site web indépendant pour permettre un développement autonome de WikiJournal en dehors de Wikiversité. Malheureusement pour les initiateurs, la demande est restée sans suite jusqu'à ce jour<ref>{{Lien web|langue=|auteur1=Wikimedia Foundation Wiki|titre=Minutes/2020-02|url=https://web.archive.org/web/20201015115053/https://foundation.wikimedia.org/wiki/Minutes/2020-02#WikiJournal|site=|éditeur=|date=|consulté le=}}.</ref>, après que le conseil d’administration de la Fondation, chargé de répondre à leur demande, considéra que le projet n’était pas suffisamment abouti.
Il faut savoir qu'avant cela, le projet Wikiversité, dans lequel est né Wikijournal, avait lui-même été un sous-projet du projet Wikibook<ref>{{Lien web|auteur=Méta-Wiki|titre=Talk:Wikiversity/Old|url=https://web.archive.org/web/20130723232149/http://meta.wikimedia.org/wiki/Talk:Wikiversity/Old|date=|consulté le=}}.</ref>. Initialement, il visait à « créer une communauté de personnes qui se soutiennent mutuellement dans leurs efforts éducatifs<ref>Texte original avant sa traduction par www.deepl.com/translator : « ''create a community of people who support each other in their educational endeavors »''</ref> »<ref>{{Lien web|auteur=Wikibooks|titre=Wikiversity|url=https://web.archive.org/web/20210506184146/https://en.wikibooks.org/wiki/Wikiversity|date=|consulté le=}}.</ref>. Cependant, le 13 août 2005, une longue discussion remit en question l’existence du sous-projet Wikiversité dans Wikibooks. Au terme de celle-ci, la décision fut prise de transférer Wikiversité et son contenu sur le site Méta-Wiki<ref name="Wikibooks">{{Lien web|titre=Wikibooks:Requests for deletion/Wikiversity|url=https://en.wikibooks.org/w/index.php?title=Wikibooks:Requests_for_deletion/Wikiversity&oldid=3490139|auteur=Wikibooks|consulté le=}}.</ref>, là où de nouvelles discussions ont abouti à l’idée de faire de Wikiversité un nouveau projet indépendant<ref>{{Lien web|titre=Wikiversity|url=https://meta.wikimedia.org/w/index.php?title=Wikiversity&oldid=232819|auteur=Méta-Wiki|date=|consulté le=}}.</ref>. Déjà à l'époque, le conseil d’administration de la Fondation Wikimédia se montrait réticent et demanda qu'un sondage au sein de la communauté rassemble une majorité des deux tiers en faveur de l'ouverture du nouveau site web<ref>{{Lien web|titre=Wikiversity/Vote/fr|url=https://meta.wikimedia.org/w/index.php?title=Wikiversity/Vote/fr&oldid=316555|consulté le=|auteur=Méta-Wiki}}.</ref>. Ce vote fut bien sûr accompagné de débats dont voici un extrait<ref name="Wikibooks" />.
<blockquote>
La principale raison pour laquelle la Fondation Wikimédia ne veut pas "lâcher le morceau" est une simple question de bureaucratie et la crainte que le projet ne devienne une autre Wikispecies [un projet de répertoire du vivant]. Wikispecies est une idée cool, mais les "fondateurs" du projet se sont dégonflés à mi-chemin de la mise en place du contenu et ont décidé de faire une révision majeure qui a pris plus de temps que ce que tout le monde était prêt à mettre.
Le même problème s’applique à Wikiversity en ce qui concerne la Fondation, parce que les objectifs et les buts de ce projet ne sont pas clairement définis, et il semble que les participants essaient de mordre plus qu’ils ne peuvent mâcher en proposant une université de recherche multi-collèges entière (avec un statut de recherche et une accréditation) à former de toutes pièces plutôt qu’un simple centre d’éducation pour adultes avec quelques classes.<ref>Texte original avant sa traduction par deepl.com/translator : « ''The main reason why the Wikimedia Foundation doesn't want to "turn it loose" is pure bureaucratic BS and a fear that it will turn into another Wikispecies. Wikispecies is a cool idea, but the "founders" of the project got cold feet part-way into putting in content and decided to do a major revision that took more time than anybody was willing to put into it. The same issue applies to Wikiversity so far as the Foundation is concerned, because the goals and purposes of this project are not clearly defined, and it seems like the participants are trying to bite off more than they can chew by proposing an entire multi-college research university (with Carnegie-Mellon research status and accreditation as well) to be formed out of whole cloth rather than a simple adult education center with a few classes. If more thought is done on how to "bootstrap" this whole project, perhaps some thoughts on how to convince the Foundation board to let a separate wiki be kicked loose to let this project try to develop on its own can be made''.--Rob Horning 11:21, 14 August 2005 (UTC) »</ref>
</blockquote>
Le 13 novembre 2005, le projet ne fut toutefois pas accepté par cinq membres du conseil qui réclamèrent une « réécriture de la proposition pour en exclure la remise de titre de compétence, la conduite de cours en ligne, et de clarifier le concept de plate-forme ''e-learning''<ref>Texte original avant sa traduction par www.deepl.com/translator : « ''rewriting the proposal to'' ''exclude credentials, exclude online-courses and clarify the concept of elearning platform'' »</ref> »<ref>{{Lien web|auteur=Wikimedia Foundation Wiki|titre=Meetings/November 13, 2005|url=https://foundation.wikimedia.org/w/index.php?title=Meetings/November_13,_2005&oldid=118181|consulté le=}}.</ref>. Une fois ces rectifications faites, le projet bénéficia alors d'une période d’essai de plusieurs mois, jusqu'à ce que les amendements apportés au projet de départ soient acceptés le 31 juillet 2006. Ce temps d'attente était justifié par la création du ''[[m:Special_projects_committee|special projects committee]]''<ref>{{Lien web|titre=Wikiversity/Modified project proposal|url=https://meta.wikimedia.org/w/index.php?title=Wikiversity/Modified_project_proposal&oldid=395364#Scope_of_Wikiversity%20scope|auteur=Méta-Wiki|consulté le=}}.</ref>'','' chargé de soulager le conseil d’administration de la fondation concernant les demandes de création de nouveaux projets Wikimédia jusqu'en décembre 2021<ref>{{Lien web|titre=Difference between revisions of "Special projects committee/Resolutions" - Meta|url=https://meta.wikimedia.org/w/index.php?title=Special_projects_committee/Resolutions&diff=prev&oldid=418944&diffmode=source|auteur=Méta-Wiki|consulté le=}}.</ref>.
Un nouveau site, nomé Beta-Wikiversity, fut ainsi créé pour assister le lancement des différentes versions linguistiques de Wikiversité<ref>{{Lien web|titre=Wikiversité|url=https://fr.wikiversity.org/w/index.php?title=Wikiversité:Accueil&oldid=787344|auteur=Wikiversité|consulté le=}}.</ref>. Durant six mois, son premier objectif a d'abord été l'élaboration des lignes directrices concernant la potentialité de produire des recherches collaboratives au sein du projet<ref>Texte original avant sa traduction par www.deepl.com/translator : « ''six months, during which guidelines for further potential uses of the site, including collaborative research, will be developed'' »</ref>. Par la suite, chaque nouvelle version linguistique, développée dans le projet Beta, devait avoir plus de 10 modifications par mois, réalisées par au moins trois personnes distinctes, avant de pouvoir bénéficier de son propre site web.
Avec la plateforme de lancement des nouvelles déclinaisons linguistiques de la bibliothèque libre Wikisource<ref>{{Lien web|auteur=Wikisource|titre=Wikisource|url=https://web.archive.org/web/20210303213629/https://wikisource.org/wiki/Main_Page|date=|consulté le=}}.</ref>, Beta-Wikiversity est le deuxième espace indépendant de lancement de nouvelles déclinaisons linguistiques d'un projet. Pour tous les autres projets pédagogiques Wikimédia cela doit se faire sur [[incubator:Main_Page|Wikimedia Incubator]]<ref>{{Lien web|auteur=Wikimédia Incubator|titre=Welcome to Wikimedia Incubator!|url=https://web.archive.org/web/20210227091859/https://incubator.wikimedia.org/wiki/Incubator:Main_Page|date=|consulté le=}}.</ref>'','' une autre plateforme d'incubation créée à la même époque que Beta-Wikiversity.
Comme une exception à la règle, le seul projet qui aura échappé à ce processus d'incubation au sein du mouvement Wikimédia fut Wikivoyage. Ce guide de voyage a en effet été créé en 2003 dans un Wiki extérieur au mouvement Wikimédia, là où il portait le nom de Wikitravel<ref>{{Lien web|auteur=Giles Turnbull|titre=The DIY travel guide|url=https://web.archive.org/web/20210116050802/http://news.bbc.co.uk/2/hi/uk_news/magazine/3614517.stm|site=BBC News|éditeur=|date=12 avril 2004|consulté le=}}.</ref>. Comme cela arrive parfois, ce projet sans but lucratif fut acheté par une entreprise commerciale en 2006. Mais en raison du changement de gouvernance et de l'apparition de publicités, une scission est apparue au sein de la communauté d’éditeurs. Les personnes désireuses de quitter Wikitravel lancèrent alors un nouveau site appelé Wikivoyage, qui reçut en 2007, le [[w:fr:Webby Award|''Webby Award'']] du meilleur guide de voyage Internet<ref>{{Lien web|auteur=Jake Coyle|titre=On the Net: Web Sites to Travel By|url=https://web.archive.org/web/20210121071600/https://www.foxnews.com/printer_friendly_wires/2007May30/0,4675,OntheNet,00.html|site=Fox News|date=30 mai 2007|consulté le=}}.</ref>.
L'intégration de Wikivoyage dans l'écosystème Wikimédia n'a cependant été fait qu'en 2012, à la suite d'un appel à commentaires durant lequel 540 personnes se sont manifestées en faveur de l’intégration du projet, face à 153 oppositions et 6 abstentions <ref>{{Lien web|url=https://web.archive.org/web/20210311055050/https://meta.wikimedia.org/wiki/Requests_for_comment/Travel_Guide|titre=Requests for comment/Travel Guide|auteur=Méta-Wiki|consulté le=}}.</ref>. Comme cette nouvelle déclencha une migration importante depuis Wikitravel vers Wikivoyage, une plainte fut déposée par la société commerciale en charge du premier projet. Celle-ci fut toutefois rejetée et le projet Wikivoyage continua à prendre l’ampleur au sein du mouvement Wikimédia, avec la création de nouvelles versions linguistiques<ref>{{Lien web|auteur=Steven Musil|titre=Wikimedia, Internet Brands settle Wikivoyage lawsuits|url=https://web.archive.org/web/20211116013544/https://www.cnet.com/tech/services-and-software/wikimedia-internet-brands-settle-wikivoyage-lawsuits/|site=CNET|éditeur=|date=17 février 2013|consulté le=}}.</ref>.[[Fichier:WikiMOOC - vidéo 23 - Les projets frères.webm|vignette|<small>Vidéo 1. Présentation des projets frères dans le cadre du WIKIMOOC 2016.</small>|300x300px|gauche]]Comme ce fut le cas pour le projet [[n:fr:Accueil|Wikinews]], finalement accepté en 2004, des centaines de demandes d’ouvertures de nouveaux projets sont ainsi en attente d’évaluation suite au dépôt de leur candidature dans [[m:Proposals_for_new_projects|Méta-Wiki]]<ref>{{Lien web|auteur=Méta-Wiki|titre=Proposals for new projects|url=https://web.archive.org/web/20211019173812/https://meta.wikimedia.org/wiki/Proposals_for_new_projects|date=|consulté le=}}.</ref>. Ces attentes se soldent bien souvent par un refus, à l’image du projet WikiLang dont le but était de lancer un laboratoire linguistique<ref>{{Lien web|langue=|auteur=Méta-Wiki|titre=WikiLang|url=https://web.archive.org/web/20210109011449/https://meta.wikimedia.org/wiki/WikiLang|consulté le=}}</ref>. Mais cela n’empêche pas certains projets de voir le jour, comme ce fut le cas en octobre 2012, pour le projet de production d'une base de données structurée et sémantique nommée [[w:Wikidata|Wikidata]], et plus récement en 2020 avec ''[[w:Abstract_Wikipedia|Abstract Wikipedia]]''<ref>{{Lien web|langue=|auteur=Wikimedia Foundation Wiki|titre=Resolution:Abstract Wikipedia|url=https://web.archive.org/web/20201026191716/https://foundation.wikimedia.org/wiki/Resolution:Abstract_Wikipedia|date=|consulté le=}}.</ref> et son extension ''[[w:Wikifunctions|Wikifunctions]]''<ref>{{Lien web|langue=|auteur=Wikimedia Fundation|titre=Resolution:Abstract Wikipedia|url=https://web.archive.org/web/20200703234853/https://foundation.wikimedia.org/wiki/Resolution:Abstract_Wikipedia}}</ref>.
Ces trois projets interconnectés ont pour ambition de produire automatiquement des articles encyclopédiques dans tous les langages naturels pris en charge. Les phrases qui composent les articles seraient formées par des fonctions informatiques qui tireraient profit de la base de données Wikidata. À terme, le contenu de Wikidata devrait donc se retrouver traduit et agencé par ''Wikifunctions'', dans le but de produire des articles encyclopédiques rassemblés sur ''Abstract Wikipedia''<ref>{{Lien web|langue=|auteur=Thomas Douillard|titre=Abstract Wikipédia - LinuxFr.org|url=https://web.archive.org/web/20200923155546/https://linuxfr.org/news/abstract-wikipedia#fn1|site=Linux Fr|lieu=|date=05/09/20|consulté le=}}.</ref>.
Dans un autre cas de figure, il est possible qu’un projet ou une de ces versions linguistiques vienne à disparaître. Une liste de sites web proposés à la suppression est d'ailleurs mise à jour régulièrement sur la plateforme Méta-Wiki <ref>{{Lien web|auteur=Méta-Wiki|titre=Proposals for closing projects|url=https://web.archive.org/web/20210126030311/https://meta.wikimedia.org/wiki/Proposals_for_closing_projects|date=|consulté le=}}.</ref>. Dans celle-ci, on retrouve essentiellement des versions linguistiques de projets qui n’ont pas réussi à poursuivre leurs développements. Mais cela n'empêcherait pas qu'un jour, et faute d'activité dans toutes ses déclinaisons linguistiques, un projet tout entier soit soumis à suppression.
Le manque d'activité n'est pas non plus la seule raison valable de supression. En 2005 et peu de temps après son lancement, la version francophone du recueil de citations Wikiquote aurait en effet bien pu disparaitre. Le projet était accusé d’avoir récupéré le contenu d’une base de données soumise à un droit d’auteur restrictif et incompatible avec la licence Creative Commons appliquée sur l’ensemble des projets éditoriaux Wikimédia. La plainte fut adressée à l’association Wikimédia France, avant d’être relayée sur le site Méta-Wiki, où il fut question de fermier le projet<ref>{{Lien web|auteur1=Méta-Wiki|titre=Wikiquote FR/Closure of French Wikiquote|url=https://web.archive.org/web/20210204052058/https://meta.wikimedia.org/wiki/Wikiquote_FR/Closure_of_French_Wikiquote|date=}}.</ref>. Celui-ci fut toutefois maintenu, mais avec pour conditions de repartir de zéro, et d’établir une charte pour garantir la traçabilité des citations reprises par le projet<ref>{{Lien web|auteur1=Jean-Baptiste Soufron|titre=Redémarrage du Wikiquote Francophone / French Wikiquote Relaunch|url=https://web.archive.org/web/20200506074856/https://lists.wikimedia.org/pipermail/foundation-l/2006-March/019857.html|site=Foundation-l|lieu=|date=30 mars 2006}}.</ref>.
Sans prendre le temps de faire le tour de tous les projets apparus au sein du mouvement, voici donc de quoi se faire une idée sur la manière dont les projets frères et leurs versions linguistiques font leurs apparitions. Les exemples repris ci-dessus suffisent effectivement pour comprendre les principes généraux qui sous-tendent leurs créations. En dehors de Méta-Wiki, Wikidata, Wikifunctions'','' Abstract Wikipédia et Wikimedia Commons répondant à des besoins de coordination et de centralisation, les autres projets semblent effectivement provenir d’un désir de spécialisation d’un projet préexistant.
L'idée est généralement débattue dans un projet de même langue, avant d'être transmise vers Méta-Wiki, dans le but de discuter de la pertinence d'une candidature adressée au [[m:Wikimedia_Foundation_Community_Affairs_Committee/Sister_Projects_Task_Force/fr|groupe de travail des projets frères]] du [[m:Wikimedia_Foundation_Community_Affairs_Committee/fr|comité des affaires communautaires de la Fondation Wikimédia]]. Quant aux nouvelles versions linguistiques, elles doivent être soumises au [[m:Language_committee/fr|comité des langues]], avant de tester leur capacité de développement, sur Incubator, Beta-Wikiversité ou Wikisource Multilingue, pour bénéficier, une fois le test réussi, d’un site web indépendant.
Avant de clôtuer cette présentation des projets fères, il est important d'aborder une ambiguité courente concernant les sites dont les noms contiennent l’expression Wiki sont en relation avec le mouvement. Car 95 % des 20 000 sites web fonctionnant sur une technologie wiki n’ont en effet aucun lien avec le mouvement Wikimédia, à l’exception peut-être qu’ils utilisent le logiciel MediaWiki développé par la Fondation Wikimédia<ref>{{Lien web|langue=|auteur=WikiIndex|titre=the index of all wiki|url=https://web.archive.org/web/20201011073630/https://wikiindex.org/Category:All|site=|date=|consulté le=}}.</ref>.
[[w:fr:WikiLeaks|WikiLeaks]] par exemple, créé par [[w:fr:Julian Assange|Julian Assange]] dans le but de publier des documents classifiés provenant de sources anonymes, n’est ni un projet Wikimédia, ni un site collaboratif. Comme autre exemple, il y a ensuite le recueil universel et multilingue de guides illustrés [[w:fr:WikiHow|WikiHow]], qui fonctionne pour sa part de manière collaborative et avec le logiciel MediaWiki développé par la Fondation Wikimédia<ref>{{Lien web|auteur=WikiHow|titre=wikiHow:Powered and Inspired by MediaWiki|url=https://web.archive.org/web/20211030092737/https://www.wikihow.com/wikiHow:Powered-and-Inspired-by-MediaWiki|date=|consulté le=}}.</ref>, mais qui n'est pas pour autant en lien avec le mouvement Wikimédia. D'ailleurs, son ergonomie, radicalement différente de celle des projets Wikimédia, permet de le comprendre au premier coup d’œil.
L'encyclopédie libre pour enfant [[w:fr:Wikimini|Wikimini]], en revanche, a une apparence très proche de celle des projets Wikimédia. Mais contrairement au souhait de son fondateur, le projet n’aura jamais été accepté par la Fondation Wikimédia. Quant aux projets [[w:fr:WikiTribune|WikiTribune]] et [[w:fr:Wikia|Fandom]], ceux-ci entretienne encore une plus grande ambiguité, puisqu'ils ont été créé par [[w:fr:Jimmy Wales|Jimmy Wales]], le fondateur de Wikipédia et la [[w:fr:Wikimedia Foundation|Fondation Wikimédia]]<ref>{{Lien web|langue=|auteur=Terry Collins|titre=Wikipedia co-founder launches project to fight fake news|url=https://web.archive.org/web/20201014061304/https://www.cnet.com/news/wikipedia-jimmy-wales-wikitribune-fighting-fake-news/|site=CNET|date=24 avril 2017|consulté le=}}.</ref>, mais à des fins commerciales et lucrative. Ce qui les rends incompatibles avec le mouvement Wikimédia.
Au terme de ces explications concernant l'apparition des projets frères, il reste à signaler que certains projets et versions linguistiques, ont été créés bien avant que la perception du mouvement Wikimédia fasse son apparition. C'est en effet suite au brassage de projets, de langues et de cultures différentes, et grâce à une conscience collective, manifestée par une coordination centrale de toutes les activités via la plateforme Méta-Wiki, que l'idée d'un mouvement social a pris du sens au sein des activités Wikimédia. En ce sens, la naissance du mouvement ne fut pas un événement ponctuel, mais plutôt la réalisation d’un long processus de conscientisation.
{| class="wikitable"style="margin: auto;" "text-align:center;"
|+Codes QR
|[[Fichier:QR code page meta news.png|centré|sans_cadre|100x100px|lien=https://meta.wikimedia.org/wiki/Wikimedia_News]]
|[[Fichier:QR-Code ligne du temps projets Wikimédia.png|centré|sans_cadre|100x100px|lien=https://upload.wikimedia.org/wikipedia/commons/b/b0/WikipediaTimeline.png]]
|[[Fichier:Code QR vidéo présentation projets frères WikiMooc 2016.svg|centré|sans_cadre|100x100px]]
|-
|<small>Meta-Wiki</small>
|<small>Ligne du temps</small>
|<small>Vidéo projets frères</small>
|}
{{AutoCat}}
onkoy625sha3b8igv27quoy2198rgij
764633
764631
2026-04-23T11:08:09Z
Lionel Scheepmans
20012
764633
wikitext
text/x-wiki
<noinclude>{{Le mouvement Wikimédia}}</noinclude>
Dans le but de développer des contenus pédagogiques qui ne trouvaient pas leur place dans Wikipédia, d’autres projets pédagogiques et collaboratifs ont vu le jour, pour former ce que l'on appelle couramment aujourd'hui : l’écosystème Wikimedia. La naissance de tous ces projets, ainsi que les évènements importants qui ont contribué au développement du mouvement, ont été repris dans [[c:File:WikipediaTimeline.png|ligne du temps]] réalisée par [[m:user:Guillom|Guillaume Paumier]] à l’occasion du dixième anniversaire de Wikipédia. Dans ce graphique, qui peut être complété par [[m:Wikimedia News|une page web]] régulièrement mise à jour, on peut ainsi voir en détail l'évolution du nombre de projets, de versions linguistiques, de contributeurs et d'articles, pour avoir une vie précise de la vitesse à laquelle s'est développé le mouvement Wikimédia.[[Fichier:Wikimedia logo family complete-2022.svg|alt=Logo du mouvement Wikimédia entouré de 15 autres logos de projets actifs en son sein|vignette|<small>Figure 18. Logo de la Fondation Wikimédia entouré de 15 autres logos de projets actifs au sein du mouvement.</small>|300x300px]]Parmi tous les projets frères de Wikipédia, le premier apparu fut Méta-Wiki, une plateforme de référence pour centraliser la gestion de l'ensemble des sites web hébergés par la fondation Wikimédia. Dans un premier temps, cet espace communautaire en ligne a répondu à la nécessité de traiter en un seul lieu les questions communes aux différentes versions linguistiques de Wikipédia. Aujourd'hui, le site web est le principal endroit de coordination et de gestion de l'ensemble du mouvement Wikimédia. On y retrouve énormément d'informations au sujet des projets en ligne, mais aussi, et surtout, concernant la Fondation et tous les organismes affiliés.
Après Méta-Wiki, sept autres projets de partage de la connaissance ont fait leur apparition, avant d'être déclinés à leur tour en plusieurs versions linguistiques. Tous ces projets émergent en général sur l’initiative d’un petit groupe de personnes actives au sein d’un projet préexistant. Ce fut le cas du projet Wiktionnaire en anglais, le deuxième projet à voir le jour après Méta-Wiki, en décembre 2002, soit deux ans avant la version francophone apparue en mars 2004<ref>{{Lien web|auteur=Wiktionnaire|titre=Wiktionnaire:Historique du Wiktionnaire|url=https://web.archive.org/web/20200416091043/https://fr.wiktionary.org/wiki/Wiktionnaire:Historique_du_Wiktionnaire|consulté le=}}.</ref>.
Il est intéressant d'observer que la version francophone du Wiktionnaire n’a pas été créée à partir du projet anglophone, mais bien depuis le projet Wikipédia en français. D'ailleurs, on peut retrouver dans les archives de ce dernier projet, tout un débat concernant la pertinence de cette création, dont voici un extrait.
<blockquote>
En fait, ce qui me peine vraiment avec le projet Wiktionary, c’est que alors qu’on essaie de rassembler les gens (pas facile) pour créer une sorte de tour de Babel de la connaissance (tâche bien longue et difficile), ce nouveau projet va disperser les énergies pour une raison qui ne me semble pas valable. C’est la création de Wiktionary qui va créer des redondances. À mon avis il existera rapidement des pages sur le même mot, mais ne contenant pas les mêmes informations. Pour quelle raison ces connaissances devraient-elles être séparées ? Les encyclopédies sur papier devaient faire des choix à cause du manque de place, mais nous, pourquoi le ferions-nous ??? "Wikipédia n’est pas un dictionnaire" n’est pas un argument à mon avis... si vraiment c’était pas un dictionnaire, il faudrait virer tout un tas d’article. Je ne comprends vraiment pas cette volonté de séparer la connaissance entre ce qui est "encyclopédique" et ce qui n’est "qu’une définition".
[Réponse]
Pour moi ce qu’est Wiktionary, c’est une partie de Wikipédia s’intéressant plus particulièrement aux aspects linguistiques des mots. La différence que je verrais entre la partie ''dictionnaire'' de Wikipédia et sa partie dite encyclopédique, c’est que la partie dictionnaire s’intéresserait au sens des mots eux-mêmes alors que la partie encyclopédie s’attache plus à faire ressortir un état des connaissances à un moment donné. Le pourquoi de la séparation d’avec la partie encyclopédie tient plus à des raisons techniques qu’à une volonté de monter un projet indépendant, en effet, à mon humble avis, un dictionnaire nécessite une plus grande rigueur (de présentation) qu’une encyclopédie. Ceci entraîne beaucoup de problème et entre autres le choix de la mise en forme des articles du dictionnaire.<ref>{{Lien web|auteur=Wiktionnaire|titre=Wiktionnaire:Historique du Wiktionnaire/Discussion Wikipédia:Wiktionary|url=https://web.archive.org/web/20140831102908/http://fr.wiktionary.org/wiki/Wiktionnaire:Historique_du_Wiktionnaire/Discussion_Wikip%C3%A9dia:Wiktionary|date=|consulté le=}}.</ref>
</blockquote>
Créer un nouveau projet, c’est effectivement créer un nouveau site web, qui devra faire l’objet d’une nouvelle gestion, tant pour les serveurs de la Fondation, que pour la nouvelle communauté de contributeurs. L’importation de pages d’un projet à l'autre ou la traduction de celles-ci sont bien sûr toujours possibles, mais cela duplique alors aussi la maintenance et les mises à jour. Le choix de scinder un projet, en faveur d’une plus grande liberté, comporte donc certains coûts humains et financiers.
Ce prix à payer n'a pour autant pas empêché le projet anglophone Wikibooks de faire son apparition le 10 juin 2003, soit près d’un an avant Wikilivres, la version francophone du projet, apparue le 22 juillet 2004. Cette dernière création avait de nouveau été débattue au sein de la communauté Wikipédia en français, et non pas dans le Wikibooks en anglais. Quant à l'objectif commun aux deux projets linguistiques, il était de créer une « bibliothèque de livres pédagogiques libres que chacun peut améliorer »<ref>{{Lien web|auteur=Wikilivres|url=https://fr.wikibooks.org/w/index.php?title=Accueil&oldid=586825|titre=Acceuil|consulté le=}}.</ref>.
Environ un an après la création du projet en anglais, un nouvel [[w:fr:Espace de noms|espace de noms]] intitulé Wikijunior fut mis en place au sein de la bibliothèque en ligne. Ce sous-projet avait été créé pour répondre à un financement de la fondation ''[[w:en:Graham_Beck|Beck]],'' qui cherchait à promouvoir la production de nouvelles littératures pour des enfants de huit à onze ans<ref>{{Lien web|auteur=Méta-Wiki|titre=Wikijunior/proposal to Beck Foundation|url=https://web.archive.org/web/20150925041619/https://meta.wikimedia.org/wiki/Wikijunior/proposal_to_Beck_Foundation|consulté le=}}.</ref>. Peu de temps après, cette tranche d’âge fut toutefois élargie de zéro à douze ans au niveau du projet francophone, quand le sous-projet y fut adopté<ref>{{Lien web|auteur=Wikilivres|titre=Wikijunior|url=https://web.archive.org/web/20210414045051/https://fr.wikibooks.org/wiki/Wikijunior|consulté le=}}.</ref>.
Ces deux évènements témoignent ainsi qu'il est toujours possible qu'un sous-projet apparaisse dans un projet Wikimédia. Comme autre exemple, il y a aussi le WikiJournal, un sous-projet développé au sein du projet Wikiversité en anglais et qui reçu le prix de l’''Open Publishing Awards'' en 2019<ref>{{Lien web|langue=|auteur=Open Publishing Awards|titre=Results|url=https://web.archive.org/web/20201125093419/https://openpublishingawards.org/|site=|consulté le=}}.</ref>. Une demande fut faite pour qu'il puisse bénéficier d'un nouveau site web dans le but de pouvoir se développer en dehors de Wikiversité. Malheureusement pour les initiateurs, la demande est restée sans suite jusqu'à ce jour<ref>{{Lien web|langue=|auteur1=Wikimedia Foundation Wiki|titre=Minutes/2020-02|url=https://web.archive.org/web/20201015115053/https://foundation.wikimedia.org/wiki/Minutes/2020-02#WikiJournal|site=|éditeur=|date=|consulté le=}}.</ref>, après que le conseil d’administration de la Fondation, chargé de répondre à leur demande, considéra que le projet n’était pas suffisamment abouti.
Il faut savoir qu'avant cela, le projet Wikiversité, dans lequel est né Wikijournal, avait lui-même été un sous-projet du projet Wikibook<ref>{{Lien web|auteur=Méta-Wiki|titre=Talk:Wikiversity/Old|url=https://web.archive.org/web/20130723232149/http://meta.wikimedia.org/wiki/Talk:Wikiversity/Old|date=|consulté le=}}.</ref>. Initialement, il visait à « créer une communauté de personnes qui se soutiennent mutuellement dans leurs efforts éducatifs<ref>Texte original avant sa traduction par www.deepl.com/translator : « ''create a community of people who support each other in their educational endeavors »''</ref> »<ref>{{Lien web|auteur=Wikibooks|titre=Wikiversity|url=https://web.archive.org/web/20210506184146/https://en.wikibooks.org/wiki/Wikiversity|date=|consulté le=}}.</ref>. Cependant, le 13 août 2005, une longue discussion remit en question l’existence du sous-projet Wikiversité dans Wikibooks. Au terme de celle-ci, la décision fut prise de transférer Wikiversité et son contenu sur le site Méta-Wiki<ref name="Wikibooks">{{Lien web|titre=Wikibooks:Requests for deletion/Wikiversity|url=https://en.wikibooks.org/w/index.php?title=Wikibooks:Requests_for_deletion/Wikiversity&oldid=3490139|auteur=Wikibooks|consulté le=}}.</ref>, là où de nouvelles discussions ont abouti à l’idée de faire de Wikiversité un nouveau projet indépendant<ref>{{Lien web|titre=Wikiversity|url=https://meta.wikimedia.org/w/index.php?title=Wikiversity&oldid=232819|auteur=Méta-Wiki|date=|consulté le=}}.</ref>.
Déjà à l'époque, le conseil d’administration de la Fondation Wikimédia se montrait réticent à l'ouverture de nouveaux projets et sa réaction fut de demander l'ouverture d'un sondage. Au sein de la communauté, celui-ci devait rassembler une majorité des deux tiers en faveur de l'ouverture du nouveau site web<ref>{{Lien web|titre=Wikiversity/Vote/fr|url=https://meta.wikimedia.org/w/index.php?title=Wikiversity/Vote/fr&oldid=316555|consulté le=|auteur=Méta-Wiki}}.</ref>. Un résultat qui fut finalement obtenu, mais pas sans de longs débats, dont voici un extrait<ref name="Wikibooks" />.
<blockquote>
La principale raison pour laquelle la Fondation Wikimédia ne veut pas "lâcher le morceau" est une simple question de bureaucratie et la crainte que le projet ne devienne une autre Wikispecies [un projet de répertoire du vivant]. Wikispecies est une idée cool, mais les "fondateurs" du projet se sont dégonflés à mi-chemin de la mise en place du contenu et ont décidé de faire une révision majeure qui a pris plus de temps que ce que tout le monde était prêt à mettre.
Le même problème s’applique à Wikiversity en ce qui concerne la Fondation, parce que les objectifs et les buts de ce projet ne sont pas clairement définis, et il semble que les participants essaient de mordre plus qu’ils ne peuvent mâcher en proposant une université de recherche multi-collèges entière (avec un statut de recherche et une accréditation) à former de toutes pièces plutôt qu’un simple centre d’éducation pour adultes avec quelques classes.<ref>Texte original avant sa traduction par deepl.com/translator : « ''The main reason why the Wikimedia Foundation doesn't want to "turn it loose" is pure bureaucratic BS and a fear that it will turn into another Wikispecies. Wikispecies is a cool idea, but the "founders" of the project got cold feet part-way into putting in content and decided to do a major revision that took more time than anybody was willing to put into it. The same issue applies to Wikiversity so far as the Foundation is concerned, because the goals and purposes of this project are not clearly defined, and it seems like the participants are trying to bite off more than they can chew by proposing an entire multi-college research university (with Carnegie-Mellon research status and accreditation as well) to be formed out of whole cloth rather than a simple adult education center with a few classes. If more thought is done on how to "bootstrap" this whole project, perhaps some thoughts on how to convince the Foundation board to let a separate wiki be kicked loose to let this project try to develop on its own can be made''.--Rob Horning 11:21, 14 August 2005 (UTC) »</ref>
</blockquote>
Le 13 novembre 2005, le projet ne fut toutefois pas accepté par cinq membres du conseil qui réclamèrent une « réécriture de la proposition pour en exclure la remise de titre de compétence, la conduite de cours en ligne, et de clarifier le concept de plate-forme ''e-learning''<ref>Texte original avant sa traduction par www.deepl.com/translator : « ''rewriting the proposal to'' ''exclude credentials, exclude online-courses and clarify the concept of elearning platform'' »</ref> »<ref>{{Lien web|auteur=Wikimedia Foundation Wiki|titre=Meetings/November 13, 2005|url=https://foundation.wikimedia.org/w/index.php?title=Meetings/November_13,_2005&oldid=118181|consulté le=}}.</ref>. Une fois ces rectifications faites, le projet bénéficia alors d'une période d’essai de plusieurs mois, jusqu'à ce que les amendements apportés au projet de départ soient acceptés le 31 juillet 2006. Ce temps d'attente était justifié par la création du ''[[m:Special_projects_committee|special projects committee]]''<ref>{{Lien web|titre=Wikiversity/Modified project proposal|url=https://meta.wikimedia.org/w/index.php?title=Wikiversity/Modified_project_proposal&oldid=395364#Scope_of_Wikiversity%20scope|auteur=Méta-Wiki|consulté le=}}.</ref>'','' chargé de soulager le conseil d’administration de la fondation concernant les demandes de création de nouveaux projets Wikimédia jusqu'en décembre 2021<ref>{{Lien web|titre=Difference between revisions of "Special projects committee/Resolutions" - Meta|url=https://meta.wikimedia.org/w/index.php?title=Special_projects_committee/Resolutions&diff=prev&oldid=418944&diffmode=source|auteur=Méta-Wiki|consulté le=}}.</ref>.
Un nouveau site, nomé Beta-Wikiversity, fut ainsi créé pour assister le lancement des différentes versions linguistiques de Wikiversité<ref>{{Lien web|titre=Wikiversité|url=https://fr.wikiversity.org/w/index.php?title=Wikiversité:Accueil&oldid=787344|auteur=Wikiversité|consulté le=}}.</ref>. Durant six mois, son premier objectif a d'abord été l'élaboration des lignes directrices concernant la potentialité de produire des recherches collaboratives au sein du projet<ref>Texte original avant sa traduction par www.deepl.com/translator : « ''six months, during which guidelines for further potential uses of the site, including collaborative research, will be developed'' »</ref>. Par la suite, chaque nouvelle version linguistique, développée dans le projet Beta, devait avoir plus de 10 modifications par mois, réalisées par au moins trois personnes distinctes, avant de pouvoir bénéficier de son propre site web.
Avec la plateforme de lancement des nouvelles déclinaisons linguistiques de la bibliothèque libre Wikisource<ref>{{Lien web|auteur=Wikisource|titre=Wikisource|url=https://web.archive.org/web/20210303213629/https://wikisource.org/wiki/Main_Page|date=|consulté le=}}.</ref>, Beta-Wikiversity est le deuxième espace indépendant de lancement de nouvelles déclinaisons linguistiques d'un projet. Pour tous les autres projets pédagogiques Wikimédia cela doit se faire sur [[incubator:Main_Page|Wikimedia Incubator]]<ref>{{Lien web|auteur=Wikimédia Incubator|titre=Welcome to Wikimedia Incubator!|url=https://web.archive.org/web/20210227091859/https://incubator.wikimedia.org/wiki/Incubator:Main_Page|date=|consulté le=}}.</ref>'','' une autre plateforme d'incubation créée à la même époque que Beta-Wikiversity.
Comme une exception à la règle, le seul projet qui aura échappé à ce processus d'incubation au sein du mouvement Wikimédia fut Wikivoyage. Ce guide de voyage a en effet été créé en 2003 dans un Wiki extérieur au mouvement Wikimédia, là où il portait le nom de Wikitravel<ref>{{Lien web|auteur=Giles Turnbull|titre=The DIY travel guide|url=https://web.archive.org/web/20210116050802/http://news.bbc.co.uk/2/hi/uk_news/magazine/3614517.stm|site=BBC News|éditeur=|date=12 avril 2004|consulté le=}}.</ref>. Comme cela arrive parfois, ce projet sans but lucratif fut acheté par une entreprise commerciale en 2006. Mais en raison du changement de gouvernance et de l'apparition de publicités, une scission est apparue au sein de la communauté d’éditeurs. Les personnes désireuses de quitter Wikitravel lancèrent alors un nouveau site appelé Wikivoyage, qui reçut en 2007, le [[w:fr:Webby Award|''Webby Award'']] du meilleur guide de voyage Internet<ref>{{Lien web|auteur=Jake Coyle|titre=On the Net: Web Sites to Travel By|url=https://web.archive.org/web/20210121071600/https://www.foxnews.com/printer_friendly_wires/2007May30/0,4675,OntheNet,00.html|site=Fox News|date=30 mai 2007|consulté le=}}.</ref>.
L'intégration de Wikivoyage dans l'écosystème Wikimédia n'a cependant été fait qu'en 2012, à la suite d'un appel à commentaires durant lequel 540 personnes se sont manifestées en faveur de l’intégration du projet, face à 153 oppositions et 6 abstentions <ref>{{Lien web|url=https://web.archive.org/web/20210311055050/https://meta.wikimedia.org/wiki/Requests_for_comment/Travel_Guide|titre=Requests for comment/Travel Guide|auteur=Méta-Wiki|consulté le=}}.</ref>. Comme cette nouvelle déclencha une migration importante depuis Wikitravel vers Wikivoyage, une plainte fut déposée par la société commerciale en charge du premier projet. Celle-ci fut toutefois rejetée et le projet Wikivoyage continua à prendre l’ampleur au sein du mouvement Wikimédia, avec la création de nouvelles versions linguistiques<ref>{{Lien web|auteur=Steven Musil|titre=Wikimedia, Internet Brands settle Wikivoyage lawsuits|url=https://web.archive.org/web/20211116013544/https://www.cnet.com/tech/services-and-software/wikimedia-internet-brands-settle-wikivoyage-lawsuits/|site=CNET|éditeur=|date=17 février 2013|consulté le=}}.</ref>.[[Fichier:WikiMOOC - vidéo 23 - Les projets frères.webm|vignette|<small>Vidéo 1. Présentation des projets frères dans le cadre du WIKIMOOC 2016.</small>|300x300px|gauche]]Comme ce fut le cas pour le projet [[n:fr:Accueil|Wikinews]], finalement accepté en 2004, des centaines de demandes d’ouvertures de nouveaux projets sont ainsi en attente d’évaluation suite au dépôt de leur candidature dans [[m:Proposals_for_new_projects|Méta-Wiki]]<ref>{{Lien web|auteur=Méta-Wiki|titre=Proposals for new projects|url=https://web.archive.org/web/20211019173812/https://meta.wikimedia.org/wiki/Proposals_for_new_projects|date=|consulté le=}}.</ref>. Ces attentes se soldent bien souvent par un refus, à l’image du projet WikiLang dont le but était de lancer un laboratoire linguistique<ref>{{Lien web|langue=|auteur=Méta-Wiki|titre=WikiLang|url=https://web.archive.org/web/20210109011449/https://meta.wikimedia.org/wiki/WikiLang|consulté le=}}</ref>. Mais cela n’empêche pas certains projets de voir le jour, comme ce fut le cas en octobre 2012, pour le projet de production d'une base de données structurée et sémantique nommée [[w:Wikidata|Wikidata]], et plus récement en 2020 avec ''[[w:Abstract_Wikipedia|Abstract Wikipedia]]''<ref>{{Lien web|langue=|auteur=Wikimedia Foundation Wiki|titre=Resolution:Abstract Wikipedia|url=https://web.archive.org/web/20201026191716/https://foundation.wikimedia.org/wiki/Resolution:Abstract_Wikipedia|date=|consulté le=}}.</ref> et son extension ''[[w:Wikifunctions|Wikifunctions]]''<ref>{{Lien web|langue=|auteur=Wikimedia Fundation|titre=Resolution:Abstract Wikipedia|url=https://web.archive.org/web/20200703234853/https://foundation.wikimedia.org/wiki/Resolution:Abstract_Wikipedia}}</ref>.
Ces trois projets interconnectés ont pour ambition de produire automatiquement des articles encyclopédiques dans tous les langages naturels pris en charge. Les phrases qui composent les articles seraient formées par des fonctions informatiques qui tireraient profit de la base de données Wikidata. À terme, le contenu de Wikidata devrait donc se retrouver traduit et agencé par ''Wikifunctions'', dans le but de produire des articles encyclopédiques rassemblés sur ''Abstract Wikipedia''<ref>{{Lien web|langue=|auteur=Thomas Douillard|titre=Abstract Wikipédia - LinuxFr.org|url=https://web.archive.org/web/20200923155546/https://linuxfr.org/news/abstract-wikipedia#fn1|site=Linux Fr|lieu=|date=05/09/20|consulté le=}}.</ref>.
Dans un autre cas de figure, il est possible qu’un projet ou une de ces versions linguistiques vienne à disparaître. Une liste de sites web proposés à la suppression est d'ailleurs mise à jour régulièrement sur la plateforme Méta-Wiki <ref>{{Lien web|auteur=Méta-Wiki|titre=Proposals for closing projects|url=https://web.archive.org/web/20210126030311/https://meta.wikimedia.org/wiki/Proposals_for_closing_projects|date=|consulté le=}}.</ref>. Dans celle-ci, on retrouve essentiellement des versions linguistiques de projets qui n’ont pas réussi à poursuivre leurs développements. Mais cela n'empêcherait pas qu'un jour, et faute d'activité dans toutes ses déclinaisons linguistiques, un projet tout entier soit soumis à suppression.
Le manque d'activité n'est pas non plus la seule raison valable de supression. En 2005 et peu de temps après son lancement, la version francophone du recueil de citations Wikiquote aurait en effet bien pu disparaitre. Le projet était accusé d’avoir récupéré le contenu d’une base de données soumise à un droit d’auteur restrictif et incompatible avec la licence Creative Commons appliquée sur l’ensemble des projets éditoriaux Wikimédia. La plainte fut adressée à l’association Wikimédia France, avant d’être relayée sur le site Méta-Wiki, où il fut question de fermier le projet<ref>{{Lien web|auteur1=Méta-Wiki|titre=Wikiquote FR/Closure of French Wikiquote|url=https://web.archive.org/web/20210204052058/https://meta.wikimedia.org/wiki/Wikiquote_FR/Closure_of_French_Wikiquote|date=}}.</ref>. Celui-ci fut toutefois maintenu, mais avec pour conditions de repartir de zéro, et d’établir une charte pour garantir la traçabilité des citations reprises par le projet<ref>{{Lien web|auteur1=Jean-Baptiste Soufron|titre=Redémarrage du Wikiquote Francophone / French Wikiquote Relaunch|url=https://web.archive.org/web/20200506074856/https://lists.wikimedia.org/pipermail/foundation-l/2006-March/019857.html|site=Foundation-l|lieu=|date=30 mars 2006}}.</ref>.
Sans prendre le temps de faire le tour de tous les projets apparus au sein du mouvement, voici donc de quoi se faire une idée sur la manière dont les projets frères et leurs versions linguistiques font leurs apparitions. Les exemples repris ci-dessus suffisent effectivement pour comprendre les principes généraux qui sous-tendent leurs créations. En dehors de Méta-Wiki, Wikidata, Wikifunctions'','' Abstract Wikipédia et Wikimedia Commons répondant à des besoins de coordination et de centralisation, les autres projets semblent effectivement provenir d’un désir de spécialisation d’un projet préexistant.
L'idée est généralement débattue dans un projet de même langue, avant d'être transmise vers Méta-Wiki, dans le but de discuter de la pertinence d'une candidature adressée au [[m:Wikimedia_Foundation_Community_Affairs_Committee/Sister_Projects_Task_Force/fr|groupe de travail des projets frères]] du [[m:Wikimedia_Foundation_Community_Affairs_Committee/fr|comité des affaires communautaires de la Fondation Wikimédia]]. Quant aux nouvelles versions linguistiques, elles doivent être soumises au [[m:Language_committee/fr|comité des langues]], avant de tester leur capacité de développement, sur Incubator, Beta-Wikiversité ou Wikisource Multilingue, pour bénéficier, une fois le test réussi, d’un site web indépendant.
Avant de clôtuer cette présentation des projets fères, il est important d'aborder une ambiguité courente concernant les sites dont les noms contiennent l’expression Wiki sont en relation avec le mouvement. Car 95 % des 20 000 sites web fonctionnant sur une technologie wiki n’ont en effet aucun lien avec le mouvement Wikimédia, à l’exception peut-être qu’ils utilisent le logiciel MediaWiki développé par la Fondation Wikimédia<ref>{{Lien web|langue=|auteur=WikiIndex|titre=the index of all wiki|url=https://web.archive.org/web/20201011073630/https://wikiindex.org/Category:All|site=|date=|consulté le=}}.</ref>.
[[w:fr:WikiLeaks|WikiLeaks]] par exemple, créé par [[w:fr:Julian Assange|Julian Assange]] dans le but de publier des documents classifiés provenant de sources anonymes, n’est ni un projet Wikimédia, ni un site collaboratif. Comme autre exemple, il y a ensuite le recueil universel et multilingue de guides illustrés [[w:fr:WikiHow|WikiHow]], qui fonctionne pour sa part de manière collaborative et avec le logiciel MediaWiki développé par la Fondation Wikimédia<ref>{{Lien web|auteur=WikiHow|titre=wikiHow:Powered and Inspired by MediaWiki|url=https://web.archive.org/web/20211030092737/https://www.wikihow.com/wikiHow:Powered-and-Inspired-by-MediaWiki|date=|consulté le=}}.</ref>, mais qui n'est pas pour autant en lien avec le mouvement Wikimédia. D'ailleurs, son ergonomie, radicalement différente de celle des projets Wikimédia, permet de le comprendre au premier coup d’œil.
L'encyclopédie libre pour enfant [[w:fr:Wikimini|Wikimini]], en revanche, a une apparence très proche de celle des projets Wikimédia. Mais contrairement au souhait de son fondateur, le projet n’aura jamais été accepté par la Fondation Wikimédia. Quant aux projets [[w:fr:WikiTribune|WikiTribune]] et [[w:fr:Wikia|Fandom]], ceux-ci entretienne encore une plus grande ambiguité, puisqu'ils ont été créé par [[w:fr:Jimmy Wales|Jimmy Wales]], le fondateur de Wikipédia et la [[w:fr:Wikimedia Foundation|Fondation Wikimédia]]<ref>{{Lien web|langue=|auteur=Terry Collins|titre=Wikipedia co-founder launches project to fight fake news|url=https://web.archive.org/web/20201014061304/https://www.cnet.com/news/wikipedia-jimmy-wales-wikitribune-fighting-fake-news/|site=CNET|date=24 avril 2017|consulté le=}}.</ref>, mais à des fins commerciales et lucrative. Ce qui les rends incompatibles avec le mouvement Wikimédia.
Au terme de ces explications concernant l'apparition des projets frères, il reste à signaler que certains projets et versions linguistiques, ont été créés bien avant que la perception du mouvement Wikimédia fasse son apparition. C'est en effet suite au brassage de projets, de langues et de cultures différentes, et grâce à une conscience collective, manifestée par une coordination centrale de toutes les activités via la plateforme Méta-Wiki, que l'idée d'un mouvement social a pris du sens au sein des activités Wikimédia. En ce sens, la naissance du mouvement ne fut pas un événement ponctuel, mais plutôt la réalisation d’un long processus de conscientisation.
{| class="wikitable"style="margin: auto;" "text-align:center;"
|+Codes QR
|[[Fichier:QR code page meta news.png|centré|sans_cadre|100x100px|lien=https://meta.wikimedia.org/wiki/Wikimedia_News]]
|[[Fichier:QR-Code ligne du temps projets Wikimédia.png|centré|sans_cadre|100x100px|lien=https://upload.wikimedia.org/wikipedia/commons/b/b0/WikipediaTimeline.png]]
|[[Fichier:Code QR vidéo présentation projets frères WikiMooc 2016.svg|centré|sans_cadre|100x100px]]
|-
|<small>Meta-Wiki</small>
|<small>Ligne du temps</small>
|<small>Vidéo projets frères</small>
|}
{{AutoCat}}
kju9fsfcn79ytbw7mryvtipq02cr3ll
Modèle:Sous-pages
10
83825
764603
763999
2026-04-23T05:27:47Z
PandaMystique
119061
764603
wikitext
text/x-wiki
<includeonly>
{{#ifeq:{{{haut de page|}}}|non||{{haut de page|livre={{{1|{{BOOKNAME}}}}}|{{#ifexist:{{{1|{{BOOKNAME}}}}}/Sommaire|{{{1|{{BOOKNAME}}}}}/Sommaire|{{BOOKNAME}}}}|image={{{image|{{#ifeq:{{{image|{{{2|}}}}}}|-||{{{2|}}}}}}}}}}}}
<br>
{{#ifeq:{{{bas de page|}}}|non||{{bas de page|{{#ifexist:{{{1|{{BOOKNAME}}}}}/Sommaire|{{{1|{{BOOKNAME}}}}}/Sommaire|{{BOOKNAME}}}}}}}}</includeonly>
4649pxge3t4ci9s4gn0kbbibxvqevci
764604
764603
2026-04-23T05:28:34Z
PandaMystique
119061
764604
wikitext
text/x-wiki
<includeonly>
{{#ifeq:{{{haut de page|}}}|non||{{haut de page|livre={{{1|''{{BOOKNAME}}''}}}|{{#ifexist:{{{1|''{{BOOKNAME}}''}}}/Sommaire|{{{1|''{{BOOKNAME}}''}}}/Sommaire|''{{BOOKNAME}}''}}|image={{{image|{{#ifeq:{{{image|{{{2|}}}}}}|-||{{{2|}}}}}}}}}}}}
<br>
{{#ifeq:{{{bas de page|}}}|non||{{bas de page|{{#ifexist:{{{1|''{{BOOKNAME}}''}}}/Sommaire|{{{1|''{{BOOKNAME}}''}}}/Sommaire|''{{BOOKNAME}}''}}}}}}</includeonly>
c5uedbp31mng5m85ygjyizb56si0l6h
764605
764604
2026-04-23T05:29:02Z
PandaMystique
119061
764605
wikitext
text/x-wiki
<includeonly>
''{{#ifeq:{{{haut de page|}}}|non||{{haut de page|livre={{{1|{{BOOKNAME}}}}}|{{#ifexist:{{{1|{{BOOKNAME}}}}}/Sommaire|{{{1|{{BOOKNAME}}}}}/Sommaire|{{BOOKNAME}}}}|image={{{image|{{#ifeq:{{{image|{{{2|}}}}}}|-||{{{2|}}}}}}}}}}}}''
<br>
{{#ifeq:{{{bas de page|}}}|non||{{bas de page|{{#ifexist:{{{1|{{BOOKNAME}}}}}/Sommaire|{{{1|{{BOOKNAME}}}}}/Sommaire|{{BOOKNAME}}}}}}}}</includeonly>
lqoh7b6pl3xnwqzf6t76wvs9bjniwsy
764606
764605
2026-04-23T05:29:38Z
PandaMystique
119061
764606
wikitext
text/x-wiki
<includeonly>
{{#ifeq:{{{haut de page|}}}|non||{{haut de page|livre=''{{{1|{{BOOKNAME}}}}}''|{{#ifexist:{{{1|{{BOOKNAME}}}}}/Sommaire|{{{1|{{BOOKNAME}}}}}/Sommaire|{{BOOKNAME}}}}|image={{{image|{{#ifeq:{{{image|{{{2|}}}}}}|-||{{{2|}}}}}}}}}}}}
<br>
{{#ifeq:{{{bas de page|}}}|non||{{bas de page|{{#ifexist:{{{1|{{BOOKNAME}}}}}/Sommaire|{{{1|{{BOOKNAME}}}}}/Sommaire|{{BOOKNAME}}}}}}}}</includeonly>
titwnqvv5pl59nqi5z874qba4q6eu86
764607
764606
2026-04-23T05:30:04Z
PandaMystique
119061
764607
wikitext
text/x-wiki
<includeonly>
{{#ifeq:{{{haut de page|}}}|non||{{haut de page|livre={{{1|{{BOOKNAME}}}}}|{{#ifexist:{{{1|{{BOOKNAME}}}}}/Sommaire|{{{1|{{BOOKNAME}}}}}/Sommaire|{{BOOKNAME}}}}|image={{{image|{{#ifeq:{{{image|{{{2|}}}}}}|-||{{{2|}}}}}}}}}}}}
<br>
{{#ifeq:{{{bas de page|}}}|non||{{bas de page|{{#ifexist:{{{1|{{BOOKNAME}}}}}/Sommaire|{{{1|{{BOOKNAME}}}}}/Sommaire|{{BOOKNAME}}}}}}}}</includeonly>
4649pxge3t4ci9s4gn0kbbibxvqevci
Introduire la biodiversité dans la construction et l'urbanisme/Biodiversité dans l'environnement bâti : de quoi parlons nous ?/Microflore et microbiote
0
83827
764592
764252
2026-04-23T01:00:31Z
JackBot
14683
Formatage, [[Spécial:Pages non catégorisées]]
764592
wikitext
text/x-wiki
Des études récentes ont montré qu'il existe des liens forts entre le microbiote humain (microbiote cutané notamment) et l'équivalent d'un « microbiote du bâtiment » ; L'habitat semble fonctionner comme un ''écosystème microbien partagé'', où les occupants humains influencent fortement les communautés microbiennes intérieures et inversement. Ceci n'est pas vraiment surprenant étant donné que les humains passent près de 90 % de leur vie dans des environnements bâtis.
Ces interactions soulèvent des enjeux jusqu'alors ignorés, mais peut être majeurs pour l’urbanisme sain (encore à définir ou redéfinir car les approches hyper-hygiénistes s'avèrent contre-productives voire dangereuses) et pour la conception des bâtiments et des villes, qui doivent favoriser des environnements intérieurs sains, ventilés mais non stériles, favorables à une biodiversité microbienne bénéfique et, tant que possible, défavorable aux microbes pathogènes. Dans une perspective ''[[w:fr:One Health|One Health]]'', comprendre ces dynamiques permet d’intégrer la santé humaine, la qualité de l’air intérieur et la soutenabilité des espaces bâtis dans une même approche écologique.
== Similitudes entre le microbiote humain et le microbiote du bâtiment ==
Le '''microbiote du bâtiment''' désigne ici l’ensemble des micro-organismes (bactéries, champignons, virus) présents dans nos environnements intérieurs. Des chercheurs ont récemment montré qu’il présente de fortes analogies avec le '''microbiote humain''', a priori en raison des échanges constants entre les occupants et leur habitat. La présence de chats, chiens, oiseaux, etc peut aussi le moduler.
De même que le bébé humain acquiert l'essentiel de son microbiote de sa mère et de son environnement après la naissance, on constate que les bâtiments neufs acquièrent égalemnet, progressivement, leur microbiote, passant d’une communauté dominée par l’extérieur à une communauté de plus en plus influencée par la présence humaine après la première ocupation du lieu. Une fois le bâtiment occupé, la richesse et la diversité bactérienne diminuent nettement, tandis que les microbes associés à l’humain (dont ''[[w:Escherichia|Escherichia]], [[w:Pseudomonas|Pseudomonas]], [[w:Klebsiella|Klebsiella]]'') deviennent plus abondants, sous l’effet des interventions humaines et de la sélection environnementale intérieure. L’étude montre que des facteurs architecturaux comme la ventilation, le débit d’air, l’humidité et la température influencent fortement cette transition, ouvrant la voie à une gestion du microbiote intérieur par le design et l’exploitation des bâtiments<ref>{{Article |langue=en |prénom1=Gregory R. |nom1=Young |prénom2=Angela |nom2=Sherry |prénom3=Darren L. |nom3=Smith |titre=Built environment microbiomes transition from outdoor to human-associated communities after construction and commissioning |périodique=www.nature.com |volume=13 |numéro=1 |pages=15854 |date=2023-09-22 |issn=2045-2322 |doi=10.1038/s41598-023-42427-0 |lire en ligne=https://www.nature.com/articles/s41598-023-42427-0 |consulté le=2026-04-21}}</ref>.
=== Origine humaine majoritaire des micro-organismes intérieurs ===
Des études pionnières menées aux USA, dont par le biologiste '''Jack A. Gilbert''' dans le cadre du Home Microbiome Project ont montré que la composition microbienne d’un logement reflète rapidement celle de ses occupants<ref>Jack A. Gilbert et al., ''Microbial ecology of the home environment'', Proceedings of the Royal Society B, 2014.</ref>.
Selon ces travaux, la majorité des bactéries retrouvées sur les surfaces intérieures proviennent de la peau, de la bouche ou du système respiratoire humain.
Les environnements intérieurs conservent des signatures chimiques et microbiennes propres à chaque individu, permettant d’identifier qui a touché quels objets et d’inférer certains aspects de mode de vie (alimentation, médicaments, produits d’hygiène). En combinant métabolomique, séquençage microbien et cartographie moléculaire 3D, li est possible de cartographier en 3 dimensions et dans le temps les interactions entre humains et objets, ce qui est de plus en plus utilisé par les enquêtes politique set les sciences forensiques<ref>Kapono, C.A., Morton, J.T., Bouslimani, A. et al. Creating a 3D microbial and chemical snapshot of a human habitat. Sci Rep 8, 3669 (2018). https://doi.org/10.1038/s41598-018-21541-4</ref>.
=== Similarités structurelles entre microbiotes ===
Les deux microbiotes (celui du bâtiment, et celui des habitants) partagent plusieurs caractéristiques :
* une forte proportion de bactéries issues des phyla '''Firmicutes''' et '''Actinobacteria''', typiques du [[w:fr:microbiote cutané humain|microbiote cutané humain]]<ref>H. Lax et al., ''Longitudinal analysis of microbial interactions between humans and the indoor environment'', Science, 2014.</ref> ;
* une dynamique influencée par les comportements humains (fréquentation des pièces, ventilation, type et fréquence de nettoyage) ; par exemple, Kembel et al. ont montré en 2012 que les pièces ventilées mécaniquement abritent des communautés bactériennes moins diversifiées, et plus riches en microbes associés à l’humain — parfois proches de pathogènes — tandis que les pièces ventilées par l'ouverture de portes ou fenêtres présentent une composition intermédiaire entre l’extérieur et les espaces mécaniquement ventilés. Le design architectural et les conditions intérieures (débit d’air, humidité, température) peuvent donc être utilisés pour orienter la composition du microbiome intérieur, avec des implications directes pour la santé humaine et la gestion des risques dans les environnements bâtis encore à définir.
* une organisation en communautés microbiennes stables mais modulables selon les conditions environnementales (humidité, température, matériaux)<ref>{{Article |langue=en |prénom1=Steven W |nom1=Kembel |prénom2=Evan |nom2=Jones |prénom3=Jeff |nom3=Kline |prénom4=Dale |nom4=Northcutt |titre=Architectural design influences the diversity and structure of the built environment microbiome |périodique=Multidisciplinary Journal of Microbial Ecology|volume=6 |numéro=8 |pages=1469–1479 |date=2012-08-01 |issn=1751-7362 |issn2=1751-7370 |pmid=22278670 |pmcid=3400407 |doi=10.1038/ismej.2011.211 |lire en ligne=https://academic.oup.com/ismej/article/6/8/1469/7587766 |consulté le=2026-04-21}}</ref>.
=== Influence des matériaux et des conditions intérieures ===
Les travaux de la microbiologiste '''Jessica Green''' (Université de l'Oregon) ont montré que les bâtiments fonctionnent comme des écosystèmes particuliers, où les matériaux, la ventilation et l’architecture influencent plus ou moins saisonnièrement la composition microbienne du lieu<ref>Jessica L. Green et al., ''Buildings, microbiomes, and health'', Nature Reviews Microbiology, 2017.</ref> ; par exemple, les virus présents dans l’air d’une crèche montrent une forte saisonnalité, avec une dominance de virus associés à l’humain en hiver, et de virus associés aux plantes en été<ref>Prussin, A.J., Torres, P.J., Shimashita, J. et al. Seasonal dynamics of DNA and RNA viral bioaerosol communities in a daycare center. Microbiome 7, 53 (2019). https://doi.org/10.1186/s40168-019-0672-z</ref>.
Cependant, même dans des environnements très différents, une part importante du microbiote intérieur reste d’origine humaine. Ceci explique les similitudes observées avec le microbiote cutané et respiratoire.
=== Transferts bidirectionnels entre humains et bâtiments ===
Les échanges microbiens entre humains et bâtiments sont '''bidirectionnels''' :
* les occupants déposent des micro-organismes sur les surfaces ;
* les surfaces et l’air intérieur peuvent en retour influencer le microbiote humain, notamment cutané et respiratoire<ref>M. Dannemiller et al., ''Indoor microbial communities: ecology and health effects'', Annual Review of Public Health, 2017.</ref>.
Cette relation réciproque conduit certains chercheurs à considérer les bâtiments comme une « extension écologique » du microbiote humain.
=== Approches récentes et implications ===
Les recherches récentes en '''microbiologie du bâti''' (''building microbiome science'') soulignent l’importance de concevoir des environnements intérieurs favorisant une diversité microbienne bénéfique, dont en utilisant la ventilation naturelle, les matériaux poreux, et par un usage parcimonieux et raisonné des biocides (eau de javel notamment).
Ces travaux s’inscrivent dans une perspective de [[w:santé publique|santé publique]], en lien avec la notion d’'''[[w:exposome|exposome]]''' (qui intègre l’ensemble des expositions environnementales influençant la santé humaine, ou animale pour les animaux domestiques). Néanmoins, on ne sait pas encore définir ce qu’est un environnement intérieur “sain”, ni comment modifier de manière fiable la ventilation, les matériaux ou la conception et l'usage des bâtiments pour influencer positivement ces communautés microbiennes.
Un rapport<ref>{{Ouvrage |langue=en |prénom1=National Academies of Sciences, Engineering, and |nom1=Medicine |prénom2=National Academy of |nom2=Engineering |prénom3=Division on Engineering and Physical |nom3=Sciences |prénom4=Health and Medicine |nom4=Division |titre=Microbiomes of the Built Environment: A Research Agenda for Indoor Microbiology, Human Health, and Buildings |éditeur=National Academies Press |date=2017-11-06 |isbn=978-0-309-44980-9 |lire en ligne=https://books.google.fr/books?id=6LA5DwAAQBAJ&printsec=frontcover&hl=fr&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false |consulté le=2026-04-21}}</ref> du NASEM (National Academies of Sciences, Engineering, and Medicine), intitulé ''Microbiomes of the Built Environment: A Research Agenda for Indoor Microbiology, Human Health, and Buildings'', a en 2017, souligné la nécessité d’une [[w:Approche écosystémique|approche écosystémique]] et interdisciplinaire pour comprendre ces interactions complexes et orienter des décisions éclairées en matière d’habitat, d’urbanisme et de santé environnementale.
Beaucoup de microbes (bactéries, virus) ne survivent pas longtemps sur les surfaces sèches, mais malgré cette biomasse réduite, le microbiome intérieur influence grandement la santé humaine, et en particulier l'immunité, le risque de maladies infectieuses et potentiellement les systèmes endocrinien et neurologique. Ce sujet devient crucial à mesure que l’urbanisation augmente. Les avancées récentes en microbiome montrent la nécessité de concevoir des espaces bâtis favorisant un microbiome intérieur bénéfique. xxx ont proposé des stratégies pour cela<ref>Gilbert, J.A., Hartmann, E.M. The indoors microbiome and human health. Nat Rev Microbiol 22, 742–755 (2024). https://doi.org/10.1038/s41579-024-01077-3 |https://www.nature.com/articles/s41579-024-01077-3</ref>. <br> Concernant les virus, on a constaté que les environnements bâtis abritent des communautés virales très dépendantes du type d’espace et de son niveau d’occupation, avec une forte présence de virus de la classe ''Caudoviricetes'' sur les surfaces. Les viromes intérieurs montrent des gènes de résistance antimicrobienne et des indices d'interactions étroites avec leurs hôtes bactériens, incluant des systèmes CRISPR/Cas et anti‑CRISPR, qui montrent une dynamique active de coévolution. L’étude montre que les virus sont des acteurs essentiels du microbiome intérieur, influencés par les usages humains et capables d’aider leurs hôtes bactériens à s’adapter à des habitats spécifiques<ref>Du, S., Tong, X., Lai, A.C.K. et al. Highly host-linked viromes in the built environment possess habitat-dependent diversity and functions for potential virus-host coevolution. Nat Commun 14, 2676 (2023). https://doi.org/10.1038/s41467-023-38400-0</ref>.
== Bibliographie ==
* {{Ouvrage |langue=en |prénom1=National Academies of Sciences, Engineering, and |nom1=Medicine |prénom2=National Academy of |nom2=Engineering |prénom3=Division on Engineering and Physical |nom3=Sciences |prénom4=Health and Medicine |nom4=Division |titre=Microbiomes of the Built Environment: A Research Agenda for Indoor Microbiology, Human Health, and Buildings |éditeur=National Academies Press |date=2017-11-06 |isbn=978-0-309-44980-9 |lire en ligne=https://books.google.fr/books?id=6LA5DwAAQBAJ&printsec=frontcover&hl=fr&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false |consulté le=2026-04-21}}
* {{Article |prénom1=Simon |nom1=Lax |prénom2=Daniel P. |nom2=Smith |prénom3=Jarrad |nom3=Hampton-Marcell |prénom4=Sarah M. |nom4=Owens |titre=Longitudinal analysis of microbial interaction between humans and the indoor environment |périodique=science.org (Atypon) |volume=345 |numéro=6200 |pages=1048–1052 |date=2014-08-29 |pmid=25170151 |pmcid=4337996 |doi=10.1126/science.1254529 |lire en ligne=https://www.science.org/doi/abs/10.1126/science.1254529 |consulté le=2026-04-21}}
* {{Article |langue=en |prénom1=Steven W |nom1=Kembel |prénom2=Evan |nom2=Jones |prénom3=Jeff |nom3=Kline |prénom4=Dale |nom4=Northcutt |titre=Architectural design influences the diversity and structure of the built environment microbiome |périodique=Multidisciplinary Journal of Microbial Ecology|volume=6 |numéro=8 |pages=1469–1479 |date=2012-08-01 |issn=1751-7362 |issn2=1751-7370 |pmid=22278670 |pmcid=3400407 |doi=10.1038/ismej.2011.211 |lire en ligne=https://academic.oup.com/ismej/article/6/8/1469/7587766 |consulté le=2026-04-21}}
== Références ==
{{AutoCat}}
3l995ocv3pmaniq7ap9h6zscubuvh4n
Introduire la biodiversité dans la construction et l'urbanisme/Biodiversité dans l'environnement bâti : de quoi parlons nous ?/Changer la notion d'espaces verts
0
83829
764504
2026-04-22T18:56:56Z
Lamiot
1916
compléments
764504
wikitext
text/x-wiki
= De l’espace vert à l’infrastructure écologique urbaine =
[[File:Écopaturage urbain Lille moutons chèvres landscape grazing Mai 2019bandeau.jpg|thumb|center|upright=3|Écopâturage urbain|alt=Ecopâturage urbain dans le Bois de la citadelle, à Lille]]
[[File:Parc Barbieux, Roubaix J1.jpg|thumb|Vaste espace ouvert, engazonné (Parc Barbieux, Roubaix, 2014)]]
[[File:Jielbeaumadier parc barbieux 2 roubaix 2006.jpg|thumb|Aménagement paysager (Parc Barbieux de Roubaix, 2006)]]
La notion d’« [[w:Espace verte|espace vert]] » en urbanisme a longtemps été associée à des fonctions surtout esthétiques, récréatives ou hygiénistes.
Elle peut désormais s'inscrire dans le '''[[w:Infrastructure verte|réseau des infrastructures écologique urbaine]]''' et tendre à devenir un ''espace à haute valeur écosystémique'', conçu non plus seulement pour offrir les aménités d'un jardin beau et reposant, mais aussi destiné à soutenir la biodiversité, restaurer les fonctionnalités écologiques et renforcer la résilience des territoires face aux perturbations, notamment climatiques (inondations et [[w:Bulle de chaleur urbaine|bulles de chaleur urbaine]] notamment)<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Stratégie de l’UE en matière d’infrastructure verte|url=https://climate-adapt.eea.europa.eu/fr/metadata/publications/eu-green-infrastructure-strategy|site=European Environment Agency}}</ref>..
Cette évolution s’inscrit dans le cadre de l’[[w:Écologie du paysage|écologie du paysage]], des [[w:Solutions fondées sur la nature|solutions fondées sur la nature]] et des politiques de connectivité écologique. Elle suppose de considérer les espaces végétalisés, les sols, les eaux et les habitats associés comme des composantes fonctionnelles d’un [[w:Réseau écologique|réseau écologique]], et non comme de simples surfaces décoratives ou résiduelles<ref>{{Lien web|langue=fr|titre=Les réseaux écologiques contre le déclin de la biodiversité ?|url=https://www.encyclopedie-environnement.org/vivant/reseaux-ecologiques-biodiversite-amenagement-territoire/|site=Encyclopédie de l’environnement}}</ref>.
== Services écosystémiques prioritaires ==
Les espaces verts urbains fournissent plusieurs catégories de [[w:Service écosystémique|services écosystémiques]]. En contexte urbain, les services les plus stratégiques sont généralement les '''services de régulation''' et les '''services culturels''', car ensemble, ils contribuent directement à l’adaptation climatique, à la santé publique et au bien-être des habitants<ref>{{Lien web|langue=fr|titre=Les services rendus par la biodiversité|url=https://ofb.gouv.fr/les-services-rendus-par-la-biodiversite|site=Office français de la biodiversité}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Les services écosystémiques urbains, vers une multifonctionnalité des espaces verts publics|url=https://www.erudit.org/en/journals/eue/2017-v11-eue03888/1050485ar/|site=Environnement urbain}}</ref>..
Les services de régulation comprennent notamment :
* l’atténuation des îlots de chaleur urbains par l’ombrage et l’évapotranspiration ;
* la gestion des eaux pluviales par l’infiltration, le ralentissement du ruissellement et le soutien à l’épuration naturelle ;
* l’amélioration de la qualité de l’air ;
* la réduction de certains risques liés aux épisodes extrêmes, notamment les canicules et les inondations<ref>{{Lien web|langue=fr|titre=Les services rendus par la biodiversité|url=https://ofb.gouv.fr/les-services-rendus-par-la-biodiversite|site=Office français de la biodiversité}}</ref>..
Les services culturels et sociaux incluent l’accès à la nature, le bien-être psychologique, les pratiques de loisirs, les fonctions éducatives, l’identité paysagère et la cohésion sociale. En milieu dense, ces services sont aussi des leviers d’acceptabilité sociale des projets de renaturation et de protection de la biodiversité<ref>{{Lien web|langue=fr|titre=Les services écosystémiques urbains, vers une multifonctionnalité des espaces verts publics|url=https://www.erudit.org/en/journals/eue/2017-v11-eue03888/1050485ar/|site=Environnement urbain}}</ref>..
Les services d’approvisionnement existent également, mais ils sont souvent secondaires en ville ; ils concernent par exemple la production de biomasse, de fruits, de graines ou de bois. Les services de soutien, comme la formation des sols, le recyclage des nutriments ou l’hébergement d’habitats, sont moins visibles mais essentiels au fonctionnement des écosystèmes urbains<ref>{{Lien web|langue=fr|titre=Les services rendus par la biodiversité|url=https://ofb.gouv.fr/les-services-rendus-par-la-biodiversite|site=Office français de la biodiversité}}</ref>.
== Biodiversité comme priorité ==
Le passage d’un espace vert ornemental à un espace écologique implique de faire de la biodiversité un objectif de conception, de gestion et d’évaluation. Il ne s’agit plus seulement de paysager de manière classique en terrassant et en plantant du végétal ornemental structuré, mais de créer des milieux dynamique et favorables à une diversité d’espèces, de strates, de microhabitats et de processus écologiques proches de ceux qui existent dans la Nature<ref>{{Lien web|langue=fr|titre=Des espaces verts écologiques en ville|url=https://www.lpo.fr/la-lpo-en-actions/mobilisation-citoyenne/nature-en-ville/fiches-conseils-nature-en-ville/des-espaces-verts-ecologiques-en-ville|site=LPO}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>..
Cette priorité suppose de favoriser les espèces locales, mieux adaptées aux contextes biogéographiques, ainsi que certaines espèces dites ''[[w:espèce facilitatrice|facilitatrices]]'' et ''[[w:espèce ingénieur|ingénieures]]'', capables de modifier leur environnement de manière positive pour d’autres organismes. Leur présence peut contribuer à structurer les habitats, à stabiliser les sols, à réguler l’humidité, à créer de l’ombre ou à générer des refuges écologiques<ref>{{Lien web|langue=fr|titre=Espèce ingénieure|url=https://fr.wikipedia.org/wiki/Esp%C3%A8ce_ing%C3%A9nieure|site=Wikipédia}}</ref>..
Cette logique doit cependant rester écologiquement prudente : l’intérêt d’une espèce dépend du contexte local, de son origine biogéographique et du risque d’introduction d’espèces exotiques envahissantes. La bonne approche n’est donc pas la standardisation, mais l’adéquation entre espèces, sols, hydrologie, usages et continuités écologiques<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>..
== Réseau écologique urbain ==
Pour être réellement fonctionnels, les espaces verts doivent être intégrés dans un '''[[w:Réseau écologique|réseau écologique urbain]]''' garantissant la circulation, l’alimentation, la reproduction et le refuge des espèces. La simple présence d’îlots végétalisés ne suffit pas si ceux-ci restent isolés les uns des autres ou séparés par des obstacles infranchissables<ref>{{Lien web|langue=fr|titre=Les réseaux écologiques contre le déclin de la biodiversité ?|url=https://www.encyclopedie-environnement.org/vivant/reseaux-ecologiques-biodiversite-amenagement-territoire/|site=Encyclopédie de l’environnement}}</ref>..
Ce réseau associe plusieurs trames complémentaires :
* '''[[w:Trame verte|trame verte]]''' : parcs, jardins, friches, haies, alignements d’arbres et continuités végétales ;
* '''[[w:Trame bleue|trame bleue]]''' : cours d’eau, mares, zones humides, fossés et berges ;
* '''[[w:Trame brune|trame brune]]''' : sols vivants, continuités pédologiques, zones peu artificialisées et milieux favorables à la faune et à la flore du sol ;
* '''[[w:Trame noire|trame noire]]''' : réduction de la pollution lumineuse ;
* '''[[w:Trame blanchetrame blanche|trame blanche (de silience)]]''' : milieux ouverts, prairies, friches herbacées, [[w:Corridor biologique|corridors biologiques]]<ref>{{Lien web|langue=fr|titre=Trame noire - Méthodes d'élaboration et outils pour sa mise en oeuvre|url=https://ofb.gouv.fr/doc/trame-noire-methodes-elaboration-et-outils-pour-sa-mise-en-oeuvre|site=Office français de la biodiversité}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Trames verte bleue et noire|url=https://www.siarja.fr/trames-verte-bleue-et-noire|site=SIARJA}}</ref>.
À l’échelle urbaine, ces trames doivent être pensées du quartier à la ville entière ; à l’échelle régionale, elles doivent s’articuler avec les continuités écologiques du territoire biogéographique ; à l’échelle supra-régionale, elles peuvent s’inscrire dans des cadres plus vastes, tels que les réseaux écologiques européens<ref>{{Lien web|langue=fr|titre=Les réseaux écologiques contre le déclin de la biodiversité ?|url=https://www.encyclopedie-environnement.org/vivant/reseaux-ecologiques-biodiversite-amenagement-territoire/|site=Encyclopédie de l’environnement}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Textes adoptés - L’importance de l’infrastructure verte urbaine|url=https://www.europarl.europa.eu/doceo/document/TA-9-2020-0241_FR.html|site=Parlement européen}}</ref>.
== Gestion restauratoire ==
La gestion des espaces verts évolue vers une '''gestion restauratoire''', c’est-à-dire une gestion orientée vers la restauration ou le maintien des fonctions écologiques, et non vers la simple conservation d’un aspect paysager figé. Cette approche privilégie la dynamique des écosystèmes, la diversité structurelle et la réduction des interventions inutiles<ref>{{Lien web|langue=fr|titre=Préserver, conserver ou restaurer les milieux et leurs fonctionnalités|url=https://ofb.gouv.fr/preserver-conserver-ou-restaurer-les-milieux-et-leurs-fonctionnalites|site=Office français de la biodiversité}}</ref>.
Elle repose notamment sur :
* la diminution des intrants chimiques et une éventuelle [[w:eutrophisation|déseutrophisation]]
* la diversification des habitats ;
* la fauche tardive et/ou différenciée ;
* l'import et/ou la conservation du bois mort lorsque cela est compatible avec la sécurité ;
* le cycle de la matière organique ;
* la prise en compte des cycles biologiques et des périodes et besoins de tranquillité pour la faune<ref>{{Lien web|langue=fr|titre=Gestion des espaces verts : vers un modèle plus vertueux|url=https://www.saran.fr/gestion-differenciee-espaces-verts|site=Mairie de Saran}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Des espaces verts écologiques en ville|url=https://www.lpo.fr/la-lpo-en-actions/mobilisation-citoyenne/nature-en-ville/fiches-conseils-nature-en-ville/des-espaces-verts-ecologiques-en-ville|site=LPO}}</ref>.
Cette gestion peut être qualifiée de restauratoire lorsqu’elle vise explicitement à rétablir des fonctions perdues : infiltration de l’eau, pollinisation, continuité d’habitats, stockage de carbone, fonctionnalité des sols, régulation thermique et accueil d’espèces inféodées aux milieux urbains ou périurbains<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>.
== Enjeux pour l’urbanisme ==
Pour l'urbaniste, ceci implique de concevoir les espaces verts comme des composantes d’un système socio-écologique et non comme des reliques décoratives officiellement simulées et entretenues. Il doit donc intégrer les sols, l’eau, la lumière, les usages, les temporalités biologiques et les continuités écologiques dès la planification et non en fin de projet<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>.
Elle suppose aussi de privilégier les solutions fondées sur la nature, les infrastructures vertes et bleues, et une articulation cohérente entre biodiversité, santé publique, gestion des risques et qualité du cadre de vie. Dans cette perspective, l’espace vert devient une infrastructure vivante, utile à la fois aux habitants et aux autres formes du vivant<ref>{{Lien web|langue=fr|titre=Stratégie de l’UE en matière d’infrastructure verte|url=https://climate-adapt.eea.europa.eu/fr/metadata/publications/eu-green-infrastructure-strategy|site=European Environment Agency}}</ref>.
== Références ==
rcohhar3gg4f27f82pl7vjnzscf2cj1
764505
764504
2026-04-22T18:57:44Z
Lamiot
1916
/* De l’espace vert à l’infrastructure écologique urbaine */ légende image
764505
wikitext
text/x-wiki
= De l’espace vert à l’infrastructure écologique urbaine =
[[File:Écopaturage urbain Lille moutons chèvres landscape grazing Mai 2019bandeau.jpg|thumb|center|upright=3|Écopâturage urbain (Lille, bois de la Citadelle)|alt=Ecopâturage urbain dans le Bois de la citadelle, à Lille]]
[[File:Parc Barbieux, Roubaix J1.jpg|thumb|Vaste espace ouvert, engazonné (Parc Barbieux, Roubaix, 2014)]]
[[File:Jielbeaumadier parc barbieux 2 roubaix 2006.jpg|thumb|Aménagement paysager (Parc Barbieux de Roubaix, 2006)]]
La notion d’« [[w:Espace verte|espace vert]] » en urbanisme a longtemps été associée à des fonctions surtout esthétiques, récréatives ou hygiénistes.
Elle peut désormais s'inscrire dans le '''[[w:Infrastructure verte|réseau des infrastructures écologique urbaine]]''' et tendre à devenir un ''espace à haute valeur écosystémique'', conçu non plus seulement pour offrir les aménités d'un jardin beau et reposant, mais aussi destiné à soutenir la biodiversité, restaurer les fonctionnalités écologiques et renforcer la résilience des territoires face aux perturbations, notamment climatiques (inondations et [[w:Bulle de chaleur urbaine|bulles de chaleur urbaine]] notamment)<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Stratégie de l’UE en matière d’infrastructure verte|url=https://climate-adapt.eea.europa.eu/fr/metadata/publications/eu-green-infrastructure-strategy|site=European Environment Agency}}</ref>..
Cette évolution s’inscrit dans le cadre de l’[[w:Écologie du paysage|écologie du paysage]], des [[w:Solutions fondées sur la nature|solutions fondées sur la nature]] et des politiques de connectivité écologique. Elle suppose de considérer les espaces végétalisés, les sols, les eaux et les habitats associés comme des composantes fonctionnelles d’un [[w:Réseau écologique|réseau écologique]], et non comme de simples surfaces décoratives ou résiduelles<ref>{{Lien web|langue=fr|titre=Les réseaux écologiques contre le déclin de la biodiversité ?|url=https://www.encyclopedie-environnement.org/vivant/reseaux-ecologiques-biodiversite-amenagement-territoire/|site=Encyclopédie de l’environnement}}</ref>.
== Services écosystémiques prioritaires ==
Les espaces verts urbains fournissent plusieurs catégories de [[w:Service écosystémique|services écosystémiques]]. En contexte urbain, les services les plus stratégiques sont généralement les '''services de régulation''' et les '''services culturels''', car ensemble, ils contribuent directement à l’adaptation climatique, à la santé publique et au bien-être des habitants<ref>{{Lien web|langue=fr|titre=Les services rendus par la biodiversité|url=https://ofb.gouv.fr/les-services-rendus-par-la-biodiversite|site=Office français de la biodiversité}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Les services écosystémiques urbains, vers une multifonctionnalité des espaces verts publics|url=https://www.erudit.org/en/journals/eue/2017-v11-eue03888/1050485ar/|site=Environnement urbain}}</ref>..
Les services de régulation comprennent notamment :
* l’atténuation des îlots de chaleur urbains par l’ombrage et l’évapotranspiration ;
* la gestion des eaux pluviales par l’infiltration, le ralentissement du ruissellement et le soutien à l’épuration naturelle ;
* l’amélioration de la qualité de l’air ;
* la réduction de certains risques liés aux épisodes extrêmes, notamment les canicules et les inondations<ref>{{Lien web|langue=fr|titre=Les services rendus par la biodiversité|url=https://ofb.gouv.fr/les-services-rendus-par-la-biodiversite|site=Office français de la biodiversité}}</ref>..
Les services culturels et sociaux incluent l’accès à la nature, le bien-être psychologique, les pratiques de loisirs, les fonctions éducatives, l’identité paysagère et la cohésion sociale. En milieu dense, ces services sont aussi des leviers d’acceptabilité sociale des projets de renaturation et de protection de la biodiversité<ref>{{Lien web|langue=fr|titre=Les services écosystémiques urbains, vers une multifonctionnalité des espaces verts publics|url=https://www.erudit.org/en/journals/eue/2017-v11-eue03888/1050485ar/|site=Environnement urbain}}</ref>..
Les services d’approvisionnement existent également, mais ils sont souvent secondaires en ville ; ils concernent par exemple la production de biomasse, de fruits, de graines ou de bois. Les services de soutien, comme la formation des sols, le recyclage des nutriments ou l’hébergement d’habitats, sont moins visibles mais essentiels au fonctionnement des écosystèmes urbains<ref>{{Lien web|langue=fr|titre=Les services rendus par la biodiversité|url=https://ofb.gouv.fr/les-services-rendus-par-la-biodiversite|site=Office français de la biodiversité}}</ref>.
== Biodiversité comme priorité ==
Le passage d’un espace vert ornemental à un espace écologique implique de faire de la biodiversité un objectif de conception, de gestion et d’évaluation. Il ne s’agit plus seulement de paysager de manière classique en terrassant et en plantant du végétal ornemental structuré, mais de créer des milieux dynamique et favorables à une diversité d’espèces, de strates, de microhabitats et de processus écologiques proches de ceux qui existent dans la Nature<ref>{{Lien web|langue=fr|titre=Des espaces verts écologiques en ville|url=https://www.lpo.fr/la-lpo-en-actions/mobilisation-citoyenne/nature-en-ville/fiches-conseils-nature-en-ville/des-espaces-verts-ecologiques-en-ville|site=LPO}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>..
Cette priorité suppose de favoriser les espèces locales, mieux adaptées aux contextes biogéographiques, ainsi que certaines espèces dites ''[[w:espèce facilitatrice|facilitatrices]]'' et ''[[w:espèce ingénieur|ingénieures]]'', capables de modifier leur environnement de manière positive pour d’autres organismes. Leur présence peut contribuer à structurer les habitats, à stabiliser les sols, à réguler l’humidité, à créer de l’ombre ou à générer des refuges écologiques<ref>{{Lien web|langue=fr|titre=Espèce ingénieure|url=https://fr.wikipedia.org/wiki/Esp%C3%A8ce_ing%C3%A9nieure|site=Wikipédia}}</ref>..
Cette logique doit cependant rester écologiquement prudente : l’intérêt d’une espèce dépend du contexte local, de son origine biogéographique et du risque d’introduction d’espèces exotiques envahissantes. La bonne approche n’est donc pas la standardisation, mais l’adéquation entre espèces, sols, hydrologie, usages et continuités écologiques<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>..
== Réseau écologique urbain ==
Pour être réellement fonctionnels, les espaces verts doivent être intégrés dans un '''[[w:Réseau écologique|réseau écologique urbain]]''' garantissant la circulation, l’alimentation, la reproduction et le refuge des espèces. La simple présence d’îlots végétalisés ne suffit pas si ceux-ci restent isolés les uns des autres ou séparés par des obstacles infranchissables<ref>{{Lien web|langue=fr|titre=Les réseaux écologiques contre le déclin de la biodiversité ?|url=https://www.encyclopedie-environnement.org/vivant/reseaux-ecologiques-biodiversite-amenagement-territoire/|site=Encyclopédie de l’environnement}}</ref>..
Ce réseau associe plusieurs trames complémentaires :
* '''[[w:Trame verte|trame verte]]''' : parcs, jardins, friches, haies, alignements d’arbres et continuités végétales ;
* '''[[w:Trame bleue|trame bleue]]''' : cours d’eau, mares, zones humides, fossés et berges ;
* '''[[w:Trame brune|trame brune]]''' : sols vivants, continuités pédologiques, zones peu artificialisées et milieux favorables à la faune et à la flore du sol ;
* '''[[w:Trame noire|trame noire]]''' : réduction de la pollution lumineuse ;
* '''[[w:Trame blanchetrame blanche|trame blanche (de silience)]]''' : milieux ouverts, prairies, friches herbacées, [[w:Corridor biologique|corridors biologiques]]<ref>{{Lien web|langue=fr|titre=Trame noire - Méthodes d'élaboration et outils pour sa mise en oeuvre|url=https://ofb.gouv.fr/doc/trame-noire-methodes-elaboration-et-outils-pour-sa-mise-en-oeuvre|site=Office français de la biodiversité}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Trames verte bleue et noire|url=https://www.siarja.fr/trames-verte-bleue-et-noire|site=SIARJA}}</ref>.
À l’échelle urbaine, ces trames doivent être pensées du quartier à la ville entière ; à l’échelle régionale, elles doivent s’articuler avec les continuités écologiques du territoire biogéographique ; à l’échelle supra-régionale, elles peuvent s’inscrire dans des cadres plus vastes, tels que les réseaux écologiques européens<ref>{{Lien web|langue=fr|titre=Les réseaux écologiques contre le déclin de la biodiversité ?|url=https://www.encyclopedie-environnement.org/vivant/reseaux-ecologiques-biodiversite-amenagement-territoire/|site=Encyclopédie de l’environnement}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Textes adoptés - L’importance de l’infrastructure verte urbaine|url=https://www.europarl.europa.eu/doceo/document/TA-9-2020-0241_FR.html|site=Parlement européen}}</ref>.
== Gestion restauratoire ==
La gestion des espaces verts évolue vers une '''gestion restauratoire''', c’est-à-dire une gestion orientée vers la restauration ou le maintien des fonctions écologiques, et non vers la simple conservation d’un aspect paysager figé. Cette approche privilégie la dynamique des écosystèmes, la diversité structurelle et la réduction des interventions inutiles<ref>{{Lien web|langue=fr|titre=Préserver, conserver ou restaurer les milieux et leurs fonctionnalités|url=https://ofb.gouv.fr/preserver-conserver-ou-restaurer-les-milieux-et-leurs-fonctionnalites|site=Office français de la biodiversité}}</ref>.
Elle repose notamment sur :
* la diminution des intrants chimiques et une éventuelle [[w:eutrophisation|déseutrophisation]]
* la diversification des habitats ;
* la fauche tardive et/ou différenciée ;
* l'import et/ou la conservation du bois mort lorsque cela est compatible avec la sécurité ;
* le cycle de la matière organique ;
* la prise en compte des cycles biologiques et des périodes et besoins de tranquillité pour la faune<ref>{{Lien web|langue=fr|titre=Gestion des espaces verts : vers un modèle plus vertueux|url=https://www.saran.fr/gestion-differenciee-espaces-verts|site=Mairie de Saran}}</ref>{{,}}<ref>{{Lien web|langue=fr|titre=Des espaces verts écologiques en ville|url=https://www.lpo.fr/la-lpo-en-actions/mobilisation-citoyenne/nature-en-ville/fiches-conseils-nature-en-ville/des-espaces-verts-ecologiques-en-ville|site=LPO}}</ref>.
Cette gestion peut être qualifiée de restauratoire lorsqu’elle vise explicitement à rétablir des fonctions perdues : infiltration de l’eau, pollinisation, continuité d’habitats, stockage de carbone, fonctionnalité des sols, régulation thermique et accueil d’espèces inféodées aux milieux urbains ou périurbains<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>.
== Enjeux pour l’urbanisme ==
Pour l'urbaniste, ceci implique de concevoir les espaces verts comme des composantes d’un système socio-écologique et non comme des reliques décoratives officiellement simulées et entretenues. Il doit donc intégrer les sols, l’eau, la lumière, les usages, les temporalités biologiques et les continuités écologiques dès la planification et non en fin de projet<ref>{{Lien web|langue=fr|titre=Intégrer la biodiversité dans l'aménagement du territoire|url=https://ofb.gouv.fr/integrer-la-biodiversite-dans-amenagement-du-territoire|site=Office français de la biodiversité}}</ref>.
Elle suppose aussi de privilégier les solutions fondées sur la nature, les infrastructures vertes et bleues, et une articulation cohérente entre biodiversité, santé publique, gestion des risques et qualité du cadre de vie. Dans cette perspective, l’espace vert devient une infrastructure vivante, utile à la fois aux habitants et aux autres formes du vivant<ref>{{Lien web|langue=fr|titre=Stratégie de l’UE en matière d’infrastructure verte|url=https://climate-adapt.eea.europa.eu/fr/metadata/publications/eu-green-infrastructure-strategy|site=European Environment Agency}}</ref>.
== Références ==
o8q2w2ckd8lsjb5wh359m56ksvyw45y