# TSA - TD 8 : Prise de notes
###### tags: `TSA` `S2` `Notes`
## 1) Les modes d'adressage
Diapo : https://docs.google.com/presentation/d/1E_TFdJ1dujbtbVWzSF49c_5SlXTqY4uCz-dodRPiuMw/edit#slide=id.p
2x 32 registres de 32 bits
### Les buffers
**Linéaire**
L'échantillon qui arrive prend la place à l'index 0. Tout les autres indices vont etre décalés
**Circulaire**
Implémenté pour des piles FIFO notament. Les index n'ont pas besoin d'êtré décalés avec cette méthode.
### L'Address Mode Register
**Registre circulaire**
B-7 -> B-4
A-7 -> A-4
### L'adressage
Méchanisme de transférer des données au proc qui va les traiter.
Tous le types d'@ prennent 5 cycle
- Immédiat
On indique directement l'@ du registre
`load 0x100, A2`
- Direct
Copie du contenu de la case memoire
`mov R1, R2`
- Indirect
va chercher a l'@ contenu dans la case memoire
`load *R1, R2`
- Indirect relatif
va chercher a l'@ + un offset (une valeur idiquée)
`load &R1+4, R2`
- Indirect indexé
va chercher a l'@ + un offset (une valeur dans un autre registre)
`load (&R1)+R2, R3`
quand on un seul + ca modifie pas la valeur du registre source, contrairement à ++
ldb +A3[1],A7 si A3 = 1000 on va stocker dans A7 1001 mais A3 reste egal a 1000
## 2) Les chemins de données
Diapo : https://docs.google.com/presentation/d/1nqdU0Vyq_wEalGMEZvg2_LWVHiPdhVwarqfvp7mcHwM/edit#slide=id.p
2 : Les chemins de données sont les composants qui traitent les données : elles transforment une donnée d’entrée en donnée de sortie
Il existe plusieurs composants tels que la mémoire centrale, les registres internes (généraux ou de contrôle et d’état), les unités de calculs (UAL) et le bus.
C’est l’unité de contrôle qui séquence les opérations à exécuter par le chemin de données selon des entrées externes et le résultat des opérations
3 : Chemin de données possède deux parties principales
-un bloc de registres qui conserve les données à traiter et des résultats précédents -> sert de mémoire
– des unités fonctionnelles pour effectuer des opérations sur les données : des opérations logiques, arithmétiques ou encore des transferts entre registres
Ce modèle possède deux chemins de données A et B. Chacun possède 32 registres de 32 bits, numérotés de 0 à 31 (A0-A31, B0-B31). De plus, chaque chemin est doté de 4 UAL (Unité Arithmétique et Logique). La séparation en deux chemins permet l'accès à la mémoire de deux valeurs à la fois. De plus, on a la possibilité de faire du traitement en parralèle des données.
Les UAL sont divisées en quatre catégories : L (opération arithmétique et logique), S (opérationde décalage), M (opération de multiplication) et D (opération d'adressage).
Le stockage des données supporte des données compressées sur 16 bits, des virgule fixe sur 40 bits ou des virgules flottantes sur 64 bits.
Pour les longs nombre ont peut les stocker dans 2 slots de registre (les bits de poids faibles dans un registre pair et les bits de poids forts dans le registre suivant, impair cette fois-ci). Ex: A0-A1, on a donc a disposition 64 bits et souvent on utilise 40 bits qui correspond au format long.
## 3) Les cycles machine des instructions
Diapo : https://docs.google.com/presentation/d/1InMLvcfr4fARM1DMts5DLGwOkc-F_58vEOj0ru9S2a0/edit?usp=sharing
Delay slot : Nombre de cycles machine nécessaires pour la réalisation du calcul, temps d’attente avant que la valeur en bascule de sortie soit valable, nombre de cycle avant que l’on puisse lire le résultat.
Par exemple, pour une instruction de 4 cycle, les opérandes sont lu à l’état i et produisent un résultat que l’on peut lire à l’état i+4
Functional unity latency : Temps à attendre avant de pouvoir réaliser une nouvelle opération
Par exemple, pour l’addition, la soustraction, la multiplication ou la division d’un double float, elle est plus grande que 1.
Des opérations qui lisent par exemple à des instants i+1 ont forcément une functional unity latency plus grande que 1.
Le DSP que nous étudions possède 8 unités de traitement. On a donc à chaque cycle Fetch 8 instructions chargées.
Le cycle Fetch est un cycle qui recherche et charge l’instruction pointée par le compteur de programme PC dans le registre d’instruction ( Rappel sur le registre PC: registre qui contient l’@ de la prochaine instruction à exécuter) .
On appellera un fetch packet le paquet ainsi constitué des 8 instructions comme est affiché sur la figure, ces 8 instructions sont chargées en même temps sur le bus d’adresse et constitue le fetch paquet.
Sur la figure, on peut voir le format basique d’un Fetch Packet avec ses 8 instructions. On remarque que ces instructions sont classées dans l’ordre croissant de leur adresse.
L'exécution de chaque instruction est contrôlée par un bit contenu dans l’instruction, que l’on appellera le p-bit ou bit 0 car le bit de parité est le bit de poids faible de chaque instruction. C’est ce bit qui dira si une instruction doit être réalisée en parallèle avec une autre ou pas.
Petite précision sur ce qu’est le parallélisme. C’est le fait d'exécuter plusieurs instructions simultanément (grâce à l’existence de plusieurs unités de traitement dans le microprocesseur).
Chaque unité du microprocesseur permet de faire une action bien distincte. Ainsi, si un microP permet le parallélisme il peut par exemple lire, exécuter et charger une instruction en même temps.
Le parallélisme est très lié à la notion de pipeline dans le processeur. Le mécanisme de pipeline permet de trouver le moyen pour que toutes les unités du microprocesseur fonctionnent en même temps.
Pour en revenir sur les bits de parité: ils sont alors lu de l’adresse inférieure à l’adresse supérieure et quand celui-ci vaut 1, ça signifie que l’instruction dont le p-bit vaut 1 et la suivante seront exécutées en parallèle. Et donc si le p-bit = 0, l’instruction suivante sera exécutée dans le cycle suivant.
Les instructions s'exécutant en parallèle sont alors placées dans l’execute packet qui peut lui aussi contenir 8 instructions, ce nombre d’instruction dépend du type de DSP. (au maximum ? Le DSP C67x+ est capable de mettre plus que 8 instructions dans son execute packet. Je sais pas si l’execute packet fait la même taille que le Fetch packet). Chaque instruction devra utiliser une unité fonctionnelle différente afin de garantir le mécanisme de pipeline. Logiquement, le dernier p-bit de l’execute packet sera toujours fixé à 0 et chaque nouveau fetch packet lancera un nouveau execute packet.
Les p-bits peuvent suivre 3 motifs différents : le fully serial (complètement en série), fully parallel (complètement en parallèle) et partially serial (partiellement en série) dont les schémas explique très bien leur fonctionnement.
Pour le code: On utilise la commande | pour implémenter le parallélisme. Le pipe va ainsi signifier que l’instruction et la précédente vont être exécutées en parallèle. Ainsi, les instructions C, D et E seront faites en parallèle. On remarque que ce code est en fait celui du motif partiellement en série vu plus haut.
Il est intéressant de noter que si un branchement est réalisé à l’intérieur d’un execute packet, alors toutes les instructions situées aux adresses inférieures sont ignorées. Par exemple, si un branchement a lieu vers l’adresse contenant l’instruction F, alors F,G et H vont bien s’exécuter mais toutes les autres instructions situées aux adresses inférieures comme A ou E seront ignorées. Ou si le branchement a lieu à l’adresse de G, alors même si F et G doivent théoriquement s’exécuter en parallèle (donc en même temps) l’instruction F sera ignorée.
Mais je laisse la parole à Thomas pour expliquer qu’est-ce qu’un branchement.
Les instructions de branchement permettent d'interrompre le déroulement normal du programme en faisant un saut d'un endroit du programme vers un autre endroit.
C’est pour cette raison qu’on les appelle aussi “instructions de saut”.
On les utilise par exemple pour l’exécution d’une instruction en fonction du résultat d’un test conditionnel
La figure montre les phases de pipeline utilisées par l'instruction de branchement et le code cible de branche.
On remarque qu’il y a cinq intervalles de retard entre l'exécution de la branche et l'exécution du code cible. Ils sont notés en grisé sur le schéma
Si une branche est dans la phase E1 du pipeline (dans l'unité S2 sur la figure), sa branche cible est dans le paquet de récupération qui est dans PG pendant ce même cycle (grisé sur la figure).
En effet, la branche cible doit attendre qu'elle atteigne la phase E1 pour commencer
l'exécution, la branche prend ainsi cinq intervalles de retard avant que le code cible de la branche s'exécute.
## 4) Les instructions du DSP
Diapo : https://docs.google.com/presentation/d/1lWMGFzOu1sJQs7yg768D0v8cNCUchDBmVBqxINn7WJY/edit#slide=id.p
Tout d’abord, vous pouvez voir ici un diagramme de base du DSP C6747. La partie de droite, où vous pouvez voir le C6000 CPU correspond au processeur. À l’intérieur, vous pouvez voir les registres de contrôle, les unités pour chercher les instructions (partie fetch), les décoder, et sélectionner les circuits nécessaires au traitement de chaque instruction…mais le plus important c’est de remarquer que nous avons deux chemins de données différents A et B, composés de 32 registres de 32 bits, ce qui correspond à 64 registres de travail. En d’autres mots, nous pouvons accéder à la mémoire pour lire 2 valeurs simultanément et nous pouvons y réaliser des traitements en parallèle.
Ensuite, nous allons voir la syntaxe des instructions. Il faut déjà prendre en compte qu’il s’agit d’instructions en assembleur vu que nous sommes dans le processeur. Alors, la syntaxe générale est la suivante : INST unit source1 source2 dest.
INST : correspond à l’abréviation utilisée pour l’instruction comme ADD ou MVK.
Unit1 : désigne l’unité sur laquelle on exécute l’instruction, donc une de celles dont Noëline vient de parler.
Source1 : désigne la source du premier opérande (il faut avoir stocké la valeur de cet opérande dans le registre considéré auparavant).
Source2 : désigne la source du deuxième opérande (il faut avoir stocké la valeur de cet opérande dans le registre considéré auparavant).
Dest : designe l’endroit où sera stocké le résultat.
Nous avons d’autres règles de syntaxe plus spécifiques :
1-Exécutions conditionnelles : Nous pouvons donner une condition pour qu’une instruction s’exécute. Dans ce cas, ce que nous sommes en train de dire signifie qu’il faut que le registre B0 soit non nul pour que l’instruction s’exécute. Il faut donc placer le registre concerné entre crochets.
2-Exécutions parallèles : On peut demander que 2 instructions s’exécutent en parallèle. Pour cela, il faut placer d’abord les 2 barres verticales que vous voyez dans la deuxième ligne. Dans ce cas, il faut que B0 soit non nul pour exécuter la première instruction ou qu’il soit nul pour exécuter la deuxième, mais les deux peuvent s’exécuter en parallèle si ce registre change de valeur entre temps.
3-Croiser les chemins : Le 3ème cas consiste à combiner les 2 chemins de données, A et B. Il faut dans ce cas écrire .LIX, le X designant le fait que nous croisons les chemins. Ainsi, dans ce cas, on multiplie A1 et B1 et nous mettons le résultat dans A3.
L'opcode peut être défini comme la traduction du code assembleur en une suite de bits de 0 et de 1 qui est le langage "compris" par la machine. Par exemple lorsqu'il s'agit de traiter l'instruction MPY, il y'a un champ au niveau de l'opcode qui permet à la machine d'identifier l'instruction.
L'opcode est différent pour chaque instruction . D'ailleurs c'est ce qui permet de les différencier au niveau du procésseur. De plus pour une instruction donnée, exécutée dans deux types de processeurs diférents,l'opcode peut qussi être différent. Ce qui nous améne à dire qu'il dépend du type de processeur qui est utilisé.
Il est codé sur 32 bits. Un exemple est donné sur les slides, le champ creg codé sur 3 bits permet de mettre une condition sur les registres. Il est codé sur 3 bits car on nepeut mettre des conditions que sur les 4 registres(A0 A1 B0 B1) donc ce qui fait 2^3. Le champ z codé sur un bit nous permet de verifier la avalidité ou pas de la condition.LE champ dest codé sur 5 bits(2^5 = 32: il y a 32 registres pour chaque side) pour dire sur quel registre on va mettre la valeur Les 5 bits avant le champ s permet de specifier le type d'instrucition. Le bit s(1 pour side A et 0 pour side b) c'est pour voir sur quel side de l'UAL l'execution sera executée et enfin le bit p pour dire si l'execution est paralléle ou pas(1 pour c'est paralléle et 0 pour pas paralléle)
L'instruction MPY est assez similaire que l'instruction ADD au niveau de l'opcode. Le seul champ qui change c'est les 5 bits avant s qui permet de dire de spécifier l'instruction MPY. Elle est exécutéé sur les unités .M1 et .M2.
Le syntax est le suvivant: ***MPY .M1(ou .M2) A1,A2,A3***
L’instruction ADD permet d’additionner deux entiers signés et de mettre le résultat sur le registre dest. Les unités de traitement qui y sont utilisés sont .L1, L2, S1, S2, D1, D2. En fonction des unités de traitement utilisées, nous avons différents opcodes.
Pour l’unité L, nous voyons le champ creg et z qui servent à utiliser les conditions. Si la condition est verifiée z vaudra 1 et sinon 0. Les champs dst et src2, src1 correspondent à la destination et aux sources. Le champ x sert à indiquer si les chemins sont croisés ou pas. Le champ Op correspond à opfield et varie selon les types des opérandes utilisés. Finalement, le champ s permet d’indiquer si on utilise le chemin A ou B pour les données et le champ p indique si la prochaine exécution est parallèle ou pas.
Dans l’exemple, on a considéré qu’il n’y a pas de condition. Ensuite, nous voyons qu’il s’agit d’une instruction croisé d’où le 1 pour le x. Le opfield vous allez voir ce que c’est toute suite, et pour le champ s on dit que c’est le chemin B où on met le résultat et pour p on dit que c’est égal à 0 car il n’y a pas d’instruction parallèle.
Finalement, nous pouvons voir aussi les opcodes pour les quand on utilise les unités de traitement S et D. Nous voyons qu’il y a juste 1 bit qui change pour l’unité S (opfield raccourci d’1 bit) et aussi pour l’unité D, où il ne peut pas y avoir des instructions croisées.
## 5) Pipeline
Diapo : https://docs.google.com/presentation/d/1YhRCDBiZFgai1EGmNSxfp2okf33mTHPT5EoTBg-K-dA/edit?usp=sharing
## 6) Les interruptions
Voir diapo : https://hackmd.io/@wo0lien/r1WpKj488#/11
### Les conditions des interruptions Non masquables
Tout est détaillé dans le diapo :smile: