3MMCEP Projet CdC

Vous trouverez sur cette page la spécification précise du processeur à réaliser pendant le projet, ainsi que la liste des étapes à valider pour chaque séance et niveau de difficulté.
Sommaire
Planning des étapes du projet
Nous avons découpé l'implantation en 5 étapes correspondant au 5 séances encadrées de la partie projet, comme détaillé dans le tableau ci-dessous. A titre indicatif, nous avons aussi regroupé les étapes par niveau de difficulté : il ne faut bien sûr passer au niveau de difficulté supérieur que lorsque vous avez fini et rigoureusement testé les niveaux plus faciles.
Les étapes du niveau A sont difficiles et demandent un investissement conséquent, ne vous y engagez pas au détriment de votre travail dans les autres matières ! Les extensions sont elles-aussi des étapes difficiles, à réserver pour la fin du projet s'il vous reste du temps.
Indication concernant la notation du projet : la qualité sera largement valorisée par rapport à la quantité, il est inutile de vous lancer dans l'implantation d'extensions ou d'étapes avancées si les instructions de base ne fonctionnent pas parfaitement.
Attention : on rappelle également que l'on attend que vous rendiez, en plus du code VHDL, les tests que vous avez écrit pour valider les étapes.
Tableau d'avancement
Séance | Niveau C | Niveau B | Niveau A |
---|---|---|---|
2 | lecture et décodage des instructions, NOP, LUI, ORI | ||
3 | ADDU, ADDIU, SUBU, AND, ANDI, OR, XOR, NOR, XORI, SLL, SRL, SRA, SLLV, SRAV, SRLV | SLT, SLTI, SLTU, SLTIU, factorisation d'états | MULT, MULTU, MFLO, MFHI, MTLO, MTHI, DIV, DIVU |
4 | LW, SW | afficheur 7-segments, programme utilisant l'affichage VGA | LBU, LHU, LB, SB, LH, SH |
5 | BNE, BEQ, BLEZ, BGTZ, J, JAL, JALR, JR | BGEZ, BGEZAL, BLTZ, BLTZAL | |
6 | gestion d'une source d'interruption | programme intéressant sur FPGA | gestion des exceptions (ADD, ADDI, SUB, ...) |
Extensions | décaleur à barillet, timer | additionneur à préfixe | gestionnaire d'interruptions (RFE, MTC0, MFC0) |
La sémantique des instructions est détaillé dans le document de descriptions des instructions.
Le mécanisme d'interruption à gérer en séance 6 est détaillée sur cette page.
Précision concernant le décaleur à barillet : on ne vous demande pas de ré-implanter complètement le circuit de décalage, mais plutôt d'utiliser un seul opérateur fourni dans la bibliothèque VHDL (par exemple SHR) pour implanter les trois types de décalage demandé dans le cahier des charges. Pour cela, vous devez implanter les circuits miroirs en entrée et sortie comme détaillé dans le document ci-dessus.
Les extensions sont quant à elle décrites dans ce document.
En plus de ces documents rédigés par nos soins, vous aurez sûrement besoin de consulter la documentation officielle des cartes FPGA Xilinx si vous souhaitez par exemple gérer l'afficheur 7-segments.
Codage des instructions
Les instructions MIPS respectent un codage très régulier qui facilite l'implantation de l'état de décodage. Elles sont classées selon trois formats :
Format | Bits 31 à 26 | 25 ... 21 | 20 ... 16 | 15 ... 11 | 10 ... 6 | 5 ... 0 | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
R | opcode | registre rs | registre rt | registre rd | champs SH | champs FUNC | |||||||||||||||||||||
I | opcode | registre rs | registre rt | constante sur 16 bits | |||||||||||||||||||||||
J | opcode | constante sur 26 bits |
On donne ci-dessous les tableaux qui permettront le décodage des différentes instructions :
codop | bits de 28 à 26 | |||||||
---|---|---|---|---|---|---|---|---|
bits de 31 à 29 | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
000 | spécial | regimm | J | JAL | BEQ | BNE | BLEZ | BGTZ |
001 | ADDI | ADDIU | SLTI | SLTIU | ANDI | ORI | XORI | LUI |
010 | cop0 | - | - | - | - | - | - | - |
011 | - | - | - | - | - | - | - | - |
100 | LB | LH | - | LW | LBU | LHU | - | - |
101 | SB | SH | - | SW | - | - | - | - |
11x | - | - | - | - | - | - | - | - |
FUNC | bits de 2 à 0 | |||||||
---|---|---|---|---|---|---|---|---|
bits de 5 à 3 | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
000 | SLL | - | SRL | SRA | SLLV | - | SRLV | SRAV |
001 | JR | JALR | - | - | SYSCALL | BREAK | - | - |
010 | MFHI | MTHI | MFLO | MTLO | - | - | - | - |
011 | MULT | MULTU | DIV | DIVU | - | - | - | - |
100 | ADD | ADDU | SUB | SUBU | AND | OR | XOR | NOR |
101 | - | - | SLT | SLTU | - | - | - | - |
11x | - | - | - | - | - | - | - | - |
RT | bits de 18 à 16 | |||||||
---|---|---|---|---|---|---|---|---|
bits de 20 à 19 | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
00 | BLTZ | BGEZ | - | - | - | - | - | - |
10 | BLTZAL | BGEZAL | - | - | - | - | - | - |
x1 | - | - | - | - | - | - | - | - |
RS | bits de 23 à 21 | |||||||
---|---|---|---|---|---|---|---|---|
bits de 25 à 24 | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
00 | MFC0 | - | - | - | MTC0 | - | - | - |
01 | - | - | - | - | - | - | - | - |
FUNC | bits de 2 à 0 | |||||||
---|---|---|---|---|---|---|---|---|
bits de 5 à 3 | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
00x | - | - | - | - | - | - | - | - |
010 | RFE | - | - | - | - | - | - | - |
001 | - | - | - | - | - | - | - | - |
1xx | - | - | - | - | - | - | - | - |
Implantation de la Partie Opérative
La PO qui vous est initialement fournie correspond au schéma ci-dessous (les parties jaunâtres seront à rajouter si vous implantez la gestion d'une source d'interruption à votre projet) :
Attention : notez bien que les feedback Z, C et S sont des sorties combinatoires de l'UAL envoyées directement à la PC et ne sont pas stockés dans un registre (à la différence du Pentium par exemple où les indicateurs sont stockés dans le registre %eflags).
Dans la PO, on utilise les conventions de codage suivantes :
cmd_ALU_X_Sel | Opérande sélectionné |
---|---|
0000 | Registre rs (désigné par IR25...21 et passant par le port A) |
0001 | Registre PC |
0010 | Registre EPC (note : à ajouter dans la PO au moment utile !) |
0011 | Registre DT |
1000 | Constante 0 sur 32 bits |
1001 | Constante 1 sur 32 bits |
1010 | Constante 16 sur 32 bits |
1011 | Constante 4096 sur 32 bits |
1100 | PC31...28 || 028 |
1101 | 027 || IR10...6 |
Où :
- || est l'opérateur de concaténation de chaines de bits : par exemple, "1010" || "101" = "1010101" ;
- xn représente la chaine de bits composée du bit x répété n fois : par exemple, 04 = "0000" ;
- xa...b représente la sous-chaine de bits composée des bits de la chaine x dont les numéros sont compris entre a et b inclus : par exemple, "11101000"5..3 = "101".
cmd_ALU_Y_Sel | Opérande sélectionné |
---|---|
000 | 016 || IR15...0 |
001 | IR1516 || IR15...0 |
010 | 04 || IR25...0 || 02 |
011 | IR1514 || IR15...0 || 02 |
100 | Registre rt (désigné par IR20..16 et passant par le port B) |
110 | Constante 0 sur 32 bits |
111 | Constante 4 sur 32 bits |
Où IR1516 || IR15...0 construit le mot de 32 bits composé des 16 bits de poids faible de IR et du bit 15 de IR répliqué 16 fois dans les poids forts du mot (dit autrement, si on considère que les 16 bits de poids faible de IR forme un mot de 16 bits, on construit le mot de 32 bits correspondant en faisant une extension de signe).
cmd_ALU_OP | Opération sélectionnée |
---|---|
000? | RES <-- X + Y |
001? | RES <-- X - Y |
0100 | RES <-- X and Y |
0101 | RES <-- X or Y |
0110 | RES <-- X xor Y |
0111 | RES <-- X nor Y |
100x | RES <-- Y << X4...0 |
1010 | RES <-- Y >> X4...0 (décalage logique) |
1011 | RES <-- Y >>> X4...0 (décalage arithmétique) |
Où <-- représente l'assignation de valeur.
Attention, le bit noté ? dans l'addition et la soustraction permet de décider d'une opération signée ou non-signée. Regardez le code de la PO pour trouver le bon codage.
cmd_ADDR_Sel | registre source |
---|---|
0 | registre PC |
1 | registre AD |
Toutes les commandes sur 1 bits sont actives à l'état haut (e.g. il faut envoyer '1' pour activer la commande).
Validation
Il est obligatoire d'utiliser le mécanisme de validation détaillée à la séance 2 pour permettre aux enseignants de noter la progression régulière du travail.
L'application de validation utilise une base de tests dont on ne donne pas les sources afin de vous inciter à réaliser vos propres tests.
Attention : les programmes servant de tests utilisent pour la plupart plusieurs instructions autres que l'instruction testée. Cela signifie qu'il est possible que l'instruction X que vous cherchez à valider fonctionne correctement, mais que la validation ne soit pas acceptée car votre implantation de l'instruction Y utilisée dans le test est fausse.
On vous donne ci-dessous la liste des dépendances entre les tests et les instructions (évidemment, chaque test dépend aussi de l'instruction dont il porte le nom !) :
- dépendance(s) de test_S2_lui.s : aucune
- dépendance(s) de test_S2_ori.s : aucune
- dépendance(s) de test_S3_addiu.s : ori, addu
- dépendance(s) de test_S3_addu.s : ori
- dépendance(s) de test_S3_andi.s : ori
- dépendance(s) de test_S3_and.s : ori
- dépendance(s) de test_S3E_slti.s : lui, ori
- dépendance(s) de test_S3E_sltiu.s : lui, ori
- dépendance(s) de test_S3E_slt.s : ori
- dépendance(s) de test_S3E_sltu.s : ori
- dépendance(s) de test_S3_nor.s : ori
- dépendance(s) de test_S3_or.s : ori
- dépendance(s) de test_S3_sll.s : ori
- dépendance(s) de test_S3_sllv.s : ori, sll
- dépendance(s) de test_S3_sra.s : addiu
- dépendance(s) de test_S3_srav.s : addiu, sra
- dépendance(s) de test_S3_srl.s : ori
- dépendance(s) de test_S3_srlv.s : ori, srl
- dépendance(s) de test_S3_subu.s : ori
- dépendance(s) de test_S3_xori.s : ori
- dépendance(s) de test_S3_xor.s : ori
- dépendance(s) de test_S4_lw.s : ori
- dépendance(s) de test_S4_lw_sw.s : ori, lw
- dépendance(s) de test_S5_beq.s : addiu, j
- dépendance(s) de test_S5_bgtz.s : ori, addiu, j
- dépendance(s) de test_S5_blez.s : addiu, j
- dépendance(s) de test_S5_bne.s : ori, j
- dépendance(s) de test_S5E_bext.s : ori, lui, bltzal, j, bltz, nor, bgez, or, bgezal, jr
- dépendance(s) de test_S5_jalr.s : ori, jr
- dépendance(s) de test_S5_jal.s : ori, jr
- dépendance(s) de test_S5_jr.s : ori, j
- dépendance(s) de test_S5_j.s : ori
- dépendance(s) de test_S6_irq.s : ori, bne, j
Extensions à la spécification de base du projet
Une fois que vous avez validé toutes les étapes obligatoires, vous pouvez si vous le souhaitez rajouter des extensions à votre projet. Vous avez un grand degré de liberté concernant ces extensions mais nous vous proposons quelques idées dans le document suivant.
On rappelle la structure globale du système développé, une fois que les extensions suggérées sont intégrées (parties en jaunâtre) :