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.
Format 1 : instruction de chargement du poids fort d'une constante
Format 2 : instructions de branchement inconditionnel
Format 3 : instructions de branchement conditionnel
Format 4 : instructions arithmétiques, logiques
et chargement / rangement
Format 5 : instructions arithmétiques, logiques
et chargement / rangement
Format 6 : instructions de décalage
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.
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
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.
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.
3.5 Registre PC
pc contient l'adresse de la prochaine instruction
à lire. Un incrémenteur est associé à 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.
3.7 La mémoire
La mémoire contient 2^16=(65536) cases mémoire
de 8 bits.
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
4.2 Exécution de l'instruction
lih (format 1)
La constante à charger est dans les bits 13 à
3 de l'Instruction
Register.
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
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
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
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
Instruction de chargement / rangement
Phase d'exécution 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
Pour les rangements : r/w est mis à 0, emem
est
mis à 1, les bits 2 à 0 de l'Instruction
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
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
Instruction de chargement / rangement
Phase d'exécution 1
Phase d'execution 2
Pour les chargements : r/w, emem et cmem_d
sont mis à 1, les bits 2 à 0 de
Pour les rangements : r/w est mis à 0, emem
est
mis à 1, les bits 2 à 0 de l'Instruction
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
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.
0 0
uimm11
rd
Mnémonique
Codage
Opération
Exemple
lih rn,uimm11
rd=n
rn <- uimm11
lih r2,0x7FF
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
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
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
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
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
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).
(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.
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.
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.
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.
wradm commande l'écriture dans RAdM et
cradm
s1 sa lecture sur le bus s1.
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.
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.
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.
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.
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.
les instructions de chargement / rangement en nécessitent
2.
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.
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.
l'Instruction Register sont reçus sur l'entrée
de commande rd du banc de registres
et wrd est mis à 1.
Register sont reçus sur l'entrée
de commande rs2 du banc de registres et crs2_s2 est
mis à 1.
les instructions de chargement / rangement en nécessitent
2.
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.
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
Pour les chargements et les rangements : cradm_s1
est mis à 1.
l'Instruction Register sont reçus sur l'entrée
de commande rd du banc de registres
et wrd est mis à 1.
Register sont reçus sur l'entrée
de commande rs2 du banc de registres et crs2_s2 est
mis à 1.
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.