Travail demandé

Vous venez de lire les spécifications d’un petit micro-processeur, appelé ici "Nanoprocesseur". Comme tout projet bien spécifié, il a été possible de partager le travail de conception entre différentes équipes qui ont pu travailler de façon indépendante à la conception des différents modules. Ainsi, la carte de circuit imprimé contenant les différents composants est prête, un programme de test est déjà écrit (en assembleur), le schéma global est terminé ainsi que les sous-blocs ALU, REG, MEMOIRE.

Hélas, lors de la phase finale d’intégration, le chef de projet réalise, tardivement il est vrai, que les deux équipes chargées des blocs PC et CTR ont fait un travail de tellement piètre qualité, qu’il juge préférable de les reconcevoir complètement.

Il se tourne vers vous et vous confie la tâche de concevoir ces deux blocs. A vous de jouer...

1. Conception du bloc ''PC''

  • Déterminez le fonctionnement exact de ce bloc à partir des spécifications globales, en faisant un schéma.
  • Puis traduisez ce schéma en System-vérilog, et complétez le fichier pc.sv (en respectant les noms déjà définis).

Nous vous recommandons d'utiliser la syntaxe case déjà employée dans les TP précédents.

  • Vérifiez le fonctionnement de PC en tapant la commande make simu_pc

  • Après un certain temps, le simulateur doit vous afficher : "le bloc PC fonctionne", et la fenêtre des chronogrammes doit avoir la même tête que la figure 5.

Fig. 5 : Chronogrammes du PC

Si le simulateur vous indique une erreur, c’est que votre code Verilog comporte une erreur de syntaxe. Fermez le simulateur, corrigez le code source, et relancez la simulation.

Si les chronogrammes ne sont pas assez grands, vous pouvez zoomer à l’aide des icônes . Vous pouvez aussi zoomer sur une partie précise avec l’icône .

2. Conception du bloc ''CTR''

Fig. 6 : Bloc CTR

De nouveau, il faut commencer par lire les spécifications pour en extraire le comportement de la machine à états, puis en déduire une architecture (en faisant un schéma), puis le coder en system-vérilog. Faites attention, la machine à état est un peu spéciale:

  • L'évolution des états ne dépend pas des entrées,
  • Les sorties dépendent de l'état courant et des entrées (machine de Mealy).

Complétez le fichier ctr.sv. Pour cela nous vous conseillons :

  1. D'utiliser les méthodes proposées dans le TP séquentiel : Codage des machines à états,

  2. De traiter séparément chaque signal de sortie (un always@(*) par signal de sortie) en utilisant ce complément de syntaxe sur les expressions booléennes en System Verilog.

2.1. Validation

Vous pouvez vérifier le bon fonctionnement de CTR en simulant directement le système complet (nanoprocesseur + mémoire) avec un programme de test. Ce programme, nommé verif_globale permet de tester l’exécution de toutes les instructions du nanoprocesseur.

Pour cela, vous avez deux options : la simulation (virtuelle) et l’exécution pas-à-pas sur la maquette.

2.2. Simulation

Les chronogrammes doivent ressembler à ceux de la figure 7.

Fig. 7 : Chronogrammes de la simulation du programme de test

Ces chronogrammes sont disponibles en version plus grande en cliquant ici.

Nous avons inclus dans ces chronogrammes les signaux nécessaires à la compréhension de ce qui se passe dans le processeur :

  • l’horloge et le reset,
  • les signaux d'échange avec la RAM,
  • le signal pilotant le buzzer,
  • les trois registres principaux du processeur
    • I : le registre d’instructions, sous forme hexadécimale et textuelle,
    • PC : le compteur de programme,
    • ACCU : l’accumulateur,
  • les entrées et sorties de l’ALU,
  • les entrées et sorties du bloc contrôleur CTR.

Pour suivre les chronogrammes, il est conseillé de se rapporter à la page du programme de test, et de suivre le déroulement du programme cycle par cycle.

Il est également possible de comparer vos chronogrammes à des chronogrammes de référence. Pour cela :

  • Dans Tools -> Waveform Compare -> Comparison Wizard,

  • Choisir vsim_ref.wlf dans le champs "Reference Dataset", puis "Next"
  • Sélectionnez "Specify Comparison by Region", puis "Next"
  • Choisir "simu" dans le champs "Reference Region", puis "Next"
  • Séléctionnez "Compute Differences Now"
  • Dans la fenêtre des chronogrammes, la liste des différences est affichée sous les signaux (avec une icône en forme de triangle jaune).

Par exemple, ces chronogrammes mettent en évidence un dysfonctionnement

2.3. Test réel

Lorsque la simulation est correcte, vous pouvez suivre le déroulement du programme "en vrai", sur la maquette de test.

  • Synthétisez le code correspondant : make verif

  • Si la synthèse s’est terminée sans erreur, programmez le FPGA : make prg_verif

Il y a deux modes d’exécution de ce programme de test :

  • pas-à-pas, si l’interrupteur SW0 est à 1 (en position vers le haut) C’est le bouton KEY3 qui donne alors l’horloge (un appui = un coup d’horloge)

  • automatique, si l’interrupteur SW0 est à 0 (en position vers le bas) L’horloge est alors générée automatiquement, et le programme s’exécute à vitesse normale (25MHz).

Vous pouvez ré-initialiser votre microprocesseur en appuyant sur le bouton KEY0.

Vous pouvez suivre l’état de certains signaux du processeur :

  • sur les deux afficheurs 7 segments de droite (HEX1,HEX0) : ram_addr[7:0]

  • sur les deux afficheurs 7 segments de gauche (HEX7,HEX6) : accu[7:0]

  • sur l'afficheur 7 segment du milieu (HEX4) : I[3:0]

2.4. Test musical

Pour finir le test de votre processeur, nous vous proposons de lui faire jouer un petit morceau de musique. Pour cela:

  1. Lancez la compilation du processeur en lui passant en argument le programme musical : make chicken.
  2. Appelez un enseignant qui branchera un haut-parleur sur votre maquette.
  3. Programmez le FPGA : make prg_chicken
  • Montrez que les instructions JNC, JNZ, JMP, ROL et ROR peuvent être exécutées en deux cycles.
  • Modifier le contrôle en conséquence.
  • Vérifiez le bon fonctionnement de votre processeur (simulation, synthèse, programmation...)

4. Questions subsidiaires

Suivant le temps disponible, traitez dans l'ordre indiqué les questions suivantes:

  1. Comment augmenter de 256 à 1024 la taille de la mémoire ?
  2. Peut on pipeliner le nano-processeur pour multiplier sa vitesse de fonctionnement par 3 ?