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 |
== 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 :
Format 1 : instruction de chargement du poids fort d'une constante
0 0 | uimm11 | rd |
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 |
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 |
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 |
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 |
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 |
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.
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 16 bits.
L'entrée Adresse permet de sélectionner
l'une de ces cases (16 bits) 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.