Brevet FR3038188A1 — publié le 20161230

SYSTEME DE VERIFICATION DE L'INTEGRITE D'UNE COMMUNICATION ENTRE DEUX CIRCUITS Domaine technique L'invention est relative de façon générale à la vérification de l'intégrité d'une 5 communication entre deux circuits, et plus particulièrement à la vérification de l'intégrité des données lues et écrites par un bus dans une mémoire de type DDR. Arrière-plan La figure 1 est un schéma de principe d'un système mettant en oeuvre une mémoire de type DDR (de l'anglais « Double Data Rate »). La mémoire DDR est reliée à un circuit, 10 par exemple un système-sur-puce SoC, par un bus mémoire normalisé B. Le circuit SoC et la mémoire DDR sont chacun connectés au bus B par une interface d'adresses A, une interface de données D, et une interface de commande CTRL. Dans la mémoire DDR, les interfaces permettent d'accéder à un plan mémoire MEM qui peut être associé à un circuit de correction d'erreurs ECC. L'interface d'adresses A 15 est conçue pour recevoir des adresses à sens unique par le bus B, adresses qui peuvent servir à sélectionner des cellules mémoire aussi bien en mode lecture qu'en mode écriture. L'interface de données D est bidirectionnelle - elle reçoit du bus B des données à écrire dans la mémoire et les produit par un canal W, et elle reçoit sur un canal R des données lues dans la mémoire et les transmet sur le bus. Les écritures et 20 lectures dans la mémoire DDR n'étant pas concurrentes, les données peuvent transiter par les mêmes lignes du bus B. L'interface de commande CTRL véhicule divers signaux entrants et sortants par des canaux respectifs W et R. De plus amples informations sur les interfaces des mémoires DDR peuvent être trouvées dans les normes JEDEC. 25 Les interfaces A, D et CTRL du côté du circuit SoC ont des fonctions symétriques aux interfaces de la mémoire. Dans des applications de sécurité, on souhaite garantir l'intégrité des données échangées avec une mémoire. Pour cela on a souvent recours à des solutions de redondance qui peuvent considérablement augmenter la surface silicium des circuits. Lorsqu'on utilise 30 des composants normalisés, tels que des mémoires DDR, la redondance est souvent obtenue en doublant le nombre de mémoires pour stocker les données avec une copie. 3038188 2 Résumé On prévoit de façon générale un procédé de vérification de l'intégrité d'une communication entre un circuit maître et un circuit esclave, comprenant les étapes consistant à envoyer des transactions du circuit maître au circuit esclave ; mettre à jour une première signature cyclique multi-bits à partir de chaque transaction telle que présente dans le circuit maître ; mettre à jour une deuxième signature cyclique multibits, de même nature que la première, à partir de chaque transaction telle que reçue dans le circuit esclave; et comparer un seul bit de la deuxième signature cyclique à un bit de même position de la première signature cyclique. Le procédé peut comprendre les étapes consistant à envoyer les transactions sur un bus entre le circuit maître et le circuit esclave ; stocker chaque transaction dans une mémoire FIFO ayant une profondeur correspondant au retard introduit par le bus ; mettre à jour la première signature cyclique à partir de la sortie de la mémoire FIFO ; et transmettre au circuit maître le bit de signature à comparer sur une ligne du bus. Le circuit esclave peut être une mémoire de type DDR et le bit de signature à comparer être transmis par une ligne DMI du bus mémoire. Les première et deuxième signatures cycliques peuvent être basées également sur les données lues dans la mémoire DDR. Le procédé peut comprendre, pour chacun des circuits maître et esclave, les étapes consistant à diviser les informations de chaque transaction en plusieurs groupes ; associer à chaque groupe un générateur respectif de code de contrôle de redondance cyclique ; à chaque transaction, générer en parallèle les codes CRC ; et produire le bit à comparer par une opération OU exclusif combinant un seul bit de chaque code CRC. Les bits combinés des codes CRC peuvent être des bits de poids faible. On prévoit également une mémoire de type DDR comprenant une interface de bus et un circuit de calcul de signature cyclique multi-bits connecté pour recevoir des états de l'interface de bus, et pour fournir un seul bit de la signature sur une ligne du bus. La ligne de bus sur laquelle est fourni le bit de signature peut être une ligne DMI. Description sommaire des dessins Des modes de réalisation seront exposés dans la description suivante, faite à titre non limitatif en relation avec les figures jointes parmi lesquelles : 3038188 3 - la figure 1, précédemment décrite, est un schéma de principe d'un système mettant en oeuvre une mémoire de type DDR ; - la figure 2 est un schéma de principe d'un système mettant en oeuvre une mémoire de type DDR et intégrant un mode de réalisation de circuit de 5 vérification d'intégrité des informations échangées avec la mémoire ; - la figure 3 est un chronogramme illustrant le fonctionnement du circuit de vérification d'intégrité dans le cadre d'un exemple d'échange d'informations ; et - la figure 4 représente schématiquement un mode de réalisation de générateur de code CRC utilisable dans le système de la figure 2. 10 Description de modes de réalisation Dans certaines applications, il n'est pas nécessaire de détecter un défaut d'intégrité de données à l'instant même où il se produit. Il suffit souvent que le défaut d'intégrité soit détecté dans un certain délai après son occurrence. Le délai dépend du degré de risque que peut engendrer le défaut. 15 En partant de cette contrainte relâchée, on propose ci-après une technique de vérification d'intégrité de données particulièrement simple. La technique sera décrite à titre d'exemple dans le cadre des échanges de données avec une mémoire DDR, mais elle pourra être utilisée de façon plus générale pour vérifier l'intégrité d'une communication entre deux circuits. 20 La figure 2 représente un système mettant en oeuvre une mémoire DDR, similaire à celui de la figure 1. Pour vérifier l'intégrité des communications par le bus B, un générateur de signature 20 est connecté dans le circuit SoC, ou circuit maître, pour calculer une signature sur chaque transaction que le circuit SoC envoie sur le bus B. Un deuxième générateur de signature 22 est connecté dans la mémoire DDR, ou circuit 25 esclave, pour calculer une signature de même nature que celle du générateur 20, sur chaque transaction telle que reçue par la mémoire sur le bus B. Les générateurs 20 et 22 peuvent être cadencés par une horloge 2CK qui est à une fréquence double de la fréquence de la mémoire DDR. En effet, une mémoire DDR traite une transaction à chaque front de son horloge, c'est-à-dire deux fois par période. 30 On pourrait, pour vérifier l'intégrité de la communication, comparer les signatures 20 et 22 à chaque transaction. On vérifie ainsi que la transaction reçue par la mémoire DDR 3038188 4 est bien la transaction envoyée par le circuit SoC. En cas d'inégalité, une erreur a pu être injectée sur les lignes du bus, cela de façon accidentelle ou malveillante. Pour effectuer une telle comparaison, il faudrait transmettre l'intégralité de la signature 22 au circuit SoC, ce qui n'est pas une solution réaliste. 5 En fait, les générateurs 20 et 22 sont conçus pour calculer une signature cyclique, c'est-à-dire une signature récursive qui est mise à jour à chaque transaction et qui préserve un historique des transactions précédentes. La signature peut être un code de redondance cyclique ou CRC. En outre, comme cela est représenté, un seul bit S de la signature 22 est transmis de la mémoire DDR au circuit SoC pour être comparé en 24 au bit de 10 même position de la signature 20. Si la comparaison échoue, le comparateur 24 active un signal d'erreur ERR. Les signatures 20 et 22 peuvent être réinitialisées par un signal RST, une seule fois à la mise sous tension du système, ou bien de temps à autre pendant des périodes d'inactivité sur le bus B. Avec cette configuration, dès qu'une erreur est introduite dans une transaction, les 15 signatures 20 et 22 se mettent à diverger rapidement au cours des transactions suivantes. Certes, les deux bits qu'on a choisi de comparer ne diffèrent pas forcément dès l'occurrence de l'erreur, mais ils ont une probabilité croissante de différer au cours des transactions suivantes. Cette probabilité tend vers 1 de façon géométrique selon la relation 1-2', où n est le nombre de transactions à partir de celle où l'erreur s'est 20 produite. Ainsi, au bout de 30 transactions, on a une chance sur un milliard de ne pas détecter l'erreur. A la cadence des transactions dans une mémoire DDR, c'est-à-dire à plus de 1 GHz, on est certain de détecter l'erreur en moins de 30 ns, ce qui est amplement suffisant dans de nombreuses applications de sécurité. La position dans les signatures des bits (S) que l'on choisit de comparer importe peu. 25 De préférence, on choisit une position où les signatures varient le plus rapidement, généralement du côté des poids faibles dans une signature de type CRC. Le fait qu'il n'y ait qu'un seul bit à communiquer entre les circuits permet de facilement envisager la transmission de ce bit par une ligne dédiée du bus, ou bien d'utiliser une ligne existante d'un bus normalisé. Dans certains bus normalisés, des lignes spécifiques 30 peuvent être libres ou avoir une fonction choisie parmi plusieurs. Dans un bus de mémoire DDR, parmi les lignes de commande CTRL, deux lignes appelées DMI (de l'anglais « Data Mask Invert ») du canal R sont attribuées aux deux moitiés des lignes de données en mode lecture de la mémoire. En pratique, le bus de 3038188 5 données comprend seize lignes et véhicule deux octets auxquels sont attribués respectivement les deux bits DMI. Lorsqu'un octet à transmettre comprend plus de 1 que de 0, il est inversé à la transmission. La ligne DMI correspondante sert à signaler cette inversion par un 1. En agissant ainsi systématiquement sur les deux octets des 5 lignes de données, on parvient à diminuer la consommation de courant liée à la transmission des données de 40 % en moyenne. Deux lignes DMI homologues, du canal W, jouent un rôle symétrique en mode écriture dans la mémoire. La mémoire DDR peut être conçue pour que la fonction de l'une des lignes DMI du canal R soit « surchargée » avec la fonction de transmission du bit de signature S. En 10 d'autres termes, l'utilisateur pourra configurer la fonction qu'il souhaite pour la ligne surchargée : soit il la configure pour avoir la fonction DMI classique, soit il la configure pour transmettre le bit de signature S. Le choix de la fonction de transmission du bit S se fait alors au détriment de la fonction DMI pour l'un des octets de données. Cependant, la fonction de la ligne DMI restante 15 peut être modifiée pour qu'elle s'étende aux deux octets des lignes de données. En d'autres termes, les deux octets sont inversés simultanément avant d'être transmis lorsqu'ils incluent ensemble plus de huit bits à 1. Cette façon de procéder est à peine moins efficace que l'utilisation de deux lignes DMI - elle permet une diminution de consommation moyenne de l'ordre de 36 % contre 40 %. 20 Dans de nombreuses applications, les générateurs de signature 20 et 22 pourraient être connectés pour tenir compte des seules lignes de données D, seize lignes dans ce cas. Toutefois, pour détecter toutes les possibilités d'erreur, les générateurs de signature sont de préférence connectés pour tenir compte de toutes les lignes qui ont une influence sur les données, à savoir les lignes d'adresses A, les lignes de données D, et les lignes DMI 25 parmi les lignes de commande CTRL. Comme cela est représenté, les générateurs de signature peuvent être connectés à ces lignes par les entrées et sorties des interfaces A, D, et CTRL, du côté opposé aux lignes du bus B, où les signaux sont propres. La ligne servant à transmettre le bit de signature S, le cas échéant une des lignes DMI, peut également être comptabilisée dans les calculs de signature. 30 En outre, le générateur de signature 22, dans la mémoire DDR, peut être conçu pour tenir compte d'un signal d'erreur produit par le circuit de correction d'erreurs ECC, comme cela est représenté. Le circuit ECC est destiné à détecter et corriger automatiquement des erreurs internes du plan mémoire MEM. S'il ne parvient pas à 3038188 6 corriger une erreur, il produit un signal d'erreur qui peut être pris en compte dans certains systèmes. Dans le cas présent, il est opportun qu'un tel signal du circuit ECC participe à la vérification de l'intégrité des données. Alors, du côté du circuit SoC, le générateur 20 5 reçoit à la même position une valeur constante ECCOK correspondant à une absence d' erreur. Les interfaces de bus A, D, et CTRL, du fait qu'elles sont en général conçues pour synchroniser les signaux du bus B sur des horloges CK internes aux circuits, introduisent un retard d'au moins un cycle d'horloge. Ainsi, une transaction présentée 10 au bus dans le circuit SoC met au moins deux cycles pour parvenir à la mémoire DDR. Pour que les générateurs 20 et 22 calculent une signature sur les mêmes valeurs, les entrées du générateur 20 peuvent être retardées par une mémoire FIFO 26 dont la profondeur correspond à la durée de traversée du bus B. Plus spécifiquement, seuls les signaux partants sont retardés (adresses A, données en écriture D(W), et lignes de 15 commande CTRL(W) en écriture). Les signaux entrants ne sont pas retardés (données en lecture D(W) et lignes de commande CTRL(R) en lecture). La figure 3 est un chronogramme illustrant le fonctionnement du circuit de la figure 2 dans le cadre d'un exemple d'une lecture suivie d'une écriture. Les transactions relatives à la lecture sont représentées dans des rectangles grisés, et les transactions 20 relatives à l'écriture sont représentées dans des rectangles blancs. Les transactions sont représentées dans différentes colonnes correspondant à des éléments de système différents indiqués en haut de colonne, et dans différentes rangées correspondant à des temps croissant de haut en bas. A un cycle tO, le circuit SoC présente la transaction de lecture aux interfaces de bus. La 25 transaction contient l'adresse de lecture A0, aucune donnée D, et aucun signal de commande CTRL (du moins aucun signal DMI pris en compte dans la calcul de signature). La transaction est notée (A0, 0, 0), reflétant les états des lignes A, D et CTRL. A un cycle tl, la transaction (A0, 0, 0) est poussée dans la mémoire FIFO (FIFO IN) et 30 est présentée en parallèle sur le bus. Le circuit SoC présente la transaction d'écriture, contenant une adresse Al et des données DW1. La transaction est notée (Al, DW1, CW1), où CW1 désigne l'état des lignes de commande CTRL du canal d'écriture W, notamment des lignes DMI. 3038188 7 A un cycle t2, la transaction de lecture (A0, 0, 0) arrive dans la mémoire DDR, où elle provoque la recherche des données et est présentée au générateur de signature 22. La transaction d'écriture (Al, DW1, CW1) est poussée dans la mémoire FIFO et apparaît en parallèle sur le bus. 5 A un cycle t3, dans la mémoire DDR, la signature 22 est mise à jour par la transaction de lecture (A0, 0, 0). La valeur de la signature est notée SIGO-DDR. En même temps, la mémoire présente les données demandées par la transaction (A0, 0, 0) sur l'interface de bus dans une transaction de réponse notée (DRO, CR0) - données DRO sur le canal R de l'interface D, signaux de commande CR0 sur le canal R de l'interface CTRL. Enfin, la 10 transaction d'écriture (Al, DW1, CW1) arrive dans la mémoire. Les transactions (Al, DW1, CW1) et (DRO, CR0) sont présentées au générateur de signature 22. A un cycle t4, le bit à comparer de la signature SIGO-DDR, noté SO, est présenté sur le bus, en même temps que la transaction de réponse (DRO, CR0). Dans la mémoire DDR, la signature 22 est mise à jour par les transactions (Al, DW1, CW1) et (DRO, CR0). La 15 nouvelle valeur de la signature est notée SIG1-DDR. Du côté du circuit SoC, la transaction (A0, 0, 0) est extraite de la mémoire FIFO et présentée au générateur de signature 20. A un cycle t5, le bit à comparer de la signature SIG1-DDR, noté Si, est présenté sur le bus. Dans le circuit SoC, le générateur 20 produit la signature SIGO-SoC mise à jour par 20 la transaction présentée au cycle précédent, à savoir la transaction (A0, 0, 0) extraite de la mémoire FIFO. Le bit SO arrive dans le circuit SoC et est comparé au bit de même position de la signature SIGO-SoC. Une inégalité indique qu'un défaut d'intégrité s'est produit dans la transaction (A0, 0, 0) ou dans au moins une des transactions précédentes. Dans le même cycle, la transaction (Al, DW1, CW1) est extraite de la 25 mémoire FIFO et présentée au générateur de signature 20 avec la transaction (DRO, CR0) qui arrive dans le circuit SoC. A un cycle t6, la signature 22 est mise à jour dans le circuit SoC par les transactions (Al, DW1, CW1) et (DRO, CR0) et prend une valeur notée SIG1-SoC. Le bit Si arrive dans le circuit SoC et est comparé au bit de même position de la signature SIG1-SoC. 30 Ce chronogramme montre que certaines signatures sont calculées sur des valeurs mélangeant des transactions, comme les signatures SIG1-SoC et SIG1-DDR. Ce qui importe est que chaque transaction participe à une signature, de façon isolée ou avec 3038188 8 une autre transaction, et que les signatures des deux côtés du bus soient calculées sur les mêmes valeurs. La mémoire FIFO a ici une profondeur de deux cycles, correspondant au nombre de cycles nécessaires pour qu'une transaction traverse le bus dans l'exemple considéré. 5 Comme on l'a précédemment indiqué, les générateurs de signature 20 et 22 peuvent être des générateurs de codes CRC. Dans la présente application, on peut être amené à calculer un code CRC sur les lignes d'adresses A (au minimum 6 lignes pour un module de mémoire DDR élémentaire), 16 lignes de données en écriture (W), 16 lignes de données en lecture (R), quatre lignes DMI (en écriture et lecture), et finalement le bit 10 d'état du circuit ECC, soit un total de 43 bits. (Bien que le bus ne comporte que 16 lignes de données, les données y circulent au double de la fréquence d'horloge, de sorte que l'on traite 32 bits de données à la fréquence d'horloge.) En principe, un générateur de code CRC opère sur des bits fournis en série. La fréquence d'une mémoire DDR pouvant dépasser 1 GHz, il faudrait que le générateur 15 de code CRC fonctionne à près de 43 GHz, ce qui est difficile à réaliser avec les technologies actuelles. Un générateur de code CRC peut être conçu pour traiter plusieurs bits en parallèle, mais compte tenu de la complexité et des difficultés au niveau des chemins critiques que cela entraîne, cette solution est limitée en pratique à une dizaine de bits. La fréquence de fonctionnement du générateur serait encore trop 20 élevée. La figure 4 représente schématiquement un mode de réalisation de générateur de code CRC utilisable dans la présente application. Les bits sur lesquels on souhaite calculer les signatures, 43 dans le présent exemple, sont séparés en plusieurs groupes, ici cinq groupes de 8, 8, 9, 9, et 9 bits, respectivement. Chaque groupe de bits est fourni à un 25 générateur de code CRC parallèle indépendant, adapté au nombre de bits du groupe (huit ou neuf). Une porte OU exclusif XOR reçoit un bit de chaque code CRC pour fournir le bit à comparer S. La position du bit de chaque code CRC peut être arbitraire. De préférence on choisit une position dont la valeur est susceptible de changer rapidement, donc plutôt dans les poids faibles LSB. 30 La nature des codes CRC est choisie, de préférence, pour fournir une distance de Hamming relativement élevée, par exemple un code CRC de 32 bits. REVENDICATIONS1. Procédé de vérification de l'intégrité d'une communication entre un circuit maître (SoC) et un circuit esclave (DDR), comprenant les étapes suivantes : - envoyer des transactions du circuit maître au circuit esclave - mettre à jour une première signature cyclique multi-bits (20) à partir de chaque transaction telle que présente dans le circuit maître ; - mettre à jour une deuxième signature cyclique multi-bits (22), de même nature que la première, à partir de chaque transaction telle que reçue dans le circuit esclave; et - comparer un seul bit (S) de la deuxième signature cyclique à un bit de même position de la première signature cyclique. 2. Procédé selon la revendication 1, comprenant les étapes suivantes : - envoyer les transactions sur un bus (B) entre le circuit maître et le circuit esclave ; - stocker chaque transaction dans une mémoire FIFO ayant une profondeur correspondant au retard introduit par le bus ; - mettre à jour la première signature cyclique (20) à partir de la sortie de la mémoire FIFO ; et - transmettre au circuit maître le bit de signature à comparer sur une ligne du bus. 3. Procédé selon la revendication 2, dans lequel le circuit esclave est une mémoire de type DDR et le bit de signature à comparer est transmis par une ligne DMI du bus mémoire. 4. Procédé selon la revendication 3, dans lequel les première et deuxième signatures cycliques sont basées également sur les données lues dans la mémoire DDR. 5. Procédé selon la revendication 1, comprenant les étapes suivantes pour chacun des circuits maître et esclave : - diviser les informations de chaque transaction en plusieurs groupes ; 3038188 10 Io associer à chaque groupe un générateur respectif de code de contrôle de redondance cyclique (CRC) ; à chaque transaction, générer en parallèle les codes CRC ; et * produire le bit à comparer par une opération OU exclusif combinant un seul 5 bit de chaque code CRC. 6. Procédé selon la revendication 5, dans lequel les bits combinés des codes CRC sont des bits de poids faible.