Conservatoire national des arts et métiers
Architectures des systèmes informatiques
ANNEXE 17
Sur la microprogrammation
Année 2000-2001

Adapté d'un texte de Mark Smotherman
http://www.cs.clemson.edu/~mark/uprog.html
 

1. Définitions et description

La microprogrammation

L'unité de traitement d'un ordinateur est constituée : Chaque étape d'exécution est un transport (ou transfert) de donnée, accompagné éventuellement d'une transformation dans une unité fonctionnelle. Par exemple, un transfert de registre avec modification est fait par l'ouverture du registre, c-à-d. l'expédition d'une copie sur un ou des bus internes au processeur, le choix d'une opération de l'UAL, et l'entrée ou réception de la ou des valeurs établies dans un ou plusieurs registres. Les signaux de commande (control signals) sont émis par l'unité de commande. Ils font des micro opérations, mise en activité des portes par les points de commande (control points) qui commandent les registres en entrées et sorties de données ainsi que le choix des opérations.

Dans la suite, les expressions telles que «T0: PC_out, MAR_in» signifient que :

Une macroinstruction est réalisée par la bonne séquence temporelle 
de groupes de signaux de commande.
Figure 1. Chemin de données d'un ordinateur simplifié à quatre instructions
(les petits cercles sont les points de commande)

ACC  accumulateur;
CO   compteur ordinal;
RAM  registre d'adresse de mémoire;
RDM  registre de donnée de mémoire;
RI   registre d'instruction;
Temp registre temporaire;
UAL  unité arithmétique et logique.

Exemple : le premier groupe de signaux de commande d'une macroinstruction réalisera la lecture de l'instruction par l'ouverture du compteur ordinal vers le registre d'adresse de mémoire, via un bus interne. Dans ce groupe ou plus tard, le compteur ordinal sera incrémenté et l'interface de mémoire enverra un signal de lecture. Dans les étapes suivantes, seront faites les micro opérations nécessaires pour lire les opérandes, exécuter la fonction spécifiée dans le code d'opération et ranger les résultats. Une instruction ou macroinstruction simple peut nécessiter 5 à 10 étapes et mettre en jeu plusieurs douzaines de signaux de commande.

Liste des étapes

étapes T0-T3 pour toute instruction:
T0: PC_out, MAR_in
T1: lecture, pcincr
T2: MDR_out, IR_in
T3: décodage du code d'opération dans IR

étapes T4-T6 pour une instruction de lecture (code d'opération 00):
T4: IR_out(addr part), MAR_in
T5: lecture
T6: MDR_out, ACC_in, retour à T0

étapes T4-T7 pour une instruction d'addition (code d'opération 01):
T4: IR_out(addr part), MAR_in
T5: lecture
T6: ACC_out, aluadd
T7: TEMP_out, ACC_in, retour à T0

étapes T4-T6 pour une instruction d'écriture (code d'opération 10):
T4: IR_out(addr part), MAR_in
T5: ACC_out, MDR_in
T6: écriture, retour à T0

étapes T4-T5 pour une instruction brz (brancher si zéro) (code d'opération 11):
T4: if (acceq0) then { IR_out(addr part), PC_in }
T5: retour à T0

L'expression logique d'un signal de commande isolé peut être écrite en somme de produits comme dans les exemples ci-dessous où figurent dans chaque produit l'opération élémentaire ET le numéro d'étape de l'horloge, sauf si la référence de temps est seule nécessaire. La somme est interprétée comme : faire successivement...

Définitions des signaux de commande en termes de sommes de produits :

ACC_in = (load & T6) + (add & T7)
ACC_out = (store & T5) + (add & T6)
aluadd = add & T6
IR_in = T2
IR_out(addr part) = (load & T4) + (add & T4) + (store & T4) + (brz & acceq0 & T4)
MAR_in = T0 + (load & T4) + (add & T4) + (store & T4)
MDR_in = store & T5
MDR_out = T2 + (load & T6)
PC_in = brz & acceq0 & T4
PC_out = T0
pcincr = T1
read = T1 + (load & T5) + (add & T5)
TEMP_out = add & T7
write = store & T6
Figure 3.

L'unité de commande peut être entièrement câblée (hardwired). Cette réalisation directe était faite au moyen de portes logiques isolées. Ce type de circuits peut être complexe, et cela explique les innombrables travaux consacrés à la «simplification» des expressions booléennes.

Dans une réalisation microprogrammée, les signaux de commande sont stockés sous la forme de mots de commande nommés microinstructions. Ils doivent être émis aux instants adéquats à partir de la mémoire dans laquelle ils sont. La collection de mots de commande qui réalise une macroinstruction est nommée microprogramme; tous les microprogrammes sont stockés dans la mémoire de commande ou mémoire de microprogrammes.

Figure 4. Mémoire de commande d'une machine à quatre instructions,
les bits à zéro ne sont pas figurés.

Ainsi, avec une unité de commande microprogrammée, la séquence de microopérations nécessaire pour exécuter une macroinstruction se réduit à une suite de lectures de microinstructions au lieu d'opérations faites dans un circuit de logique combinatoire et séquentielle. Il faut y ajouter le circuit de séquencement. Le résultat est une conception plus aisée de la commande.

Observant que les microprogrammes sont placées entre le matériel (hardware) et le programme à exécuter (software), les anglo-saxons les ont nommés «firmware». Ce mot avait été employé pour la première fois pas Ascher Opler [1] pour une mémoire de microinstructions chargeable à volonté pour spécialiser la machine. Dans la suite il a été employé autant pour des microinstructions en mémoire morte qu'en mémoire vive. Plus récemment l'usage de ce mot a été étendu à d'autres parties de logiciels en mémoire morte comme le chargeur initial et les programmes d'entrée-sortie résidants.

On pourra consulter les chapitres 4 and 5 de Hamacher, Vranesic, et Zaky [2] et le chapitre 5 de Patterson et Hennessy [3] pour la conception des chemins de données, les signaux de commande, etc. Les textes de Agrawala et Rauscher [4], Andrews [5], Habib [6] et Husson [7] traitent plus spécialement de la seule microprogrammation. L'ancien «Annual Workshop on Microprogramming» de l'ACM et des IEEE a été renommé «International Symposium on Microarchitecture», il traite aujourd'hui d'autres sujets comme les pipelines, la prédiction de branchement, etc.   http://portal.acm.org/browse_dl.cfm?linked=1&part=series&idx=SERIES366&coll=portal&dl=ACM&CFID=1463605&CFTOKEN=17119880

2. Petite histoire de la microprogrammation

À la fin des années 1940, Maurice Wilkes de l'université de Cambridge commença la conception de la machine EDSAC (electronic delay storage automatic calculator) à programme enregistré. Il constata que le séquencement des signaux de commande est semblable au séquencement des actions dans un programme et imagina utiliser un programme enregistré pour ces séquences. Il publia [8] cette technique en 1951, la nommant microprogrammation.

Il y décrivait la réalisation d'une mémoire de commande sous la forme d'une matrice de diodes. Les microinstructions avaient un format simple : les signaux de commande non codés étaient enregistrés avec un champ d'adresse suivante. Le choix initial du microprogramme approprié était fait en utilisant la valeur du code d'opération plus des zéros de remplissage, le séquencement utilisait le champ d'adresse suivante. Les sauts conditionnels étaient faits au moyen de conditions qui modifiaient des bits du champ d'adresse suivante.

Dans une publication de 1953 [9] faite avec Stringer, la technique de la microprogrammation était approfondie. Elle traitait de la complexité, du test et de la vérification de la logique de commande, de jeux de microinstructions différents, de l'exploitation du parallélisme dans les chemins de données, des changements d'environnement, des microsousprogrammes et de l'accès par pipeline à la mémoire de commande. La première machine microprogrammée fut l'EDSAC 2 en 1957.

À cause de la difficulté de fabrication des mémoires de commande rapides dans les années 1950, la microprogrammation est restée en sommeil. John Fairclough a fait des travaux à la fin des années 1950 au laboratoire d'IBM à Hursley, en Grande-Bretagne, sur les mémoires magnétiques comme matrices de mémoire de commande pour des petits ordinateurs. Cette expérience a été utilisée à plein dans la construction de la gamme de machines compatibles 360 [10]. Tous les modèles de cette gamme étaient microprogrammés sauf les deux machines de haut de gamme 75 and 91.
 
 

Caractéristique  360-30 360-40 360-50 360-65
prix de location en milliers de dollars par mo  4 7 15 35
Index Knight - scientifique (Kops)  7.94 33.4 187 1390
Index Knight - commercial (Kops) 17.1 50.1 149 810
largeur du chemin de données interne en bits  8 16 32 64
taille de la mémoire de commande en K microinstructions  4 4 2.75 2.75
longueur de la microinstruction en bits 50 52 85 87
technique de la mémoire de commande  CCROS TROS BCROS BCROS
temps de cycle de la mémoire de commande en ns 750 625 500 200
temps de cycle de la mémoire centrale en ns 1500 2500 2000 750

Table 1. Comparaison des modèles 360-30 à 65  (vers 1965) [10,12,13].

Dans les premiers temps, trois types de mémoires [10] de commande ont été utilisés dans les modèles de la série 360 :

Des fonctionnements inhabituels en ces temps là, étaient réalisés : des microdiagnostics étaient faits par remplacement sur le site des CCROS du modèle 30.

Les concurrents comme Honeywell avaient des produits pour exécuter des programmes tournant sur les machines précédentes d'IBM, par exemple le programme «Liberator» transformait les programmes des IBM 1401 en programmes du H-200. IBM a contré cette fuite de clientèle avec une deuxième mémoire de microinstructions qui, par basculement manuel, faisait exécuter les instructions du 1401 sur le modèle 30 [16]. La même chose a été faite pour la série 7000 [17]. C'est à cette occasion que le mot émulation est apparu. Ces émulateurs ont fait que très longtemps d'innombrables programmes n'ont pas été récrits ni même recompilés.

Dans les vingt ans qui suivirent les machines microprogrammées devinrent la règle : les IBM 370, tous les PDP de DEC sauf le PDP 11-20, etc. Le sommet de la popularité de la microprogrammation a été atteint par le DEC VAX 11/780 de 1978 avec 4K mots de 96 bits de mémoire morte de commande et 1K mots de zone réinsriptible pour les modifications et les diagnostics.
Plusieurs des premiers microprocesseurs étaient à logique câblée mais cela a duré peu de temps. Dans les années 1974-1976, le MC6800 était câblé, les Intel 8080 et Zilog Z80 [18] étaient microprogrammés. En 1978, le Z8000 [19] était câblé et l'Intel 8086 [20] microprogrammé avec une mémoire à 504 entrées, chacune contenant une microinstruction de 21 bits. La  microprogrammation du 68000 a été décrite en 1978 [18,21,22]. Elle était à deux niveaux. Chaque microinstruction de 17 bits contenait, soit une adresse de saut sur 10 bits, soit l'adresse d'une «nanoinstruction» sur 9 bits. Les nanoinstructions étaient stockées dans des mots de 68 bits.

Nick Tredennick [23] a identifié quatre utilisations principales de la microprogrammation qu'il nommait «cultures» en 1982.

Moins visibles commercialement mais intéressantes ont été les machines à vocation de machine hôte universelle avec un chemin de données général acceptant tout jeu de microinstructions. Exemples : Nanodata QM-1 (vers 1970) [4,28] et Burroughs B1700 (vers 1972) [28,29,30].

La mémoire de commande du B1700 contenait les microprogrammes pour SDL, langage d'écriture du système d'exploitation, pour Fortran et pour Cobol et RPG, langages d'écriture de ses programmes d'application.  Les basculements entre jeux de microprogrammes étaient faits par interruptions. Baron et Higbie [30] pensent que le peu de succès commercial de cette machine est dû à sa documentation mauvaise ou insuffisante.

Les jeux de microinstructions ont grandi considérablement à la fin des années 1970 avec le superminiordinateur VAX-11/780 ou le MC68020, et l'expression CISC est apparue. L'expression à la mode était : «combler l'écart sémantique» entre le matériel et les langages. On le faisait par des instructions complexes qui devaient simplifier la compilation. Voir pour cela le chapitre 1 de [29].
Pour le VAX, l'objectif premier était la facilité de la compilation [27]. En contrepartie il y eut une grande complexité qui contraria les performances [31].
Dans le MC68020 (vers 1984), par rapport au MC68000, ont été ajoutés la mémoire virtuelle, l'accès aux données non alignées, des pointeurs de piles pour six formats de piles supplémentaires, deux douzaines d'instructions nouvelles, deux nouveaux modes d'adressage (14 au total), et 18 nouveaux formats de déplacements (25 en tout) pour les modes d'adressage. Le microcode est passé de 36 ko à 85 ko [22]. Le résultat était que quelques lectures d'instructions en mémoire lançaient des traitements complexes entre registres.

Une réaction est venue dans les années 1980. Elle a eu deux causes :

Le tout a produit les machines RISC. Certains voient les RISC comme compilant les langages de haut niveau directement en microcode, d'autres soutiennent qu'en fait on revient aux conceptions de Seymour Cray dans sa conception du CDC 6600 dans les années 1960 et que l'on applique les idées de John Cocke sur les compensations entre matériel et logiciel apparues dans l'IBM 801 dans les années 1980.

Ce basculement des années 1980 a fait que la plupart des instructions du MC68000 ont été câblées [32]. Même les derniers processeurs des IBM 390 sont câblés [33]. La définition du matériel ne passe plus par la microprogrammation mais par les ASIC et les FPGA (field programmable gate array).

Le microcode est encore utilisé dans les Pentium II et AMD K6. Toutefois, les plus simples des instructions sont traduites en une à quatre microinstructions (nommées respectivement mops pour microopérations et rops pour risc opérations) produites par le décodeur sans accès à une mémoire de commande. Seules les instructions les plus complexes ont besoin d'un flot de microinstructions venant d'une ROM sur la puce. Voir pour cela Shriver et Smith [34].

3. Les styles de microprogrammation

Ils sont attachés aux formats des microinstructions.

La microinstruction verticale est courte et ressemble à une macroinstruction; elle contient parfois un champ d'opération et un ou deux opérandes (ex. Microdata 1600, 16 bits dans les Multi-6). Chaque microinstruction concerne un seul chemin de données. Les branchements dans un microprogramme sont faits par des microinstructions spécialisées qui ont un code d'opération de branchement. Ce style de microprogrammation ressemble fortement à la programmation en langage d'assemblage. Le nombre de microinstructions nécessaires pour une tâche est grand.

La microinstruction horizontale peut être entièrement explicite, chaque bit peut correspondre à un seul signal de commande, selon la proposition initiale de M. Wilkes. Cette microprogrammation est très complexe dès lors que des groupes de bits sont mutuellement exclusifs; la microinstruction à 85 bits du 360-50 avait 25 champs distincts. Ces champs spécifiaient des opérations simultanées pour exploiter le parallélisme installé dans le chemin de données. Les branchements étaient compliqués; chaque microinstruction contenait la plupart du temps un branchement et son adresse. Cette complexité est source d'erreurs.

Une combinaison des deux styles est la nanoprogrammation à deux niveaux comme dans le Nanodata QM-1 et le Motorola 68000. Le QM-1 avait 16 kmots de microinstuctions verticales de 18 bits et 1 kmot de nanoinstructions horizontales de 360 bits. Les microinstructions étaient pour l'essentiel des appels aux nanoinstructions. Une nanoinstruction avait cinq champs principaux de 72 bits. Le premier pour une adresse de branchement de 10 bits et les champs de condition et de commandes. Les quatre autres champs (T1-T4) contenaient des microopérations sous la forme de 41 autres champs.

4. Bilan succinct de la microprogrammation

5. Références

[1] A. Opler, Fourth-generation software, Datamation vol 13 n°1, pp. 22-24, 1967.

[2] V.C. Hamacher, Z.G. Vranesic et S.G. Zaky, Computer organization, 3e édition, New York: McGraw-Hill, 1990.

[3] D.A. Patterson et J.L. Hennessy, Computer organization and design: the hardware/software interface, San Mateo, CA,  Morgan Kaufmann, 1998 (2e édition).

[4] A.K. Agrawala et T.G. Rauscher, Foundations of microprogramming, New York: Academic Press, 1976.

[5] M. Andrews, Principles of firmware engineering in microprogram control, Potomac, MD,  Computer Science Press, 1980.

[6] S. Habib (éditeur), Microprogramming and firmware engineering methods, New York, van Nostrand, 1988.

[7] S.H. Husson, Microprogramming: principles and practice, Englewood Cliffs, NJ, Prentice Hall, 1970.

[8] M.V. Wilkes, The best way to design an automated calculating machine, université de Manchester, Computer inaugural conference, 1951, pp. 16-18.
- Repris dans: M.V. Wilkes, The genesis of microprogramming, Annals hist computing vol 8 n°3, pp. 116-126, 1986.

[9] M.V. Wilkes et J.B. Stringer, Microprogramming and the design of the control circuits in an electronic digital computer, Proc Cambridge Phil Soc 49, pp. 230-238, 1953.
- Repris comme chapitre 11 dans: D.P. Siewiorek, C.G. Bell et A. Newell, Computer structures: principles and examples, New York: McGraw-Hill, 1982.
- Repris aussi dans: M.V. Wilkes, The genesis of microprogramming, Annals Hist Computing vol 8 n°3, pp. 116-126, 1986.

[10] E.W. Pugh, LR Johnson et JH Palmer, IBM's 360 and early 370 systems, Cambridge, MA, MIT Press, 1991.

[11] S.G. Tucker, Microprogram control for system/360, IBM System Journal vol 6 n°4, pp. 222-241, 1967.

[12] A. Padegs, System/360 and beyond, IBM Journal Res Dev vol 25 n°5, pp. 377-390, 1981.

[13] M. Phister Jr, Data processing technology and economics, 2nd ed. Bedford, MA: Digital Press, 1979.

[14] A.M. Johnson, The Microdiagnostics for the IBM system 360 model 30, IEEE Trans Comp C-20 n° 7, pp. 798-803, 1971.

[15] S.G. Tucker, Personal communication. February 1999.

[16] M.A. McCormack, TT Schansman et KK Womack, 1401 Compatibility Feature on the IBM System/360 Model 30. Communications ACM col 8 n°12, pp. 773-776, 1965.

[17] S.G. Tucker, Emulation of large systems, CACM vol 8 n°12, pp. 753-761, 1965.

[18] F. Anceau, The architecture of microprocessors, Workingham, England: Addison-Wesley, 1986.

[19] M. Shima, Demystifying microprocessor design, IEEE Spectrum vol 16 n°7, pp. 2-30, 1979.

[20] J. McKevitt et J. Bayliss, New options from big chips, IEEE Spectrum vol 16 n°3, pp. 28-34, 1979.

[21] S. Stritter et N. Tredennick, Microprogrammed implementation of a single chip microprocessor, Proc 11th Annual Microprogramming workshop, 1978, pp. 8-16.

[22] N. Tredennick, Experiences in commercial VLSI microprocessor design, Microprocessor Microsystems 12 n° 8, pp. 419-432, 1988.

[23] N. Tredennick, The cultures of microprogramming, Proc 15th Ann Microprogramming Workshop, 1982, pp. 79-83.

[24] T. Atkinson, Architecture of series 60/level 64, Honeywell Computer Journal vol 8 n°2, pp. 94-106, 1974.

[25] J. Mick et J. Brick, Bit-slice microprocessor design, New York, McGraw-Hill, 1980.

[26] J.R. Larus, A comparison of microcode, assembly code, and high-level languages on the VAX-11 and RISC I, Computer Architecture News vol 10 n°5, pp. 10-15, 1982.

[27] C.G. Bell, J.C. Mudge et J.E. McNamara, Computer engineering: a DEC view of hardware systems design, Bedford, MA, Digital Press, 1978.

[28] A.B. Salisbury, Microprogrammable computer architectures, New York, Elsevier, 1976.

[29] G.J. Myers, Advances in computer architecture, 2e édition, New York, Wiley, 1978.

[30] R.J. Baron et L. Higbie, Computer architecture: case studies, Reading, MA, Addison-Wesley, 1992.

[31] D. Bhandarkar et D.W. Clark, Performance from architecture: comparing a RISC and a CISC with similar hardware oprganization, Proc 4th Intl Conference on Architectural Support for Programming Langage and Operating Systems [ASPLOS], 1991, pp. 310-319.

[32] Motorola ColdFire, en ligne à  http://www.motorola.com/ColdFire

[33] C.F. Webb et J.S. Liptay, A high-frequency custom CMOS S/390 microprocessor, IBM Journal Res Dev vol 41 n°4/5, pp.463-473, 1997.

[34] B. Shriver et B. Smith, The anatomy of a high-performance microprocessor: a systems perspective, Los Alamitos, CA, IEEE Computer Society Press, 1998.
 

Conservatoire national des arts et métiers
Architectures des systèmes informatiques
ANNEXE 17
Sur la microprogrammation
Année 2000-2001