TME7 -- Modèle VHDL de l’étage DECOD (partie 2)
Objectifs
- Faire un premier modèle comportemental de l’étage decod.
- Tester ce modèle.
Exercices
Exercice 1 -- Machine à état de decod
Le contrôle du flot d’instruction par decod est plus complexe que pour exec. decod communique avec ses deux voisins ifetch et exec, suivant une unique séquence qui suivant l’instruction à exécuter pourra être incomplète :
- Envoyer l’adresse d’une instruction dans la fifo dec2if ;
- Lire l’instruction chargée par ifetch et stockée dans la fifo if2dec ;
- Décoder l’instruction chargée ;
- Écrire le résultat du décodage (opérandes, opérations à réaliser ...) dans la fifo dec2exec à destination de exec.
La fonction principale de cette machine à état consiste à contrôler la lecture et l’écriture dans les trois fifos. Trois signaux vont être dédiés à ces actions dans l’ordre de la séquence précédemment exposée : dec2if_push, if2dec_pop (correspond au port dec_pop) et dec2exe_push. Ces signaux sont affectés par la machine à état.
De par leur nature et sans considérer l’état de remplissage des différentes fifos certaines instructions vont être traitées en plusieurs cycles : les branchements et les instructions de transfert multiples. Généralement le simple décodage combinatoire des instructions va être suffisant pour générer les opérandes et commandes à destination de exec, ce n’est pas le cas pour les instructions nécessitant plusieurs cycles.
Dans le cas des appels de fonction (branch and link) mon implémentation utilise un premier cycle pour la sauvegarde de l’adresse de retour. Au moment du décodage d’une instruction bl, PC a déjà progressé de 2 instructions (PC+8) et donc pour calculer l’adresse de retour 4 est envoyé comme second opérande, PC comme premier opérande et exec reçoit la commande correspondant à effectuer une soustraction. Tout cela est commandé par le signal blink généré par la machine à état.
Les signaux mtrans_shift et mtrans_loop_adr sont générés par la machine à état et utiles dans le cas des transferts multiples.
Nous allons détailler pour chaque état à quelle configuration des entrées correspond une transition :
Transition | Action |
---|---|
FETCH | État de démarage (après reset) decod envoie une première adresse vers ifetch |
T1 | La fifo vers ifetch est pleine |
T2 | Une première valeur de pc a peu être écrite dans dec2if |
RUN | État général de fonctionnement pour toutes les instructions traitées par decod dans le cycle |
T1 | if2dec vide, dec2exe pleine ou prédicat invalide, une nouvelle valeur de pc est envoyée vers ifetch si la fifo dec2if n’est pas pleine |
T2 | Le prédicat est faux, l’instruction doit être jetée |
T3 | Le prédicat est vrai, l’instruction est exécutée |
T4 | L’instruction est un appel de fonction |
T5 | L’instruction est un branchement |
T6 | L’instruction est un transfert multiple |
LINK | |
T1 | Transition prise systématiquement, commande d’exec pour calculer une nouvelle valeur de pc. |
BRANCH | Purge de l’instruction suivant un branchement pris. |
T1 | if2dec est vide. |
T2 | if2dec n’est pas vide. |
MTRANS | traitement des instructions de transfert multiple... |
Cette machine à état étant de type Mealy la valeur des sorties va dépendre des transitions. À vous de déterminer la valeur des sorties pour chacune des transitions. Vous allez dans un premier temps décrire le modèle comportemental du banc de registre reg qui va constituer un des composants de decod.
Question 1
Complétez le modèle vhdl du bloc decod.
Question 2
Écrire un fichier test bench permettant de valider votre modèle.