• Aucun résultat trouvé

Augmenter la flexibilité d’un système et réduire sa consommation par des

Au niveau du processeur l’une des premières spécifications à déterminer est le jeu d’instructions qui fixe la taille des instructions, les modes d’adressage et donc le type d’opérandes pour chaque instruction ainsi que la classe du jeu d’instructions. Cette classe détermine si les instructions vont directement agir sur une pile, la mémoire, des registres généraux ou les deux à la fois. L’avantage d’un jeu d’instructions RISC1, comme celui

de ARM [30], est qu’il a une taille d’instruction fixe (16 et/ou 32 bits), ce qui implique un décodage plus simple au niveau du matériel. De plus il y a beaucoup moins de modes d’adressage. Ainsi une opération arithmétique par exemple ne travaillera que sur des re- gistres alors qu’un load ou store ne fera qu’un accès mémoire pour stocker la donnée dans un registre ou inversement. Ainsi, chaque type d’instruction peut être exécuté dans un module spécialisé différent, ce qui simplifie le contrôle et les unités d’exécution dans le processeur. Un exemple d’encodage d’instruction RISC est donné figure 3.1. La figure nous montre un exemple d’encodage d’une instruction qui possède comme opérandes sources Rs1 et Rs2 et comme opérande de destination Rd. Ces registres sont encodés avec leur numéro de registre et la taille de l’encodage dépend donc du nombre de registres. Ainsi plus il y a de registres généraux plus l’encodage du registre sera grand.

16 bit

Opcode

Rs1

Rs2

Rd

Figure3.1 – Exemple d’un encodage d’instruction d’un jeu d’instructions de type RISC

38 traitement et de contrôle du nœud Il existe deux types d’architecture entre des mémoires et un processeur figure (3.2). L’architecture de type Von Neumann possède une seule mémoire pour les instructions et les données, tandis que l’architecture de type Harvard possède deux mémoires distinctes pour les instructions et les données. L’architecture Harvard est plus performante que celle de Von Neumann puisqu’elle est capable de charger une instruction pendant qu’une autre instruction s’exécute en lisant ou écrivant dans la mémoire de données. Néanmoins l’archi- tecture Harvard requière une structure plus complexe et donc nécessite plus de matériel.

Mémoire U nité de C ontrôle U nité d'exécution Processeur M é m o ire d 'in s tru c tio n s

U nité de C ontrôle U nité d'exécution Processeur M é m o ire d e d o n n é e s

Figure3.2 – Architectures de processeur de type Von Neumann (gauche) et Harvard (droite)

Pipeliner un processeur permet d’augmenter le débit d’instructions et la fréquence maximale du processeur puisque le chemin critique entre deux étages consécutifs est ré- duit. En effet, le pipeline permet d’avoir différentes tâches s’opérant simultanément dans les différents étages de pipeline. Par contre, il ne permet pas de diminuer le temps d’exécu- tion d’une instruction. Un processeur pipeliné, contrairement à un processeur non pipeliné, devra avoir du matériel supplémentaire de contrôle pour gérer la dépendance des instruc- tions et gérer le flush du pipeline en cas de mauvaises prédictions de branchements ou d’interruptions. Les aléas de structures comme l’accès à la mémoire dans l’étage de Fetch pour lire une instruction et d’écriture et de lecture à l’étage de mémorisation peuvent être résolus en séparant les mémoires d’instructions et de données. L’accès en lecture des registres généraux dans l’étage de lecture des opérandes et l’écriture dans les registres généraux à l’étage de Write Back peut être résolu en faisant les écritures sur les fronts montants et les lectures sur les fronts descendants de l’horloge. Les aléas de données de lecture après écriture, écriture après lecture et écriture après écriture peuvent être résolus en faisant du forwarding qui consiste à prendre le résultat de chacun des étages du pipeline et de le ramener à l’étage fonctionnel qui en a besoin à ce cycle. Une autre possibilité est de décrocher temporairement le pipeline, ou stall du pipeline, en bloquant temporairement le pipeline le temps que l’aléa soit résolu. L’ordonnancement des instructions peut prévenir les aléas de données qui peuvent arriver entre un chargement mémoire dans un registre et l’utilisation de cette donnée à l’instruction suivante. Les aléas de contrôle comme les branchements peuvent être résolus en ajoutant un module de prédiction de branchement pour éviter de faire un stall du pipeline. Ainsi le pipelining d’un processeur n’est pas trivial et demande beaucoup de matériel supplémentaire pour le mettre en œuvre, mais permet d’avoir des performances accrues.

La taille de la mémoire utilisée et son type doivent être bien dimensionnés en fonction de la taille des programmes finaux qui seront chargés pour l’application et en fonction de leur utilisation par le processeur. En effet, dans le cadre d’un microcontrôleur avec uniquement de la SRAM comme mémoire, la mémoire représente une partie importante de la consommation statique lorsque le microcontrôleur est en mode veille. C’est pourquoi on préfèrera des mémoires avec la consommation la plus faible pour la rétention du programme mais avec des temps d’accès plus importants et une densité moins élevée qu’une mémoire

Augmenter la flexibilité d’un système et réduire sa consommation par des

solutions architecturales 39

de données plus rapide plus dense mais avec des courants de fuites plus importants qu’il faudra donc couper pendant le mode de veille.

Le cache d’instructions peut s’avérer très utile pour réduire la consommation d’énergie lors de la lecture d’une instruction dans la mémoire. Dans SleepWalker [50] la mémoire de programme est dans un domaine de puissance de 1V alors que la logique est dans un domaine de puissance de 0,4V. Un cache à 32 entrées de 16 bits est alors implémenté et permet d’avoir une réduction de la consommation du système de 21% à 52%. Grâce à ce cache, moins d’accès sont fait à la mémoire de programme mais le surplus en surface dans le domaine de puissance de 0,4V est de 33%.

Á un niveau hiérarchique plus élevé, la réduction de la consommation peut être obtenue en utilisant plusieurs processeurs dans un nœud de capteurs comme montré dans la figure 3.3 et utilisé récemment dans le système CC2650 de TI [156]. Un processeur très basse consommation (processeur LP) pour les tâches courantes du nœud et un processeur gé- néraliste (processeur HP) avec une moins bonne efficacité énergétique mais une fréquence de fonctionnement plus élevée ainsi que des capacités de calcul très supérieures pour les tâches irrégulières et les calculs complexes. De cette manière le processeur principal est coupé pendant les longues phases de veille. Le processeur basse consommation peut lui aussi être coupé mais va se réveiller régulièrement pour faire des mesures sur les capteurs, gérer le protocole radio pour la réception ou la transmission de données. Il réveillera le processeur principal si des calculs complexes sont à faire sur les données mesurées ou si un besoin applicatif irrégulier doit être exécuté. Cette solution architecturale augmente fortement la flexibilité du système et permet de s’adapter à différents types d’applications en exploitant la même architecture.

Processeur LP Mémoire LP Mémoire HP Processeur HP

Figure3.3 – Système Multi processeur avec un processeur basse consommation (Processeur LP) et un processeur haute performance (Processeur HP)

Les accélérateurs matériels et instructions dédiées sont très utilisés afin de déporter certaines parties du code exécutées régulièrement par du matériel dédié via un module externe au processeur, comme l’AES, le CRC ou le RNG dans le cas du STM32L0 [146] ou via des instructions DSP dédiées comme la MAC2 ou le SIMD3, très utilisés pour faire du

filtrage ou une FFT4. Ces solutions améliorent considérablement l’efficacité énergétique

du système et sont même développées aujourd’hui dans les processeurs généralistes comme celui du ARM Cortex-M4 avec le jeu d’instruction ARMV7-M [31].

Afin de rendre le système plus flexible et facile à utiliser pour les programmeurs, les microcontrôleurs possèdent des unités de débogage sur puce5. Il existe deux modes de

2. Multiply-Accumulate

3. Single Instruction Multiple Data 4. Fast Fourier Transform

40 traitement et de contrôle du nœud débogage, le Foreground Debug Mode (FGDM) pour le contrôle complet du processeur (stopper, relâcher le cœur de processeur et accéder aux informations internes) et le Back-

ground Debug Mode (BGDM) pour visualiser l’activité du processeur en arrière-plan alors

que le code s’exécute normalement. Aujourd’hui, au niveau industriel, le débogage s’effec- tue via le port JTAG6 ou le port SWD7. Dans [105], les auteurs ont développé un module

de débogage ICE8 pour un accélérateur de code java implémenté en asynchrone. Il est

capable de faire du FGDM et BGDM et possède une unité de détection des breakpoints9.

Chez ARM le débogage s’effectue à l’aide de plusieurs IPs regroupées sous le nom de Core- Sight. La figure 3.4 montre les deux IPs principales pour faire du FGDM et du BGDM dans les microcontrôleurs avec une architecture ARM. Le DAP10permet de faire du FGDM en

ayant accès aux cœurs et à tout l’espace mémoire et l’ETM11 permet de fournir la trace

en temps réel des instructions exécutées et des données pour faire du BGDM.

Figure 3.4 – IPs de ARM pour implémenter du Debug On Chip et obtenir une trace d’exécution [172]

Le debogage et le test sont très importants dans le domaine de l’industrie et il est impossible aujourd’hui d’avoir un microcontrôleur sans une unité de debug. C’est pourquoi il faut penser l’architecture du système et du processeur directement en y insérant une solution de debug et faire toujours attention au compromis consommation/service.

3.2 Réduire la consommation d’un système par une gestion