Architecture logicielle et matérielle de référence
 Sommaire
Dans ce document, est décrit une micro-architecture RISC qui pourrait servir de support à l'enseignement d'architecture du cours S1 de DEUG MIAS.
Cette micro-architecture a été étudiée cette année en S4 et continuera a priori à servir de support les prochaines années.
Elle a de plus l'avantage par rapport à l'architecture CISC étudiée cette année en S1 d'être simple à programmer et moins complexe d'un point de vue matériel.
Nous en présentons une version simplifée.

La première sous-partie décrit le jeu d'instructions, la seconde sous-partie une micro-architecture qui implémente ce jeu d'instructions.
L'architecture RISC proposée s'inspire des microprocesseurs RISC actuels avec une taille d'instruction réduite à 16 bits et un
nombre de registres égal à 8.

1 Notations

Les conventions et notations suivantes sont utilisées :

uimm11 constante non signée codée sur 11 bits. Lorsque cette constante est employée dans une instruction,
elle est complétée par des 0 dans les bits de poids fort si nécessaire pour l'étendre sur 16 bits.

simm11 constante signée codée sur 11 bits. Lorsque cette constante est employé dans une instruction,
elle est complétée par le bit de signe dans les bits de poids fort si nécessaire pour l'étendre sur 16 bits.

simm9 constante signée codée sur 9 bits. Même remarque que pour simm11.

simm5 constante signée codée sur 5 bits. Même remarque que pour simm11.

uimm5 constante non signée codée sur 5 bits. Même remarque que pour uimm11.

uimm4 constante non signée codée sur 4 bits. Même remarque que pour uimm11.

& et logique bit à bit.

| ou logique bit à bit.

<- affectation.

||  concaténation.
 
 
Bit  Signification  si 0 Signification si 1 
C L'instruction n'a pas généré de retenue  L'instruction a généré une retenue 
Z  Le résultat de l'instruction est différent  de 0  Le résultat de l'instruction est égal à 0 
N  Le résultat de l'instruction est positif ou nul  Le résultat de l'instruction est négatif 
V L'instruction n'a pas généré de débordement  L'instruction a généré un débordement 
Table 1: Signification des bits du registre rcc. 

==  test d'égalité.

<< décalage à gauche.

>> décalage à droite.

Mem[addr] case mémoire à l'adresse addr.

....b chaîne de bits. Le nombre de bits est exactement ce qui est spécifié (on pourra utiliser les mêmes conventions que cette année dans VisArchi
        à savoir 0x.... pour les valeurs en hexadécimales, .... pour les valeurs en base 10, etc.)


2 Les registres et le jeu d'instructions

Le programmeur dispose de 8 registres banalisés nommés r0 à r7. Le registre r0 est câblé à 0 (i.e. il contient la constante 0, on peut écrire dans ce registre mais cette écriture est sans effet).
Le registre rcc contient 4 drapeaux : C, Z, N et V mémorisant les caractéristiques du résultat de la dernière instruction qui l'a modifié selon le codage présenté dans la table 1.

Les adresses sont sur 16 bits et les cases mémoire ont une capacité de mots de 16 bits.
On peut donc adresser 128ko (kilo-octets) soit 131072 octets.
Les instructions sont codées sur 16 bits. Il existe 3 types d'instructions :


6 formats sont utilisés pour coder ces instructions. On dispose en tout de 35 instructions.

Format 1 : instruction de chargement du poids fort d'une constante
 
 
   0       0  uimm11 rd
Figure 1: Format 1

Mnémonique  Codage  Opération  Exemple
lih rn,uimm11  rd=n  rn <- uimm11  lih r2,0x7FF
 

Format 2 : instructions de branchement inconditionnel
 
 
  0   1    0  simm11 AA 00
Figure 2: Format 2

Mnémonique  Codage  Opération  Exemple
b simm11  AA=0  pc <- pc + (1 + simm11)  b -16
ba simm11  AA=1  pc <- simm11   ba 0x0004
 

Format 3 : instructions de branchement conditionnel
 
 
0  1  1  0  cond simm9
Figure 3: Format 3

Mnémonique  Codage  Opération  Exemple
 beq simm9  cond=000  si (rcc[z] == 1) pc <- pc + (1 + simm9)  beq -16
 bne simm9  cond=001  si (rcc[z] == 0) pc <- pc + (1 + simm9)  bne 16
 bge simm9   cond=010   si (rcc[z] == 1 ou rcc[n] ==0) pc <- pc + (1 + simm9)  bge 16
 bgt simm9  cond=011  si (rcc[z] == 0 et rcc[n] ==0) pc <- pc + (1 + simm9)  bgt 16
 ble simm9  cond=100   si (rcc[z] == 1 ou rcc[n] ==1) pc <- pc + (1 + simm9)  ble 16
 blt simm9   cond=101  si (rcc[z] == 0 et rcc[n] ==1) pc <- pc + (1 + simm9)  blt 16
 bvs simm9  cond=110  si (rcc[v] == 1) pc <- pc + (1 + simm9)  ble 16
 bvc simm9  cond=111   si (rcc[v] == 0) pc <- pc + (1 + simm9)  blt 16
 

Format 4 : instructions arithmétiques, logiques et chargement / rangement
 
 
1   0   0 Codop rs2 rs1 rd
Figure 4: Format 4

Mnémonique  Codage  Opération  Exemple
 add rd,rs1,rs2  Codop=0100  rd <- rs1 + rs2   add r3,r4,r3
 add. rd,rs1,rs2  Codop=0101  rd <-rs1 + rs2 + C ; rcc modifié  add. r3,r4,r3
 sub rd,rs1,rs2  Codop=0000  rd <- rs1 - rs2  sub r0,r2,r2
 sub. rd,rs1,rs2  Codop=0001   rd  <-rs1 - rs2 + C ; rcc modifié  sub. r0,r3,r4
 and. rd,rs1,rs2   Codop=0111   rd <- rs1 & rs2   and. r3,r2,r1
 or rd,rs1,rs2  Codop=0110   rd <- rs1 j rs2   or r2,r3,r4
 ldx rd,(rs1+rs2)  Codop=1000  rd  <- Mem[rs1+rs2]   ldx r2,(r3+r4)
 stx (rs1+rs2),rd  Codop=1001  Mem[rs1+rs2] <- rd   stx (r2+r1),r1
 ldbx rd,(rs1+rs2)  Codop=1010  rd  <- Mem[rs1+rs2] & 0x00ff   ldbx r2,(r3+r4)
 ldsbx rd,(rs1+rs2)  Codop=1101  rd <-  exts(Mem[rs1+rs2] & 0x00ff)  ldsbx r2,(r3+r4)
 stbx (rs1+rs2),rd  Codop=1011   Mem[rs1+rs2] <- rd & 0x00ff    stbx (r2+r1),r1
 

Format 5 : instructions arithmétiques, logiques et chargement / rangement
 
 
1 Codop simm5/uimm5 rs1 rd
Figure 5: Format 5

Mnémonique Format  Opération  Exemple
 addi rd,rs1,simm5  Codop=0100  rd <-  rs1 + simm5   addi r3,r3,1
 addi. rd,rs1,simm5  Codop=0101  rd <-  rs1 + simm5 + C ; rcc modifié  addi. r4,r5,2
 andi. rd,rs1,simm5  Codop=0111  rd <- rs1 & simm5   andi. r4,r2,0xF
 ori rd,rs1,uimm5  Codop=0110  rd <- rs1 | uimm5  ori r5,r6,0xA
 ld rd,(rs1+simm5)   Codop=1000  rd <- Mem[rs1+simm5]   ld r8,(r5+0)
 st (rs1+simm5),rd   Codop=1001   Mem[rs1+simm5] <- rd   st (r0+12),r4
 ldb rd,(rs1+simm5)  Codop=1010  rd <- Mem[rs1+simm5] & 0x00ff   ldb r8,(r5+0)
 ldsb rd,(rs1+simm5)  Codop=1101   rd <- Mem[rs1+simm5] & 0x00ff   ldsb r8,(r5+0)
 stb (rs1+simm5),rd  Codop=1011   Mem[rs1+simm5] <- rd & 0x00ff   stb (r0+17),r4
 

 

Format 6 : instructions de décalage
 
 
1 1 1  1 type uimm4 rs1 rd
Figure 6: Format 6

Mnémonique  Format  Opération  Exemple
 lsl rd,rs1,uimm4   type=00  rd <- rs1 << uimm4  lsl r3,r3,1
 rol rd,rs1,uimm4   type=01   rd <- rs1 << uimm4 ; les bits de poids faible reçoivent les bits de poids fort éjectés  rol r4,r3,15
 lsr rd,rs1,uimm4  type=10   rd <- rs1 >>  uimm4   lsr r1,r1,3
 asr rd,rs1,uimm4  type=11  rd <- rs1  >>uimm4 ; les bits de poids fort sont comblés avec le bit de signe  asr r2,r3,4
 



 
 

3 Implémentation non pipelinée

Cette section décrit une microarchitecture non-pipelinée implémentant le jeux d'instructions décrit dans la section 2.
Cette microarchitecture est présentée figure 7
    Les commandes de lecture sont spécifiées par (c*) où (*) donne l'origine et la destination de la transaction
(exemple :crs2_s2, lecture du registre rs2 et envoi de la valeur sur le bus s2).
    Les commandes d'écriture sont spécifiées par (w*) où (*) donne la destination d'écriture(une seule origine possible).
Les instructions s'exécutent en deux ou trois étapes (une étape = un cycle de l'horloge).

3.1 Les bus

Il s'agit d'une microarchitecture 3 bus : s1, s2 et d. Les bus s1 et s2 servent à véhiculer les données fournies par les sources
(registres généraux, registre d'instruction, registre de lien,compteur programme et registre d'adresse mémoire)
vers les dispositifs de calcul (Unité Arithmétique et Logique) ou vers la mémoire.
Le bus d sert à véhiculer une donnée issue d'un calcul ou de la mémoire vers les registres généraux, le registre d'instruction,
le compteur programme ou le registre d'adresse mémoire.
A un instant donné, un seul dispositif dépose sa donnée sur le bus. Par contre, on peut imaginer que plusieurs dispositifs reçoivent en
même temps une donnée présente sur un bus.

3.2 Les registre généraux

Le banc de registre se comporte comme une petite mémoire de 8 mots de 16 bits qui supporte 2 lectures simultanées et une écriture.
Les registres du banc de registres sont numérotés de 0 à 7.
Le registre 0 est câblé à 0. wrd commande l'écriture du registre de numéro rd à partir du bus d.
Une écriture dans le mot 0 n'a aucun effet.
Les commandes crs1_s1 et crs2_s2 permettent de faire passer les registres numéro rs1 et rs2 sur les bus s1 et s2 respectivement.
 

Figure 7: Microarchitecture non-pipelinée implémentant l'architecture RISC.


 
 
 



 
 
 

3.3 L'Unité Arithmétique et Logique

L'UAL permet d'effectuer les opérations suivantes :

add addition binaire sur 16 bits (avec ou sans mémorisation de la retenue et avec ou sans retenue en entrée) des deux entrées s1 et s2.

sub soustraction binaire sur 16 bits (avec ou sans mémorisation de la retenue et avec ou sans retenue en entrée) des deux entrées s1 et s2.

dec décalages logiques et arithmétiques à gauche et à droite de 0 à 15 bits. L'entrée s1 est décalée du nombre de bit donnés en binaire sur l'entrée s2.

and logique bit à bit des entrées s1 et s2.

or logique bit à bit des entrées s1 et s2.

nop1 aucune opération, l'entrée s1 est recopiée sans modification sur la sortie.

nop2 aucune opération, l'entrée s2 est recopiée sans modification sur la sortie.

La commande cual_d permet de connecter la sortie de l'UAL sur le bus d.

3.4 Instruction Register

Ce registre est chargé avec une instruction lue de la mémoire.
Il est ensuite utilisé via des décodeurs (non figurés sur le schéma) pour générer les signaux de commande
et comme source des données immédiates via des dispositifs de recadrage des immédiats et d'extension
éventuelle du signe (non figurés sur le schéma) pour obtenir un codage sur 16 bits.
wir commande l'écriture dans ce registre et cir_s2 la lecture sur le bus s2.

3.5 Registre PC

pc contient l'adresse de la prochaine instruction à lire. Un incrémenteur est associé à pc
pour passer automatiquement à l'instruction suivante. Le multiplexeur en entrée de pc
permet de choisir entre le passage à l'instruction suivante (pc <- pc+2) ou l'exécution d'un
branchement (pc la donnée présente sur le bus d). wpc commande l'écriture dans pc,
cpc_s1 sa lecture sur le bus s1, mpc l'entrée du multiplexeur qui sera disponible en entrée
de pc.

3.6 Registre d'adresse mémoire (RAdM)

Ce registre sert à mémoriser le résultat d'un calcul d'adresse en vue d'un accès mémoire.
wradm commande l'écriture dans RAdM et cradm s1 sa lecture sur le bus s1.

3.7 La mémoire

La mémoire contient 2^16=(65536) cases mémoire de 8 bits.
L'entrée Adresse permet de sélectionner l'une de ces cases ou bien deux cases consécutives (16 bits) à condition que la
première soit à une adresse paire. La commande r/w indique l'opération effectuée : lecture
(r/w == 1) ou écriture (r/w == 0). La commande emem valide l'opération (si emem ==0,
la mémoire ignore les autres commandes et entrée. Si emem == 1, la mémoire effectue
l'opération demandée). La commande size permet de déterminer la taille de la donnée.
Si size == 0, la donnée est sur 8 bits et si size == 1, la donnée est sur 16 bits.
L'entrée Din doit recevoir la donnée dans le cas d'une écriture et la sortie Dout fournit la donnée
ou l'instruction dans le cas d'une écriture.

4 Exécution du jeu d'instructions sur la version non-pipelinée

4.1 Partie commune à toutes les instructions

La lecture de l'instruction elle-même est commune à toutes les instructions puisqu'elle ne
dépend pas du type de l'instruction. Une instruction est lue de la manière suivante : lecture
de pc sur le bus s1 et donc sur l'entrée Adresse de la mémoire en mettant la commande
cpc_s1 à 1. r/w est mis à 1 pour indiquer une lecture. cmem d est mis à 1 pour que
l'instruction lue soit disponible sur le bus d. wir est mis à 1 pour mémoriser l'instruction
dans l'Instruction Register. Simultanément, pc est incrémenté pour préparer la lecture de
l'instruction suivante et mpc est mis à 0 pour choisir l'entrée pc + 2 du multiplexeur et,
enfin, wpc est mis à 1 pour mémoriser la nouvelle valeur de pc.

4.2 Exécution de l'instruction lih (format 1)

La constante à charger est dans les bits 13 à 3 de l'Instruction Register.
Les bits 13 à 3 de l'Instruction Register sont connectés sur les bits 15 à 5 du bus s2 via le dispositif évoqué
au paragraphe 3.4. cir_s2 est mis à 1 pour lire l'Instruction Register sur le bus s2. l'UAL
reçoit le code opération nop2, cual_d est mis à 1 et le banc de registre reçoit les bits 2-0 de
l'Instruction Register sur son entrée rd. wrd est mis à 1.

4.3 Exécution des branchements inconditionnels (format 2)

Ces instructions nécessitent 1 phase d'exécution. Quelque soit le branchement, cpc_s1 est
mis à 1 et cir_s2 aussi. simm11 est extrait et son signe est étendu via les dispositifs évoqués
en 3.4. Si AA == 1, l'UAL reçoit le code opération nop2 sinon, elle reçoit le code add.
Ensuite, mpc et wpc sont mis à 1.

4.4 Exécution des branchements conditionnels (format 3)

Quelque soit le branchement, cpc_s1 est mis à 1 et cir_s2 aussi. simm9 est extrait et son
signe est étendu via les dispositifs évoqués en 3.4. l'UAL reçoit le code de condition (bits 9
à 11) de l'Instruction Register ; en fonction de celui-ci et l'état de rcc effectue une opération
add ou bien nop1. Ensuite, mpc et wpc sont mis à 1.
 

4.5 Instructions arithmétiques, logiques et chargement / rangement registre-registre (format 4)

Les instructions arithmétiques et logiques ne nécessitent qu'une phase d'exécution alors que
les instructions de chargement / rangement en nécessitent 2.

Instruction arithmétiques et logiques

Les bits 11 à 9 de l'Instruction Register sont reçus sur l'entrée de commande rs1 du banc
de registres, les bits 8 à 6 de l'Instruction Register sont reçus sur l'entrée de commande
rs2 du banc de registres. crs1_s1 et crs2_s2 sont mis à 1. L'UAL reçoit le code opération
correspondant au type d'instruction. cual_d est mis à 1. Les bits 2 à 0 de l'Instruction
Register sont reçus sur l'entrée de commande rd du banc de registres et wrd est mis à 1.

Instruction de chargement / rangement

Phase d'exécution 1
Pour les chargements et les rangements : les bits 11 à 9 de l'Instruction Register
sont reçus sur l'entrée de commande rs1 du banc de registres,
les bits 8 à 6 de l'Instruction Register sont reçus sur l'entrée de commande rs2 du banc
de registres. crs1_s1 et crs1_s2 sont mis à 1. L'UAL reçoit le code opération add.
cual_d est mis à 1. wradm est mis à 1.

Phase d'exécution 2

Pour les chargements et les rangements: cradm_s1 est mis à 1.

Pour les chargements : r/w, emem et cmem_d sont mis à 1, les bits 2 à 0 de
l'Instruction Register sont reçus sur l'entrée de commande rd du banc de registres
et wrd est mis à 1.

Pour les rangements : r/w est mis à 0, emem est mis à 1, les bits 2 à 0 de l'Instruction
Register sont reçus sur l'entrée de commande rs2 du banc de registres et crs2_s2 est
mis à 1.

4.6 Instructions arithmétiques, logiques et chargement / rangement registre-immédiat (format 5)

Les instructions arithmétiques et logiques ne nécessitent qu'une phase d'exécution alors que
les instructions de chargement / rangement en nécessitent 2.

Instruction arithmétiques et logiques

Les bits 11 à 9 de l'Instruction Register sont reçus sur l'entrée de commande rs1 du banc
de registres, simm5 est extrait et son signe est étendu via les dispositifs évoqués en 3.4.
crs1_s1 et cir_s2 sont mis à 1. L'UAL reçoit le code opération correspondant au type
d'instruction. cual_d est mis à 1. Les bits 2 à 0 de l'Instruction Register sont reçus sur
l'entrée de commande rd du banc de registres et wrd est mis à 1.

Instruction de chargement / rangement

Phase d'exécution 1
Pour les chargements et les rangements : les bits 11 à 9 de l'Ins-
truction Register sont reçus sur l'entrée de commande rs1 du banc de registres, simm5
est extrait et son signe est étendu via les dispositifs évoqués en 3.4. crs1_s1 et cir_s2
sont mis à 1. L'UAL reçoit le code opération add. cual_d est mis à 1. wradm est mis
à 1

Phase d'execution 2
Pour les chargements et les rangements : cradm_s1 est mis à 1.

Pour les chargements : r/w, emem et cmem_d sont mis à 1, les bits 2 à 0 de
l'Instruction Register sont reçus sur l'entrée de commande rd du banc de registres
et wrd est mis à 1.

Pour les rangements : r/w est mis à 0, emem est mis à 1, les bits 2 à 0 de l'Instruction
Register sont reçus sur l'entrée de commande rs2 du banc de registres et crs2_s2 est
mis à 1.

4.7 Instructions de décalage (format 6)

Les bits 11 à 9 de l'Instruction Register sont reçus sur l'entrée de commande rs1 du banc
de registres, uimm4 est extrait via les dispositifs évoqués en 3.4. crs1_s1 et cir_s2 sont
mis à 1. L'UAL reçoit le code opération dec ainsi que le type de décalage (bits 4 et 3 de
l'Instruction Register). cual_d est mis à 1. Les bits 2 à 0 de l'Instruction Register sont
reçus sur l'entrée de commande rd du banc de registres et wrd est mis à 1.