FR 2879337 A1 20060616 FR 0413334 A 20041215 Circuit mémoire, tel que DRAM, comportant un mécanisme correcteur d'erreur Domaine technique de l'invention La présente invention concerne le domaine des mémoires et particulièrement les mémoires dynamiques à accès aléatoire (DRAM). Etat de la technique Les mémoires dynamiques DRAM connaissent une grande popularité en raison de leur grande capacité de stockage. En revanche, elles imposent un rafraîchissement périodique et, en outre, présentent un accès bien plus lent que celui des mémoires statiques. On a déjà cherché à accroître la bande passante des mémoires dynamiques. A cet effet, une technique connue consiste à associer au plan mémoire des registres tampons ou des mémoires que l'on vient commander au moyen d'un contrôleur mémoire adapté. La demande de brevet français intitulée Procédé de commande de mémoire DRAM rapide et contrôleur adapté par M. HARRAND déposée le 19 novembre 1999 (demande n 99 14610 et publiée sous le n 2 801 388) décrit un procédé et un contrôleur mémoire pour commander une mémoire dynamique comportant un plan mémoire constitué d'un réseau de cellules mémoires et au moins deux registres tampons. La demande de brevet français intitulée Mémoire DRAM rapide par M. HARRAND et D. DOISE, déposée le 7 décembre 1999 (demande n 99 15435 et publiée sous le n 2 802 012) décrit une structure de mémoire DRAM rapide ST 03-GR1-455 comportant un plan mémoire associé à au moins deux registres tampons permettant l'accès au plan mémoire et propre à assurer la lecture ou l'écriture de la mémoire. La demande de brevet français n 0315263 intitulée Mémoire Dynamique à accès aléatoire ou DRAM comportant au moins deux registres tampons et procédé de commande d'une telle mémoire , déposée le 23 Décembre 2003 par le titulaire de la présente demande de brevet et non publiée à la date de dépôt de la présente demande, permet l'adjonction d'un système de correction d'erreur qui reste parfaitement transparent pour l'utilisateur. En particulier, un flot continu de données est maintenu même dans le cas de l'écriture de mots, ou parties de mot, de longueur inférieure à celle du groupe de données sur lequel s'applique le code correcteur d'erreur. Ce système de correction d'erreur permet ainsi d'améliorer d'une manière significative la fiabilité de la mémoire et la rend moins sensible aux perturbations électromagnétiques qui sont sources d'erreurs. L'amélioration de la fiabilité est telle que l'on peut même considérer cette technique comme une alternative aux coûteux procédés de déverminage, notamment ceux réalisés par effet thermique (dits burnin dans la littérature anglo-saxonne). L'architecture décrite dans la demande de brevet français n 0315263 ne permet un accroissement de la bande passante que lorsqu'on accède à la mémoire par salves au sein d'une même page de données lue dans la matrice de la mémoire. On obtient alors un flot ininterrompu de données sur le bus de données, permettant ainsi une bande passante optimale. En revanche, lorsque les accès à la mémoire se font successivement à des pages différentes, le flot de données est interrompu et cela freine alors les performances de la mémoire. La présente demande de brevet résout le problème de l'écriture de mots de longueur inférieure à celle du groupe de données protégé par un code correcteur d'erreur dans le cas d'une mémoire à accès purement aléatoire (sans notion de salve). Elle a pour objet une mémoire dynamique à accès purement aléatoire, ST 03-GR1-455 identique à ceux d'une SRAM, dotée d'un système de code correcteur d'erreur, qui permet d'assurer la bande passante maximale en permanence. En particulier, elle permet d'obtenir un flot continu de données d'adresses quelconques, même dans le cas de l'écriture de mots, ou parties de mot, de longueur inférieure à celle du s groupe de données protégé par un code correcteur d'erreur. Ceci permet en outre de réduire la surface de la mémoire, grâce à l'utilisation de codes correcteurs d'erreur (ECC) portant sur des mots de taille supérieure à celle du système utilisateur de la mémoire: en effet, le coût en nombre de bits d'un code ECC est d'autant moins important que le mot sur lequel il s'applique est long. Par ailleurs, un des problèmes résolu également par la présente invention consiste en la réalisation d'un circuit mémoire permettant un fonctionnement à double port de taille comparable à une mémoire à simple port. Exposé de l'invention La présente invention a pour but la réalisation d'un circuit mémoire 20 présentant les caractéristiques d'une mémoire à double port, présentant une taille particulièrement réduite. Alternativement, la présente invention a pour objet une nouvelle structure de mémoire dynamique, cette fois à simple port, et dotée d'un système de correction 25 d'erreur, qui assure une bande passante maximale dans toutes les conditions. Un autre but de la présente invention consiste à réaliser une architecture de mémoire DRAM qui comporte un système de code correcteur d'erreur tout en permettant une interface très simple, de type SRAM. A cet effet, l'invention réalise un circuit mémoire à double port ayant un plan mémoire comportant au moins un premier et un second module (1-1, 1-n) constitué chacun d'un réseau de cellules mémoires organisées en lignes et en colonnes, chaque ligne dudit plan mémoire permettant le stockage d'une page de mots, ST 03-GR1-455 chaque mot de ladite page étant identifié par une adresse organisée suivant une division hiérarchique définie par (@MSB, adresse ligne, adresse colonne), avec @MSB identifiant un module particulier parmi lesdits n modules, Le circuit comporte un premier bus d'adresses et un second bus d'adresses, ainsi qu'un premier et second bus de données servant respectivement à la lecture ainsi qu'à l'écriture dans lesdits modules. Pour chaque module mémoire, on dispose d'un multiplexeur dont les deux entrées sont respectivement connectées aux deux bus d'adresses de la mémoire à double port. La sortie du multiplexeur est connectée à un décodeur ligne (2-1, 2- n) mais également à un premier et à un second décodeur colonnes correspondants au premier et au second bus de données. Chaque multiplexeur est commandé de manière à permettre l'écriture et la lecture simultanée dans deux modules distincts, de la manière suivante: si l'adresse MSB dudit premier bus d'adresse (41) est égale à l'adresse dudit module correspondant audit multiplexeur (4-1, 4-n) et qu'une commande de lecture/écriture est présente sur ledit premier bus, alors le multiplexeur fournit en sortie les adresses de lignes et de colonnes ainsi que ladite commande de lecture/écriture dudit premier bus sinon, si l'adresse MSB dudit second bus d'adresse (51) est égale à l'adresse dudit module correspondant audit multiplexeur (4-1, 4-n) et qu'une commande de lecture/écriture est présente sur ledit second bus, alors le multiplexeur (4-1, 4-n) génère en sortie les adresses de lignes et de colonnes dudit second bus; et dans le cas contraire, ledit multiplexeur fournit en sortie des commandes de lecture/écriture à un état inactif. On obtient de cette manière, un circuit mémoire qui permet deux opérations simultanées de lecture et d'écriture, dans deux modules distincts et ce, au moyen 30 d'un circuit mémoire de taille comparable à un circuit mémoire à simple port. Ce circuit mémoire dont le fonctionnement est proche de celui d'une mémoire à double port est susceptible d'une grande variété d'applications. ST 03-GR1-455 En particulier, dans un mode de réalisation préféré, on peut réaliser un circuit mémoire à simple port comportant un mécanisme de correction d'erreur intégré. A cet effet, on affecte l'un des deux bus d'adresses et l'un des deux bus de données au mécanismes de correction d'erreur de manière à obtenir, sans perte de vitesse, une opération de lecture dans l'un desdits modules et une réécriture éventuellement après recalcul d'un code correcteur d'erreur, dans un des modules. Dans un mode de réalisation préféré , on organise l'adressage au sein de chacun desdits modules mémoire suivant une division hiérarchique @GROUPE, @LSB, avec @GROUPE identifiant un groupe de mots particulier au sein dudit module particulier et @LSB définissant la position d'un mot dans ledit groupe de mots, et en ce qu'un code correcteur d'erreur est appliqué audit groupe de mots. De préférence, le circuit mémoire comporte: - un système de correction d'erreur appliqué sur un sous ensemble de ladite page, ledit sous ensemble constituant un groupe de mots; - une mémoire cache permettant le stockage d'un groupe de mot, après son éventuelle modification, à une adresse identique, à une relation bijective près, de l'adresse @GROUPE originellement utilisée pour le stockage dans ledit module; - au moins un premier, un second et un troisième registres, notés respectivement S, T, et U dans la suite de ce texte, permettant de transférer provisoirement le contenu de ladite mémoire cache pour une adresse @GROUPE correspondant à un prochain cycle afin de permettre un prochain accès en écriture à ladite adresse; - des circuits permettant de réaliser au plus tôt lors d'un cycle successif le transfert dudit au moins premier, second ou troisième registre dans l'un desdits modules qui n'est pas utilisé en lecture. Il en résulte la possibilité d'une opération de lecture et d'écriture pour chaque cycle, tant dans la cache que dans la mémoire principale, et ce malgré le fait que les modules mémoires sont de types à simple port seulement. ST 03-GR1-455 Cela provient du fait que les accès en lecture et en écriture ont toujours lieu dans des modules différents. Seuls quelques registres supplémentaires sont nécessaires pour permettre de transférer provisoirement le contenu de la mémoire cache lorsque cela s'avère indispensable. De préférence, la relation bijective est la relation unité et le circuit mémoire comporte une mémoire dite TAG destinée au stockage, pour chaque adresse @GROUPE d'un mot au sein d'un desdits modules: - une donnée définissant si l'adresse correspond à un groupe de mot valide du cache, à savoir une donnée ayant été lue dans l'un des dits modules de la mémoire principale, modifiée et non encore réécrite dans ce même module; - de données d'identification d'un module parmi lesdits modules; - de données identifiant laquelle de ladite première ou seconde mémoire cache est 15 utilisée pour le stockage de ladite donnée valide. On parvient ainsi, grâce à cette mémoire nécessairement rapide mais de faible taille, à gérer les accès au sein des deux mémoires caches, ainsi que dans les registres S, T et U pour assurer les conditions de fonctionnement suivantes, autorisant un flux de données ininterrompu pour l'utilisateur: 1. Une seule opération de lecture et une seule opération d'écriture peuvent être effectuées dans la mémoire principale, et ce dans des modules distincts. De même les deux mémoires caches ne permettent qu'une seule opération de lecture et une seule opération d'écriture. 2. Une nouvelle donnée extraite de la cache ne doit pas être écrite dans les registres S, T ou U lorsque ces registres ne sont pas vides et ne peuvent être libérés par transfert dans la mémoire principale. L'invention est particulièrement adaptée pour la réalisation d'une mémoire de type DRAM. ST 03-GR1-455 Description des dessins D'autres caractéristiques, but et avantages de l'invention apparaîtront à la lecture de la description et des dessins ci-après, donnés uniquement à titre 5 d'exemples non limitatifs. Sur les dessins annexés: La figure 1 illustre un mode de réalisation préféré d'une mémoire de type DRAM à double port de taille particulièrement réduite. La figure 2 illustre un mode de réalisation préféré d'une mémoire de type DRAM, à simple port, comportant un mécanisme de correction d'erreur conforme à la présente invention. Les figures 3 et 4 illustrent l'organigramme montrant le fonctionnement de la 15 mémoire. Description d'un mode de réalisation préféré La figure 1 illustre l'architecture générale d'une mémoire dynamique à double port, conforme à la présente invention, de taille particulièrement réduite. La mémoire selon l'invention comporte un ensemble de n modules 1-1 à 1-n 25 (avec n étant un entier, par exemple 2, 4, 8, 32, 64...) dont seuls les modules 1-1 et 1-n sont représentés sur la figure. D'une manière générale, chaque module 1-1 (resp. 1-n) comporte un plan mémoire de type mémoire à simple port qui est composé de cellules mémoires et est associé à un décodeur ligne 2-1 (resp. 2-n) ainsi qu'à un ensemble de deux décodeurs colonne 3-1 et 3'-1 (resp. 3-n et 3'-n), le 30 premier servant à la lecture et le second à l'écriture. Chaque cellule mémoire est située à l'intersection d'une ligne (ou rangée) et d'une colonne (ou ligne de bit). Des amplificateurs (non représentés dans la figure 1) permettent d'accéder à la mémoire, aussi bien en phase de lecture, d'écriture ou de rafraîchissement. ST 03-GR1-455 Chaque ligne dudit plan mémoire permet le stockage d'une page de mots qui est identifiée par une adresse organisée suivant une division hiérarchique définie par (@MSB, adresse ligne, adresse colonne), avec @MSB identifiant un module particulier parmi lesdits n modules La division de l'espace mémoire en différents modules 1-1 à 1-n permet de réduire la longueur de la ligne de bit et, par suite, sa capacité que l'on s'efforce de maintenir pas trop supérieure [en pratique, de l'ordre de 10 a 20 fois supérieure...] à la capacité de la cellule mémoire qui, comme on le sait, tend à diminuer avec lo l'accroissement de la densité des mémoires dynamiques. Pour garder une valeur de capacité de ligne de bit suffisamment faible, on s'arrangera pour prévoir un nombre suffisant de modules 1-1 à 1-n. La commande des décodeurs ligne et colonne est réalisée d'une manière classique au moyen de signaux de commande classique pour une mémoire DRAM et qui n'ont pas été représentés sur la figure 1. Comme on le sait, les décodeurs colonnes 3-1 à 3-n et 3'-1 à 3'-n sont commandés par des signaux de validation d'adresse de colonne (CAS ou Column address Strobe dans la littérature anglo-saxonne), d'adresse de colonne (CAD ou Column Address) et de lecture/écriture (R/W). Les décodeurs lignes sont commandés par un signal de validation d'adresse de ligne (Row Address Strobe) et un signal d'adresse de ligne (Row Address). Le circuit mémoire de la figure 1 comporte un premier bus d'adresses 41 et un second bus d'adresses 51, ainsi qu'un premier et second bus de données 53 et 54 qui servent respectivement à la lecture ainsi qu'à l'écriture dans les modules 1-1 à 1-n. Le bus de données 53 est relié à la sortie de tous les décodeurs colonnes de lecture 3-1 à 3-n par un système de connexion à 3 états (3- States), et le bus de données 54 est relié aux entrées de données de tous les décodeurs colonnes d'écriture 3'-1 à 3'-n. Comme on va le voir, l'organisation du circuit mémoire permet une opération de lecture et d'écriture simultanée dans deux modules différents. ST 03-GR1-455 A cet effet, on associe à chaque module mémoire (1-1, 1-n) un multiplexeur (4-1, 4-n) qui dispose d'une première et d'une seconde entrée respectivement connectée au premier et au second bus d'adresses (41, 51). Le décodeur ligne 2-i (avec i = 1 à n) d'un module mémoire 1-i particulier dispose d'une entrée qui est connectée à la sortie du multiplexeur correspondant 4-i de manière à recevoir la partie d'adresse de cette sortie correspondant à l'adresse ligne. lo Le premier décodeur colonne 3-i correspondant au circuit mémoire 1-i considéré dispose d'une entrée connectée à la sortie du multiplexeur 4-i de manière à recevoir l'adresse colonne. De la même manière, le second décodeur colonne 3'-i reçoit également l'adresse colonne en sortie du multiplexeur 4-i. Chaque multiplexeur 4-i est associé à un logique de commande 55-i, représentée par les éléments 55-1 et 55-n sur la figure 1 et qui reçoit la partie d'adresse @MSB des deux bus d'adresses. Les éléments 55-1 à 55- n permettent la sélection de l'un des deux bus d'adresses 41 ou 51 selon la logique suivante: Si l'adresse MSB dudit premier bus d'adresse 41 est égale à l'adresse dudit module correspondant audit multiplexeur 4-i et qu'une commande de lecture/écriture est présente sur ledit premier bus, alors le multiplexeur 4-i fournit en sortie les adresses de lignes et de colonnes ainsi que ladite commande de lecture/écriture dudit premier bus. Sinon, si l'adresse MSB dudit second bus d'adresse 51 est égale à l'adresse dudit module correspondant audit multiplexeur 4-i et qu'une commande de lecture/écriture est présente sur ledit second bus, alors le multiplexeur 4-i génère en sortie les adresses de lignes et de colonnes dudit second bus ainsi que ladite commande de lecture/écriture dudit second bus.; et Dans le cas contraire, ledit multiplexeur fournit en sortie des commandes de lecture/écriture à un état inactif. ST 03-GR1-455 Le circuit mémoire de la figure 1 présente l'avantage d'une taille réduite puisque celle-ci est comparable, aux multiplexeurs près, à la taille d'un circuit mémoire à simple port. En revanche, on voit que l'on obtient, grâce à ce circuit mémoire, un fonctionnement étendu, proche de celui d'une mémoire à double port, puisque l'on peut effectuer simultanément une opération de lecture et une opération d'écriture dans deux modules mémoires distincts. On accroît ainsi considérablement la bande passante du circuit mémoire et 10 ce dernier est susceptible de maintes applications industrielles. En particulier, comme on va le voir à présent, le circuit mémoire de la figure 1 est particulièrement adapté à la réalisation d'un circuit mémoire à simple port, mais doté d'un mécanisme de correction d'erreur intégré. A cet effet, on affecte l'un des 1s port d'adresse et l'un des deux ports de données au mécanisme de correction d'erreur et on obtient ainsi, sans perte de vitesse, un circuit mémoire particulièrement performant. La figure 2 illustre un mode de réalisation préféré d'un circuit mémoire selon 20 la présente invention, doté d'un mécanisme de correction d'erreur. Les modules mémoires 1-1 à 1-n sont identiques à ceux de la figure 1 et conservent, à des fins de clarification, leur référence numérique de la figure 1. On retrouve ainsi, pour chaque module mémoire 1-i (avec i=1 à n) un décodeur ligne 2-i, un premier et un second décodeur colonne 3-i et 3'-i, un multiplexeur 4-i et sa logique de commande 55-i qui lui est associée. Le premier bus d'adresses 41 est affecté à l'interface utilisateur du circuit mémoire tandis que le second bus d'adresse 51 sert, comme on le verra ci-après plus en détail, à un mécanisme de correction d'erreur pour effectuer une réécriture dans un module mémoire distinct de celui servant à une opération de lecture. ST 03-GR1-455 En phase de lecture sur le bus de données 53, on utilise le bus de donnée 54 pour effectuer une opération d'écriture dans un autre module, après une éventuelle correction et recalcul d'un code correcteur d'erreur. s Dans le circuit de la figure 2, le bus d'adresse 41 véhicule l'adresse système (@ MOT) de l'interface extérieure de la mémoire. Le bus d'adresse 51 est connecté à la sortie d'un multiplexeur 20, commandé par une logique de commande 30, et disposant lui même de quatre bus d'entrées. Un premier bus reçoit la valeur d'adresse (@ Registre S) stockée dans un registre 17, tandis qu'un second bus reçoit la valeur d'adresse (@ Registre T) stockée dans un registre 18. Un troisième bus reçoit la valeur d'adresse (@ Registre U) stockée dans un registre 19 et enfin un quatrième bus reçoit une valeur d'adresse de rafraîchissement fournie par la logique de commande 30 et destinée aux cycles de rafraîchissement des modules mémoires. D'une manière générale, les entrées et les sorties de tous les modules et registres que l'on décrira ci-après se composent de bus que l'on désignera, selon le cas, sous le terme générique entrée ou sortie . Afin de clarifier l'exposé, on considérera l'exemple d'une architecture de mémoire comportant 32 modules stockant chacun 128 pages de 1024 bits utiles (et quelques bits supplémentaires de code correcteur d'erreur). Chacune des pages se décompose elle même en huit sous-ensembles ou groupes de mots de 128 bits, lesquels se décomposent à leur tour en 4 mots de 32 bits chacun. On peut ainsi réaliser une mémoire de 4 Mbits. Afin de permettre l'intégration du mécanisme correcteur d'erreur au niveau d'un groupe de mots, on effectue une triple division hiérarchique au niveau de l'adresse véhiculée sur le bus d'adresse 41. Les bits de poids fort (ou MSB Most Significant Bits) de l'adresse permettent de définir le module i (pour i = 1 à n) qui est concerné par la donnée de 32 bits à lire ou à écrire, tandis que les bits de poids faible ( LSB ou Least Significant Bits) déterminent la page particulière stockée au sein dudit module i (décodée par le décodeur ligne 2-i), le groupe de mot, et également, pour les derniers bits LSB, la place du mot de 32 bits au sein du groupe de mots de 128 bits. La place d'un mot ST 03- GR1-455 12 - 2879337 de 32 bits au sein d'un groupe de mots particulier est par conséquent définie, dans l'exemple considéré, par les 2 derniers bits. Dans la figure, on a représenté ces bits sous la désignation @ LSB. L'adresse complète d'un mot @MOT se décompose par conséquent sous la forme (@MSB, @GROUPE, @LSB) avec: @MSB consistant, dans l'exemple considéré, de 5 bits définissant un module parmi 32 modules; @GROUPE consistant en 10 bits venant définir un groupe de mots de 128 bits au sein du module considéré (ledit module supposé pouvoir contenir 1024 groupes de mots) ; @LSB constitué de 2 bits venant définir la position d'un mot de 32 bits au sein d'un groupe de mots de 128 bits. Il est à noter que l'ensemble @GROUPE et @LSB (soit 12 bits en tout) correspond à la partie d'adresse véhiculée sur le bus 41 qui correspond aux adresses de lignes et de colonnes pour les décodeurs lignes 2-i et les premiers et second décodeurs colonnes 3-i et 3'-i. A des fins de clarification, on ne considérera plus, dans la suite, la distinction entre la partie d'adresse ligne et la partie d'adresse colonne, mais plus précisément la distinction entre @GROUPE et @LSB qui est au coeur du mécanisme de correction d'erreur. On pourra donc représenter l'organisation de l'adressage au sein de la mémoire par une adresse @MSB définissant un module au sein des n modules (n=32 dans l'exemple considéré), une adresse @Groupe définissant le groupe de mots (protégé par un code ECC) à l'intérieur d'un module, et une adresse @ LSB qui est celle d'un mot au sein d'un groupe de mots considéré. . Il est à noter que ce système est également applicable a l'écriture de mots très courts, tels des octets, voire même des bits unitaires, alors qu'il serait très ST 03-GR1-455 - 13 - difficilement envisageable de protéger des octets, et encore moins des bits, par un code ECC. La partie @MSB du bus 5-i sortie du multiplexeur 4-i permet, au moyen 5 d'une logique de décodage non représentée, de valider l'accès au dit module i. En sortie des décodeurs colonnes 3-1 à 3-n, la donnée lue en mémoire à savoir un groupe de mots de 128 bits utiles (auquel s'ajoute quelques bits de code correcteur d'erreur selon le code employé) - est transmise via le premier bus de lo donnée 53 à l'entrée d'un bloc correcteur d'erreur 6 qui vérifie l'intégrité du groupe de mots en sortie de mémoire principale et assure, le cas échéant, son éventuelle correction. La structure d'un tel bloc correcteur est bien connue d'un homme du métier et ne sera donc pas décrite plus en détail. On utilisera en particulier un code de Hamming pour sa simplicité. Le bloc 6 comporte un bus de sortie de 128 bits qui est connecté à une première entrée d'un multiplexeur 7, disposant également d'une seconde entrée et d'une troisième entrée. La sortie du multiplexeur 7 fournit sur un bus 42 la valeur de la donnée D_out et est également connectée à l'entrée d'un registre 8 dit Registre R dont la fonction consiste à stocker le groupe de mots de 128 bits qui est à modifier au sein d'une page considérée de 1024 bits. Le registre 8 présente une sortie (un bus de 128 bits) qui est connectée à une première entrée d'un bloc 9 dit MODIF MOT . Ce dernier comporte une seconde entrée connectée à la sortie d'un registre 10 dans lequel on vient stocker une information complexe combinant une valeur Data_In du mot (de 32 bits) à modifier, ainsi que la partie @ LSB de l'adresse définissant la position du mot à modifier au sein du groupe de mots de 128bits. Comme on l'a rappelé précédemment, dans l'exemple considéré d'une architecture avec 32 modules, cette partie @ LSB se compose des 2 derniers bits. Le bloc 9 utilise cette information pour venir modifier, à la place appropriée au sein du groupe de mots de 128 bits, les 32 bits correspondant au mot qui est à modifier. Le bloc 9 comporte une sortie qui est connectée à une première entrée d'un multiplexeur 45 ainsi qu'à une première entrée d'un multiplexeur 16 et à une entrée d'un bloc 11 de calcul d'un code correcteur d'erreur, lequel permet de recalculer le ST 03-GR1-455 - 14 - nouveau code correcteur résultant de la modification opérée par le bloc 9. Comme précédemment, on ne décrira pas plus avant la structure et le fonctionnement d'un tel module qui est bien connu d'un homme du métier. II est à noter que l'exemple décrit dans la figure 1 est celui où le bloc 9 est placé en aval du registre 8. Il s'agit là d'un exemple particulier de réalisation et l'on peut fort bien modifier la position du bloc de modification de mot 9 et venir le placer en amont du registre 8 en sorte que ce dernier vient stocker la valeur du groupe de mots, une fois la modification opérée. Io La sortie du bloc 11 est connectée aux décodeurs colonnes d'une mémoire cache 21-31. La mémoire cache 21-31 est organisée en deux modules mémoires de type à simple port, respectivement 21 et 31, présentant chacun un plan mémoire de structure similaire à celles des modules 1-1 à 1-n de la mémoire principale. De la sorte, on peut venir stocker dans chaque cache 21 ou 31, à une adresse définie par une relation bijective par rapport à la partie d'adresse @Groupe définie précédemment, tout groupe de mots originellement lu (après modification par le bloc 9) dans l'un des modules 1-1 à 1-n de la mémoire principale. Dans un mode de réalisation préféré, on pourra envisager le stockage en cache à une adresse qui sera exactement la même que l'adresse @groupe. L'homme du métier pourra bien évidemment utiliser une relation bijective moins immédiate, comme une inversion de bits. Dans l'exemple qui est considéré, chaque plan mémoire permet par conséquent le stockage de 128 pages de 1024 bits chacune (bits de correction d'erreur en sus), étant entendu que la détermination du module 21 ou 31 dans lequel sera effectivement stocké un mot particulier sera effectuée conformément aux algorithmes et procédés qui seront décrits ciaprès. En revenant à la figure 1, on observe que les caches 21 et 31 sont associés à des décodeurs lignes, respectivement 25 et 35, ainsi qu'à des décodeurs ST 03-GR1-455 - 15 - colonnes 22 et 32, respectivement. Cesderniers permettent l'extraction d'un groupe de mots de 128 bits au sein d'une page de 1024 bits. Comme pour les décodeurs ligne de la mémoire principale, les décodeurs ligne 25 (resp. 35) et colonne 22 (resp. 32) sont associés à un multiplexeur 24 (resp. 34) dont deux entrées sont respectivement connectées à la partie @Groupe du bus 41 et à la sortie d'un registre 60. Ainsi, les deux décodeurs lignes peuvent, sur commande d'une logique de commande 30, se voir présenter à leur entrée soit la valeur d'adresse véhiculée par le bus 41 (@Groupe), soit une valeur d'adresse stockée dans ce registre 60. L'entrée du registre 60 est connectée à la partie @Groupe du bus 41, de sorte que le registre 60 contient une valeur précédente du bus 41. On notera que le nombre de deux plans mémoires 21 et 31 est indépendant du nombre n de modules mémoires 1-1 à 1-n qui compose la mémoire principale. En revanche, on observe que les deux plans mémoires à simple port peuvent être opportunément remplacés par une unique mémoire cache à double port permettant un accès simultané en lecture et en écriture. En lecture, la mémoire cache 21-31 fournit une valeur qui est transmise via les décodeurs colonnes (22 et 32) à une entrée d'un troisième bloc 12 correcteur d'erreur, lequel permet de tester l'intégrité du groupe de mots lu et, le cas échéant, de le corriger. Le bloc 12 présente une sortie qui est transmise à la seconde entrée du multiplexeur 7 ainsi qu'à une seconde entrée du multiplexeur 45, lequel dispose d'une sortie qui est connectée à l'entrée de trois registres 13, 14 et 15, respectivement désignés S, T et U. Ces derniers registres présentent chacun une sortie (un bus) qui est respectivement connectée à une seconde, une troisième et une quatrième entrée d'un multiplexeur 16 placé sous la commande d'une logique de commande 30. Le multiplexeur 16 présente un bus de sortie qui est connecté à une troisième entrée du multiplexeur 7 ainsi qu'à l'entrée d'un bloc de calcul ECC 46, dont la sortie est connectée au second bus de données 54 des décodeurs de colonnes 3'-1 et 3'-n de la mémoire principale, de manière à permettre la réécriture d'un groupe de mots de 128 bits en mémoire principale. ST 03-GR1-455 Enfin, on complète l'architecture de mémoire par une mémoire 40 dite mémoire TAG, de taille réduite, qui présente un bus d'adresse connecté au bus 41 et un bus de donnée connecté à la logique de commande 30. Cette mémoire est choisie pour être très rapide, car elle sert au stockage des informations de gestion des mémoires caches 21-31 et des registres S, T et U qui sont utilisés lors du fonctionnement de la mémoire. Plus précisément, la mémoire TAG 40 est organisée de manière à stocker, pour chaque adresse d'un groupe de mots de 128 bits stocké dans l'un des deux caches 21-31, une information qui se compose de l'adresse du module concerné (soit 5 bits pour un ensemble de 32 modules), 1 bit lo pour définir dans lequel des deux caches 21 ou 31 le groupe de mots considéré est stocké et 1 bit supplémentaire pour déterminer si la donnée est valide ou non. De plus, on dispose pour chacun des registres R, S, T, et U, d'une information de validité du contenu de ce registre ainsi que de l'adresse de module de la donnée qui y est contenue. Comme on le voit, on pourra donc s'accommoder d'une mémoire qui, bien que rapide, reste néanmoins de taille réduite et par conséquent peu coûteuse à réaliser. Dans l'exemple considéré on pourra utiliser une mémoire de 1024x7 bits pour la mémoire TAG proprement dite, plus 4x6bits pour les informations correspondant aux registres R, S, T, et U. D'une manière générale, tous les signaux de commande qui sont nécessaires au fonctionnement des multiplexeurs 4-1, 4-n, 7, 16, 20, 24, 34, 16 etc..., et également à celui des différents registres sont générés par la logique de commande 30 conformément aux algorithmes et procédés qui seront décrits ci-après. La conception d'une telle logique de commande, qui répond à une logique de machine d'état, est bien connue d'un homme du métier et ne sera par conséquent pas décrite plus en détail. On décrit à présent le fonctionnement de la nouvelle architecture de mémoire qui est proposée. D'une manière générale, l'interface entre la mémoire et les entrées/sorties est assurée au moyen d'une interface système qui permet de recevoir les requêtes d'accès à la mémoire. Ces requêtes comportent en allant des bits de poids fort vers ceux de poids faible cinq bits d'adresse @ MSB qui définissent une adresse de module (soit 1 parmi 32 modules), complétée par une adresse de page au sein d'un module donné (soit 1 page parmi 128 pages) une ST 03-GR1-455 - 17 adresse de groupe de mots (soit 1 parmi 8) au sein de la page et une adresse de mots (soit 32 bits parmi les 128 bits). L'adresse de page et l'adresse de groupe de mot sont regroupés dans ce texte sous la dénomination @Groupe. Comme dans le brevet français n 0315263 mentionné précédemment, la mémoire comporte un système de code correcteur d'erreur mis en oeuvre par les blocs 6, 11 et 12 - qui est appliqué, non pas au niveau d'un mot de 32 bits, mais directement sur un groupe de mots de 128 bits afin de réduire l'espace mémoire occupé par le code correcteur d'erreur. Le système permet même d'écrire individuellement des octets, voire des bits, sans pénalité de temps, bien que l'ECC soit appliqué sur des mots de 128 bits. Dans l'exemple considéré, chaque page de 1024 bits comporte huit ensembles ou groupes de mot de 128 bits qui sont associés chacun à un code correcteur d'erreur de 8 bits. Chaque module mémoire 1-1 à 1-n est, comme on l'a vu, de type à simple port. En revanche, la multiplicité des modules mémoires et le fait de faire circuler deux bus d'adresses, respectivement transmis à la première et la seconde entrée de chacun des multiplexeurs 4-1 à 4-n, ainsi que 2 bus de données, l'un de lecture et l'autre d'écriture, permet ainsi de lire dans un module pendant que l'on écrit dans un autre module. En revanche, comme on le constate sur l'architecture, il n'est pas possible d'effectuer, dans un même module, deux lectures ou deux écritures, chaque module étant de type à simple port. ACCES EN ECRITURE DANS LA MEMOIRE On décrit à présent plus particulièrement l'accès en écriture de la mémoire. A cette fin, afin de simplifier la lecture des schémas, ainsi que du code illustratif en C qui est listé ci-après, on adoptera les conventions suivantes: M = @MSB et ST 03-GR1-455 A= @GROUPE TagCache(A) est la valeur X, Y ou Null (2 bits) stockée dans la mémoire TAG 40 indiquant dans laquelle des 2 caches est stockée la donnée le cas échéant, et TagModule(A) le module auquel appartient la donnée à cette adresse, cette valeur étant également stockée dans la mémoire TAG 40, CacheX(A) correspond à la donnée stockée dans la mémoire cache X, à l'adresse A et CacheY(A) correspond à la donnée stockée dans la cache Y (resp. Y) à lo l'adresse A. De plus, par convention, la formule " Modifier R " apparaissant sur les figures 3 et 4 désignera l'opération de remplacement de la partie du contenu du registre R indiquée par l'adresse @LSB du cycle précédent par la donnée (ie le mot) du cycle précédent. De même, le transfert d'un registre vers la mémoire principale ou l'un des caches suppose le calcul préalable du nouveau code correcteur d'erreur. On note, par convention, (Mp, Ap) l'adresse (@MSB et @Groupe) du dernier 20 accès en écriture ayant eu lieu avant l'accès en écriture courant (plusieurs cycles d'accès en lecture, ou sans opération, pouvant avoir séparé ces 2 accès). La mémoire TAG 40 stocke une information de gestion qui, pour chaque adresse A précise si une donnée est présente dans l'un des deux caches ou non et, 25 si c'est le cas, les informations nécessaires à la réécriture de la donnée dans la mémoire principale. Si pour une adresse A, aucune donnée n'est stockée dans l'un des caches, alors, par convention: TagCache(A) == Null Si une donnée qui est stockée dans le cache 21 présente une adresse originelle ( M', A) - signifiant que cette donnée fut extraite du module M' ST 03-GR1-455 correspondant à un mot stocké à une adresse A au sein dudit module M' , alors, par convention: TagCache(A) == X et 5 TagModule(A) == M' De la même manière, si une donnée originellement stockée à une adresse (M', A) est chargée dans le cache 31, alors: TagCache (A) == Y et TagModule(A) == M' A chaque cycle d'horloge où un accès en écriture est requis, les opérations 15 suivantes sont effectuées en parallèle durant le cycle: a) Réécriture, si possible, de l'un des reqistres S, T ou U dans la mémoire principale suivant un mécanisme de priorité. Dans le mode de réalisation préféré, le mécanisme de priorité commence d'abord par l'identification des registres S, T ou U (resp. 12, 13 et 14) candidats à une opération de transfert vers la mémoire principale. A cet effet, pour chacun des registres, on vérifie que l'une des conditions suivantes a) ou b) est satisfaite: a) soit le registre contient une donnée valide appartenant à un module différent de celui de la donnée que l'on veut modifier. Dans le cas contraire, cela signifie que le module dans lequel on souhaiterait transférer le contenu de ce registre n'est pas disponible car il pourrait être utilisé pour la lecture de la donnée a modifier. b) soit la donnée que l'on cherche est déjà dans l'un des caches 21 ou 31. Dans ce cas, il suffira de lire le cache et un accès en mémoire principale ne sera pas nécessaire: on est alors sûr qu'il n'y aura pas conflit d'accès avec la réécriture du registre S, T, ou U. (En pratique, il n'est pas indispensable de tenir compte de cette condition.) ST 03-GR1- 455 Une fois les registres candidats identifiés, le procédé détermine le registre particulier qui sera choisi pour le transfert effectif. Si deux registres candidats stockent une valeur appartenant à un même module, alors le registre sélectionné sera l'un de ces deux registres. Ainsi, si lors de la phase d'identification, le procédé s a déterminé que les S, T et U sont candidats à un transfert, et que les deux premiers contiennent des données du même module de la mémoire principale, alors le procédé va libérer le registre S en provoquant le transfert de son contenu vers ce module de la mémoire principale. b) Sauvegarde du contenu du registre R après modification avec la donnée à écrire du cycle précédent et libération de la cache, avant stockage d'une nouvelle donnée au prochain cycle. On décrira plus particulièrement cette opération en relation avec les figures 3 et 4. c) transfert de la donnée à modifier dans le registre R. A cet effet, on consulte la mémoire TAG 40 pour en extraire les informations et l'on peut alors prendre la donnée à modifier à l'endroit dernièrement mis à jour, à savoir le registre R, S, T, U l'un des deux circuits caches 21 ou 31, ou la mémoire principale 1-1 à 1-n. On observe que si le groupe de mots recherché était déjà stocké dans le registre R 8, alors on effectue la modification prévue (écriture demandée au cycle précédent). Cette opération peut être réalisée au moyen du multiplexeur 16 qui permet de connecter sa première entrée recevant la sortie du bloc 9 vers le multiplexeur 7. d) écriture de la donnée d'entrée ainsi que l'adresse (â LSB (deux derniers bits) dans le registre 10 afin de pouvoir effectuer la modification du groupe de mots au prochain cycle. On observera en outre que la mémoire TAG 40 stockant les valeurs TagCache(A), TagModule(A) Tag(Ap) et les différents états (validité, adresse et module du contenu) des registres R, S, T et U, sont mis à jour conformément aux transferts effectués durant le cycle. ST 03-GR1-455 Les figures 3 et 4 illustrent plus particulièrement le procédé de sauvegarde du registre R après modification de la donnée à écrire du cycle précédent et de libération de la cache. Le procédé démarre avec une étape 101 au cours de laquelle un test est effectué pour déterminer si Ap est égal à A et si Mp est différent de M. Si la donnée contenue dans R correspond à la même adresse A mais à un module différent de celui de la donnée à traiter, le procédé ne sauvegarde pas R lo dans la cache, car elle y serait écrasée au cycle d'horloge suivant; le contenu du registre R est sauvegardé directement dans l'un des registres S, T, ou U. A cet effet, le procédé poursuit avec une étape 102 ou un test est effectué pour déterminer si le registre S est libre. Si le registre S est libre, alors le procédé poursuit avec une étape 103 ou la logique de commande 30 provoque la modification du contenu du registre R avec le mot du cycle précédent, puis le stockage du nouveau groupe de mots dans le registre S. L'adresse (Mp, Ap) puisque l'on suppose que la donnée [Mp, Ap] se trouve être dans le registre R 8 lorsque la donnée courante (M,A) doit être traitée, est également stockée dans le registre 17. Si le test de l'étape 102 échoue, alors le procédé effectue dans une étape 104 un nouveau test pour déterminer si le registre T est libre, auquel cas, on poursuit avec l'étape 105. Dans l'étape 105, la logique de commande 30 provoque la modification du registre R avec le mot du cycle précédent, puis le stockage du nouveau groupe de mots dans le registre T. Comme précédemment, le contenu du registre 18 est mis à jour avec la valeur (Mp, Ap) correspondante. Si le test de l'étape 104 échoue, cela signifie que les deux registres S et T sont déjà utilisés et alors le procédé poursuit avec une étape 106 au cours de laquelle il provoque la modification du registre R, et le stockage du nouveau groupe de mots en résultant dans le registre U. En effet, comme on va le constater, c'est ST 03-GR1-455 un des effets surprenants de l'invention que d'assurer que le registre U sera libre dès lors que les deux registres S et T seront indisponibles. Si le test de l'étape 101 échoue, alors le procédé poursuit avec une étape 107 représentée dans la figure 4 où un nouveau test est effectué pour déterminer si TagCache (A) est différent de NULL et si, en même temps TagModule(A) est différent de M. Si le test de l'étape 107 échoue signifiant que l'une des égalités est vraie Io alors le procédé poursuit directement avec une étape 119. On notera en particulier que si TagCache = NULL, cela signifie que les deux mémoires 21 et 31 sont vides à l'adresse A considérée et qu'il n'y a pas lieu de sauvegarder cette mémoire cache. Si la cache contient, à l'adresse A, une donnée provenant d'un même module que la donnée courante, cela signifie que la cache contient la donnée recherchée et il n'y a pas lieu de la sauvegarder ailleurs. On procédera simplement à son transfert lors de l'étape c décrite précédemment. Si le test de l'étape 107 réussit, cela signifie que la mémoire cache (21 ou 31 selon la valeur X ou Y renvoyée par la mémoire TAG 40) contient à l'adresse A considérée une donnée d'un module différent de M. L'on sauvegarde alors cette valeur dans S, T ou U selon le cas et selon le procédé décrit ci-après. En parallèle, l'autre cache est alors utilisé pour sauvegarder le contenu du registre R, à l'adresse Ap puisque cette adresse correspond à celle de la donnée lue au cycle précédent. On constate que l'on peut accéder simultanément aux deux registres caches 21 et 31 qui sont chacun à simple port. En revenant à la figure 4, si le test de l'étape 107 réussit, alors le procédé poursuit avec une étape 108 au cours de laquelle un test est effectué pour déterminer si le registre S est libre, auquel cas le procédé va à une étape 109. Dans l'étape 109, la valeur de TagCache(A) fait l'objet d'un test. Si elle est égale à x signifiant que la donnée est stockée dans le cache 21 alors le procédé poursuit avec une étape 110 où l'on transfère le contenu de la cache X(A) dans le registre S. Le procédé poursuit ensuite avec l'étape 119. ST 03-GR1-455 Si la valeur de TagCache(A) n'est pas égale à x, alors le procédé poursuit avec une étape 111 où l'on transfère le contenu de la cache Y(A) dans le registre S. Le procédé poursuit ensuite avec l'étape 119. Si le test de l'étape 108 a révélé que le registre S n'était pas disponible, alors le procédé poursuit avec une étape 112 au cours de laquelle on teste la disponibilité du registre T. Si le registre T est libre, alors le procédé poursuit avec une étape 113 où la valeur de TagCache(A) fait l'objet d'un test. Si elle est égal à x signifiant que la donnée est stockée dans le cache 21 alors le procédé poursuit avec une étape 114 où l'on transfère le contenu de la cache X(A) dans le registre T. Le procédé poursuit ensuite avec l'étape 119. Si la valeur de TagCache(A) n'est pas égale à x, alors le procédé poursuit avec une étape 115 où l'on transfère le contenu de la cache Y(A) dans le registre T. Le procédé poursuit ensuite avec l'étape 119. Dans le cas où le registre T n'est pas libre lors de l'étape 112, alors le 20 procédé poursuit avec une étape 116 où l'on vient comparer la valeur de TagCache(A) avec X. Si la valeur de TagCache(A) est égale à x, alors on procède dans une étape 117 au transfert de la cache X(A) vers le registre U. Le procédé poursuit ensuite 25 avec l'étape 119. Si la valeur de TagCache(A) n'est pas égale à x, alors le procédé poursuit avec une étape 118 où l'on transfère le contenu de la cache Y(A) dans le registre U. Le procédé poursuit ensuite avec l'étape 119. Dans l'étape 119, le procédé vient comparer la valeur de TagCache(A) avec X. ST 03-GR1-455 Si les deux valeurs sont égales, alors on procède dans une étape 120 à la modification du contenu du registre R, au recalcul du code correcteur d'erreur via le bloc 11 et enfin à son transfert dans la cache 31 à l'adresse Ap. Si la valeur de TagCache(A) n'est pas égale à x, alors le procédé poursuit avec une étape 121 où l'on vient modifier le contenu du registre R, recalculer le code correcteur et finalement transférer la valeur résultante dans le cache X(Ap), ie le cache 21. Comme on le voit, les registres S, T, et U ne peuvent à aucun moment contenir des données appartenant au même module: En effet, si 2 de ces registres contiennent des données appartenant à un même module M, et que l'on transfère dans le troisième un donnée appartenant au dit module M, c'est que l'on est en train de lire une donnée appartenant à un module M' différent de M; autrement, cela signifierait que la donnée recherchée est celle que l'on voudrait transférer: il n'y aurait alors pas transfert vers les registres S, T ou U, mais vers le registre R. Donc, si l'on transfère vers le troisième registre une donnée appartenant au module M, il est possible de transférer vers la mémoire principale le contenu de l'un des 2 autres registres. Comme les registres qui contiennent des données appartenant au même module que celles d'un autre registre sont prioritaires pour la réécriture dans la mémoire principale, c'est ce qui sera fait. Comme S, T et U ne peuvent contenir des données appartenant au même module, quelque soit la donnée lue dans la mémoire principale, si les 3 registres sont occupés, il y a toujours moyen de réécrire l'un de ces registres dans cette mémoire principale en parallèle avec cette lecture. Donc, à chaque fois qu'il est nécessaire de transférer une donnée vers les registres S, T et U, il y en a toujours un où il est possible de le faire. Il n'est donc à aucun moment nécessaire de suspendre le flot de lecture, écriture, ou écriture partielle vers la mémoire. Ce système permet donc un flot continu de données. ST 03-GR1-455 - 25 - ACCES EN LECTURE DANS LA MEMOIRE Lorsqu'un accès en lecture est requis, les informations contenues dans la mémoire TAG 30, et les informations contenues dans les registres 17, 18 et 19 (définissant les adresses des données respectivement stockées dans les registres S, T et U) permettent à la logique de commande 30 de déterminer où se trouve la donnée à la plus à jour à considérer. Cette donnée peut être lue, corrigée et fournie à l'interface système de la mémoire. Ainsi, comme on le voit, grâce aux deux mémoires caches 21 et 31 lesquels peuvent être réduits à un unique cache de type à double port combinés aux registres 13, 14 et 15, on peut assurer un accès en écriture, avec correction d'erreur, à chaque cycle d'horloge. On observe ainsi que les modules 1-1 à 1-n bien qu'il soient chacun de type à simple port chacun permettent néanmoins un flot ininterrompu de données, aussi bien en lecture qu'en écriture, et cela tout en assurant un procédé de correction d'erreur au sein de la mémoire. Cela est due à la combinaison des deux mémoires caches permettant la réécriture et la lecture simultanée nécessaire pour la correction d'erreur. Comme les mémoires caches sont au nombre de 2 quelque soit le nombre de modules mémoires, l'avantage en terme de vitesse est obtenu pour un coût faible. [Note: chaque cache a exactement la même structure, et donc la même surface qu'un module mémoire.] A partir d'une certaine capacité mémoire, ce système peut même être d'un coût inférieur à celui d'une mémoire simple où les mots de 32 bits sont corrigés directement par un code ECC, car le coût des 2 caches peut être compensé par le plus faible nombre de bits du code ECC nécessité par une protection ECC de mots de 128 bits. On constate ainsi, et ce n'est pas un des avantages les moindres de la nouvelle architecture qui est proposée, que la mémoire DRAM présente ainsi une interface très simple vue de l'utilisateur, proche de celle d'une SRAM. ST 03-GR1-455 - 26 - Il est à noter que le système de l'invention pourrait d'ailleurs être appliqué à une architecture de SRAM et permettrait alors d'améliorer d'une manière significative leur fiabilité. On trouvera ci-après, un exemple de code C permettant d'illustrer un mode d'implémentation de l'invention /************************************************************************* ******* #include struct memory_state { int mem[8][128]; /* memory array [module][address] */ int cache[2][128]; /* cache array [0 or 1][one entry per address in a module] */ int tag_cache_valid[128]; /* indicates in which of the 2 caches is stored the data if any */ int cache_module[128]; /* indicates to which module belongs the data stored in cache */ int buffer R; /* buffer_R's contents (data) */ int buffer S; 25 int buffer_T; int buffer U; int buffer R valid; /* indicates if buffer R contains a valid data */ int buffer _R module; /* module to which buffer_R's contents belongs to */ int buffer _R address; /* buffer_R's contents address (inside module) */ int buffer S valid; int buffer S _module; int buffer _S address; int buffer T valid; int buffer L module; int buffer T address; int buffer U valid; int buffer U module; ST 03-GR1455 - 27 - int buffer U _address; int data_buffer; }; main() { FILE *pfile; char command; int i, j, module, address, data, report, first_error tag, error_cycle; int error_nb = 0; char poubelle[80]; struct memory_state state; /* System intialization */ for(j=0; j buffer R module; int buffer S_module = pstate->buffer S_module; int buffer Tmodule = pstate-> buffer_T module; int buffer U module = pstate->buffer U module; int butter R address = pstate->buffer R address; int buffer S_address = pstate->buffer_S_address; int buffer Taddress = pstate->buffer T address; int buffer U_address = pstate->buffer U_address; int buffer R = pstate->buffer_R; int buffer S = pstate->buffer_S; int butter:1' = pstate->buffer_T; int buffer_U = pstate->buffer U; int buffer R valid = pstate->buffer R valid; int buffer S valid = pstate->buffer S valid; int buffer T valid = pstate->buffer T valid; int buffer U valid = pstate->buffer U valid; int data_buffer = pstate-> data_buffer; int cache module = pstate->cache module[address]; char S can_be_WB, T can_be_WB, U can be WB; int error tag = 0; int new data in cache = 0; int R_stored in S = 0; int R stored in T = 0; int R stored in U = 0; tag = pstate->tag_cache_valid[address]; new data in cache = 0; ST 03-GR1-455 10 if (command 'R') { /* Read operation */ if ((buffer R valid) && (buffer_R_module = module) && (buffer R address == address)) { /* The data is still in Buffer_R: Modification to be done now with the data to be written. Caution: this test first because other conditions might also be true */ data_out = (pstate->buffer_R & OxFFOO) I data_buffer; } else if ((buffer S valid) && (buffer S module == module) 15 && (buffer S_address == address)) { /* The data is still in Buffer_S: */ data_out = pstate->buffer_S; 20} else if ((buffer T valid) && (buffer_T_module == module) && (buffer T_address == address)) { /* The data is still in Buffer T: */ data_out = pstate->buffer_T; } else if ((buffer U valid) && (buffer U module == module) && (buffer_U_address == address)) { /* The data is still in Buffer U: */ data_out = pstate->buffer_U; } else if ((pstate->tag_cache_valid[address] == 0) && (cache_module == module)) { /* The data in cache 0 at required address is the searched one */ data out = pstate->cache[0][address]; } else if ((pstate->tag_cache_valid[address] == 1) && (cache_module == module)) { ST 03-GR1-455 /* The data in cache 1 at required address is the searched one */ data out = pstate->cache[1][address]; 5} else { /* The data is in the main memory */ data_out = pstate->mem[module] [address]; printf("Cycle %d: Read %d at address %d:%d\n\n", cycle, data_out, module, address); if (data_out!= data) { printf("\n\n\t\t\tREAD ERROR! ! ! should read %d\n\n", data); error tag = 2; }; } else if (command =='W') { /* Write Operation */ /*******************/ /* Write- back Buffer S, T, or U: possible if no access to current module */ /**********************************************************************/ if ((buffer S valid) && (buffer S _module!= module)) { /* Buffer_S contains a data belonging to a module different to the current one; no access to the module buffer_S's data belongs to is made: buffer_S can thenbeen written-back */ S can be WB = 1; 35} else {Scan_be_WB = if ((buffer Tvalid) && (buffer T module!= module)) { ST 03-GR1-455 }; T can be WB = 1; } else {T can be WB = 0;}; if ((buffer U_valid) & & (buffer_U_module!= module)) { U _can be WB = 1; } else {U can be_WB = 0;}; if (S can be WB && Tcan be_WB && U can be WB) { /* If all buffers can be written-back, priority is to buffers containing data belonging to the same module as another buffer */ if((buffer S_module == buffer _T module) Il (buffer S_module = buffer_U_module)) { /* Choose Buffer_S */ pstate->mem[buffer S module] [buffer S_address] = pstate->buffer_S; pstate->buffer S_valid = 0; } else if (buffer_T_module == buffer U _module) { /* Choose Buffer T */ pstate-> mem[buffer T module] [buffer T address] = pstate->buffer_T; pstate-> buffer T valid = 0; /* means empty*/ } else { /* Buffers contain data belonging to different modules: choose Buffer_S */ pstate->mem[buffer S module][buffer S_address] = pstate->buffer_S; pstate->buffer_S valid = 0; } else { /* At least one buffer cannot be written-back; choose any buffer that can be written back */ if (S_can_be_WB) { /* Choose Buffer_S */ ST 03-GR1-455 }; pstate->mem[buffer S module][buffer S_address] = buffer_S; pstate->buffer S valid = 0; 5} else if (Lean be_WB) { /* Choose Buffer T */ pstate->mem[buffer T module][buffer T address] = butter:1'; pstate->buffer T_valid = 0; } else if (U_can beWB) { /* Choose Buffer_U */ pstate->mem[buffer U module][buffer U address] =buffer_U; 15 pstate->buffer U valid = 0; } else /* No Write- back operation to do */ /* Save buffer_R */ /*****************/ /* Buffer_R is to be downloaded in the cache not already in use, if any; otherwise, in 0 */ if (pstate->tag_cache_valid[address] == 0) { tag_bar = 1; } else { tag_bar = 0; }; /* Save Buffer R in S, T, or U if it is to be erased next cycle */ /****************************************************************/ ST 03GR1-455 15 - 34 - if ((buffer_R valid) && (buffet R address == address) && (buffer_R module!= module)) { /* Buffer_R's contents belongs to the same address as the current data, but not to the same module; it must not be written in cache, but directly in Buffet S, T, or U; otherwise, it would be erased next dock cycle by the current data */ if (!(pstate->buffer S_valid)) { /* Note: buffer_S state to be taken into account is the one after the decision to write-back or not its previous contents, not the one of the beginning of the cycle */ pstate- >buffer_S = (buffer_R & OxFFOO) data buffer; pstate->buffer S module = buffer_R module; pstate->buffer S_address = buffer_R_address; pstate->buffer S_valid = 1; R_stored= 1; /* Note that buffer R is free */ pstate->buffer R valid = 0; } else if (!(pstate->buffer T valid)) { pstate->buffer_T = (buffer R & OxFFOO) data_buffer; pstate-> buffer_T_module = buffetR module; pstate->buffer_T_address = buffer_R_address; pstate->buffer_T_valid = 1; R_stored_in_T = 1; /* Note that buffer_R is free *1 pstate->buffer R valid = 0; } else if (!(pstate->buffer U valid)) { pstate->buffer_U = (buffer_R & OxFFOO) I data buffer; pstate->buffer U module = buffer_R module; pstate->buffer U_address = buffer_R_address; pstate->buffer_U valid = 1; R stored in U = 1; ST 03-GR1-455 25 /* Note that buffer R is free */ pstate->buffer R valid = 0; } else { /* It is not (should not be ?) possible that all buffers are occupied at that time */ printf("\n\n\t\tERROR: cycle %d: no back-up of Buffer_R possible because Buffers S, T and U are all occupied!\n\n\n", cycle, pstate-> tag_cache_valid[address], address); error_tag = 1; }; } else { /* Free cache if needed */ /************************/ if ((pstate-> tag_cache_valid[address] buffer Svalid)) { pstate->buffer S=pstate->cache[pstate->tag_ cache valid[address]][address]; pstate>buffer S module = pstate->cache_module[address]; pstate->buffer S_address = address; pstate->buffer S_valid = 1; /* Note that cache[address] is free */ 30 pstate->tag_cache_valid[address] = 2; } else if (!(pstate->buffer T valid)) { pstate->buffer T = pstate-> cache[pstate->tag_cache_valid[address]][address]; pstate-> buffer_T_module = pstate->cache_module[address]; pstate-> buffer_T_address = address; pstate->buffer T valid = 1; ST 03-GR1-455 10 /* Note that cache[address] is free */ pstate-> tag_cache_valid[address] = 2; } else if (!(pstate->buffer U valid)) { pstate->buffer U = pstate->cache[pstate->tag_ cache valid[address]][address]; pstate->buffer_U_module = pstate-> cache_module[address]; pstate->buffer U address = address; pstate-> buffer U valid = 1; /* Note that cache[address] is free */ pstate-> tag_cache_valid[address] = 2; } else { /* It is not (should not be ?) possible that all buffers are occupied at that time */ printf("\n\n\t\tERROR: cycle %d: no back-up of cache[%d] [%d] possible because Buffers S, T and U are all occupied!\n\n\n", cycle, pstate-> tag_cache_valid[address], address); error_tag = 1; }; }; /* Write Buffer_R in cache */ /***************************/ /* store buffer_R's contents modified by data_buffer into cache tag_bar, except if it contains the data currently being addressed. For simplicity, it is assumed only the LSByte is modified every write cycle */ if ((buffer R valid) && !((buffer R _address = address) && (buffer R _module = module))) { pstate->cache[tag bar][buffer R address] _ (buffer_R & OxFFOO) !data buffer; pstate-> cache module[buffer Raddress] = buffer R module; pstate->buffer_R valid = 0; new data in cache = 1; ST 03-GR1-455 10 15 20 25 - 37 - /* We should note that cache[tag_bar][buffer R address] is occupied. However, we still need the current value of tag_cache_valid; it will be updated in the "Read data..." section, after we do not need it any more*/ } }; /* Read data and store it in Buffer R */ /**************************************/ if ((buffer R valid == 1) & & (buffer_R module == module) && (buffer Raddress == address)) { /* The data is in buffer_R */ /* store buffer R's content modified by data buffer into buffer_R For simplicity, it is assumed only the LSByte is modified every write cycle */ pstate->buffer_R = (buffer R & OxFFOO) 1 data buffer; 20} else if ((buffer S valid == 1) && (buffer Smodule == module) && (buffer S_address == address)) { /* The data is in buffer S */ pstate->buffer_R = buffer_S; if (!(R_stored_ in_S)) { /* Buffer_S will be modified: do not save it! */ pstate->buffer S_valid = 0; } else if ((buffer T_valid == 1) && (buffer_T_module == module) && (buffer T_address == address)) { /* The data is in buffer_T */ pstate->buffer_R = butter:1'; if (!(R_stored__in_T)) { /* Buffer T will be modified: do not save it! */ ST 03-GR1-455 pstate->buffer_T_valid = 0; } } else if buffetU valid == 1) && (buffer U module == module) && 5 (buffer U_address == address)) { /* The data is in buffer_U */ pstate->buffer_R = buffer_U; if (!(R_stored_in_U)) { /* Buffer_U will be modified: do not cave it! */ pstate->buffer U valid = 0; }; } else if ((pstate-> tag_cache_valid[address] buffer_R = pstate-> cache[pstate->tag _cache_valid[address]][address]; /* Note that this cache entry is not valid any more */ pstate->tag_cache_valid[address] = 2; } else { /* The data is in memory */ pstate->buffer_R = pstate- >mem[module][address]; if (new_data_in_cache) { pstate-> tag_cache_valid[buffer R address] = tag_bar; } /* Note what is registered in Buffer_R in any case */ pstate->buffer Rmodule = module; ST 03-GR1- 455 }; - 39 pstate->buffer R valid = 1; pstate->buffer_R_address = address; /* store data into data_buffer (to be used next dock cycle) */ /*************************************************************/ pstate>data_buffer = data; 10}; /* end write operation */ retum error_tag; }; /* End memaccess */ 15 ST 03-GR1-455 Revendications 1. Circuit mémoire à double port ayant un plan mémoire comportant au moins un premier et un second module (1-1, 1-n) constitué chacun d'un réseau de cellules mémoires organisées en lignes et en colonnes, chaque ligne dudit plan mémoire permettant le stockage d'une page de mots, chaque mot de ladite page étant identifié par une adresse organisée suivant une division hiérarchique définie par (@MSB, adresse ligne, adresse colonne), avec @MSB identifiant un module particulier parmi lesdits n modules, , ledit circuit disposant d'un premier bus d'adresses (41) et d'un second bus d'adresses (51), ainsi qu'un premier et second bus de données (53, 54) servant respectivement à la lecture ainsi qu'à l'écriture dans lesdits modules; ledit circuit disposant en outre, pour chaque module mémoire (1-1, 1-n) d'un multiplexeur (4-1, 4-n) disposant d'une première et d'une seconde entrée respectivement connectées audit premier et audit second bus d'adresses (41, 51) 20 et disposant également d'une sortie; - d'un décodeur ligne (2-1, 2-n) disposant d'une entrée connectée à la sortie dudit multiplexeur (4-1, 4-n) de manière à recevoir la partie de l'adresse correspondant à l'adresse de ligne; - d'un premier décodeur colonne (3-1, 3-n) disposant d'une entrée connectée à la sortie dudit multiplexeur (4-1, 4-n) de manière à recevoir la partie de l'adresse correspondant à l'adresse colonne, ledit premier décodeur colonne (3-1, 3-n) disposant d'une sortie connectée audit premier bus de donnée (53) ; - d'un second décodeur colonne (3'-1, 3'-n) disposant d'une entrée connectée à la sortie dudit multiplexeur (4-1, 4-n) de manière à recevoir la partie de l'adresse correspondant à l'adresse colonne, ledit second décodeur colonne (3'-1, 3'-n) disposant d'une entrée connectée audit second bus de donnée (54) ; ST 03-GR1-455 - d'un circuit de commande (55-1, 55-n) pour chaque multiplexeur (4-1, 4-n) permettant la sélection de l'un des deux bus d'adresse 41 ou 51 selon la logique suivante: si l'adresse MSB dudit premier bus d'adresse (41) est égale à l'adresse dudit module correspondant audit multiplexeur (4-1, 4-n) et qu'une commande de lecture/écriture est présente sur ledit premier bus, alors le multiplexeur fournit en sortie les adresses de lignes et de colonnes ainsi que ladite commande de lecture/écriture dudit premier bus sinon, si l'adresse MSB dudit second bus d'adresse (51) est égale à l'adresse dudit module correspondant audit multiplexeur (4-1, 4-n) et qu'une commande de lecture/écriture est présente sur ledit second bus, alors le multiplexeur (4-1, 4-n) génère en sortie les adresses de lignes et de colonnes dudit second bus; et dans le cas contraire, ledit multiplexeur fournit en sortie des commandes de lecture/écriture à un état inactif. 2. Circuit mémoire à simple port comportant un circuit mémoire à double port tel que défini dans la revendication 1 ainsi qu'un mécanisme de correction d'erreur (6, 46), ledit premier bus d'adresses (41) étant connecté au bus d'adresse de l'interface du circuit mémoire à simple port; ledit second bus d'adresses (51) et second bus de données (54) étant utilisés en interne par ledit mécanisme de correction d'erreur pour effectuer une réécriture dans l'un desdits modules mémoires. 3. Circuit mémoire à simple port tel selon la revendication 2 caractérisé en ce que l'adressage au sein de chacun desdits modules (1-1, 1-n) est organisé suivant une division hiérarchique @GROUPE, @LSB, avec @GROUPE identifiant un groupe de mots particulier au sein dudit module particulier et @LSB définissant la position d'un mot dans ledit groupe de mots, et en ce qu'un code correcteur d'erreur est appliqué audit groupe de mots. ST 03-GR1-455 4. Circuit mémoire selon la revendication 3 caractérisé en ce qu'il comporte: - un système de correction d'erreur appliqué sur un sous ensemble de ladite page, ledit sous ensemble constituant un groupe de mots; - une mémoire cache (21, 31) permettant le stockage d'un groupe de mot, après son éventuelle modification, à une adresse identique, à une relation bijective près, de l'adresse @GROUPE originellement utilisée pour le stockage dans ledit module; - au moins un premier, un second et un troisième registres (13, 14, 15) permettant de transférer provisoirement le contenu de ladite mémoire cache pour une adresse @GROUPE correspondant à un prochain cycle afin de permettre un prochain accès en écriture à ladite adresse; - des circuits (16, 17, 18, 19) permettant de réaliser au plus tôt lors d'un cycle successif le transfert dudit au moins premier, second ou troisième registre dans l'un desdits modules qui n'est pas utilisé en lecture. 5. Circuit mémoire selon la revendication 4 caractérisée en ce que lesdits au moins premiers et second modules (1-1, 1-n) sont des mémoires de type à simple port, et que la dite relation bijective est l'unité. 6. Circuit mémoire selon la revendication 4 caractérisée en ce que ladite mémoire cache (21, 31) comporte une première (21) et une seconde mémoire cache (31) de type à simple port chacune et permettant, simultanément, un accès en écriture à une groupe de mots et un accès en lecture à un autre groupe de mots. 7. Circuit mémoire selon la revendication 4 caractérisée en ce que ladite mémoire 25 cache (21, 31) est une mémoire de type à double port. 8. Circuit mémoire selon la revendication 6 caractérisé par une mémoire (TAG, 40) destinée au stockage, pour chaque adresse @GROUPE d'un groupe de mots au sein d'un desdits modules: - une donnée définissant si l'adresse correspond à un groupe de mot valide, à savoir une donnée ayant été lue dans l'un des dits modules, modifiée et non encore réécrite dans ce même module; - de données d'identification d'un module parmi lesdits modules; ST 03-GR1-455 - de données identifiant laquelle de ladite première ou seconde mémoire cache est utilisée pour le stockage de ladite donnée valide. 9. Circuit mémoire selon la revendication 8 caractérisé en ce qu'il comporte des moyens (30, 40) permettant d'identifier, pour chaque accès lecture, l'emplacement d'une donnée la plus à jour stockée dans l'un desdits modules, dans ladite première ou seconde mémoire cache (21, 31) ou encore dans lesdits registres. 10. Circuit mémoire selon la revendication 9 caractérisé en ce qu'il comporte: 10 - un premier bloc correcteur d'erreur (6) destiné à recevoir un groupe mots extraits de l'un desdits modules (1-1, 1-n) ; -un registre R (8) destiné au stockage de la valeur du groupe de mots lue, avant sa modification; - un bloc de modification de mot (9) permettant la modification d'un mot particulier 15 au sein dudit groupe de mot; - un bloc de calcul de code correcteur d'erreur (11) permettant de recalculer un code correcteur d'erreur sur le groupe de mot modifié ; - une première et une seconde mémoire cache (21, 31) permettant le stockage du résultat généré par ledit bloc de calcul de code correcteur d'erreur (11) ; - un second bloc correcteur bloc d'erreur (12) permettant la vérification et le cas échéant la correction d'un groupe de mots extrait de ladite première ou seconde mémoire caches (21, 31) ; - un premier (13, S), un second (14, T) et un troisième (15, U) registres permettant le stockage du groupe de mot vérifié et corrigé généré par ledit second bloc 25 correcteur d'erreur (12) ; - des moyens de multiplexage (16) permettant de venir charger ledit registre R (8) avec un groupe de mots extraits soit de la première ou seconde mémoire cache, soit dudit premier, second ou troisième registres, soit dudit registre R après modification, soit de l'un des modules mémoire 1-1 à 1-n. 11. Circuit mémoire selon la revendication 10 caractérisé en ce que lesdits moyens de multiplexage permettent également le transfert du contenu de l'un desdits premier, second ou troisième registres (13, 14, 15) ou du registre R dans l'un desdits modules. ST 03-GR1-455 - 44 - 12. Circuit mémoire selon la revendication 11 caractérisé en ce qu'il comporte: - un quatrième registre (17, @ registre S) destiné au stockage de l'adresse correspondant à la donnée stockée dans ledit premier registre (13, S), s - un cinquième registre (18, @ registre T) destiné au stockage de l'adresse correspondant à la donnée stockée dans ledit second registre (14, T), - un sixième registre (19, @ registre U) destiné au stockage de l'adresse correspondant à la donnée stockée dans ledit troisième registre (15, U), - des seconds moyens de multiplexage permettant de transmettre ledit contenu lo desdits quatrième, cinquième et sixième registres aux décodeurs de lignes des dits modules de manière à permettre le transfert du contenu d'un desdits premier, second ou troisiéme registres (13, 14, 15), dans l'un desdits modules. 13. Circuit mémoire selon l'une des revendications précédentes caractérisé en ce 15 que la page est constituée de 1024 bits, organisée en groupes de mots de 128 bits qui se décomposent en mots de 32 bits. ST 03-GR1-455