Changes between Version 4 and Version 5 of ToolsTp3-2010


Ignore:
Timestamp:
Jan 10, 2011, 1:02:42 AM (14 years ago)
Author:
jpc
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • ToolsTp3-2010

    v4 v5  
    55[[PageOutline]]
    66
    7 Dans ce TP, nous souhaitons réaliser un générateur de circuit addaccu amélioré avec comme paramètre, entre autres, le nombre de bits. Ce générateur sera, dans un premier temps, conçu avec les cellules de sxlib, puis avec les cellules de dpsxlib.
    8 
    9 Nous verrons dans ce TP comment '''Stratus''' permet de décrire des netlists paramétrables et de les utiliser. Les Netlists seront placés-routés de différentes manières pour montrer l'intérêt du placement procédural.
     7Dans ce TP, nous souhaitons réaliser  un générateur de circuit addaccu amélioré avec comme
     8paramètre, entre  autres, le nombre  de bits. Ce  générateur sera, dans un  premier temps,
     9conçu avec les cellules de sxlib, puis avec les cellules de dpsxlib.
     10
     11Nous verrons dans ce TP comment '''Stratus''' permet de décrire des netlists paramétrables
     12et de les utiliser. Les Netlists seront placés-routés de différentes manières pour montrer
     13l'intérêt du placement procédural.
    1014
    1115Pensez à consulter la documentation de '''Stratus''' en cas de besoin :
     
    1317http://www-soc.lip6.fr/~jpc/coriolis2/en/html/stratus/index.html
    1418
     19
    1520= 1 Introduction =
    1621
    17   == 1.1 Circuit addaccu ==
    18 
    19 Dans le circuit '''addaccu''' sont instanciés trois blocs '''mux''', '''reg''' et '''add'''.
     22== 1.1 Circuit addaccu ==
     23
     24Dans  le  circuit  '''addaccu'''  sont  instanciés trois  blocs  '''mux''',  '''reg'''  et
     25'''add'''.
    2026
    2127[[Image(addaccu.jpg, nolink)]]
    2228
    23 Les deux blocs '''mux''' et '''reg''' sont des générateurs paramétrables décrits dans le langage '''Stratus''', ce sont des interconnexions de portes de bases, fournies par la bibliothèque de cellules pré-caractérisées SXLIB.
    24 
    25 Le bloc '''add''', également décrit dans le langage '''Stratus''', instancie un bloc '''full_adder''', lui même étant une interconnexion de porte '''sxlib''', décrit en '''Stratus'''.
     29Les deux blocs  '''mux''' et '''reg''' sont des générateurs  paramétrables décrits dans le
     30langage '''Stratus''',  ce sont des  interconnexions de portes  de bases, fournies  par la
     31bibliothèque de cellules pré-caractérisées SXLIB.
     32
     33Le  bloc '''add''',  également décrit  dans le  langage '''Stratus''',  instancie  un bloc
     34'''full_adder''',  lui même  étant  une  interconnexion de  porte  '''sxlib''', décrit  en
     35'''Stratus'''.
    2636
    2737Le circuit '''addaccu''' a donc trois niveaux de hiérarchie.
    2838
    29   == 1.2 La bibliothèque sxlib ==
    30 
    31 Une cellule pré-caractérisée (en anglais ''standard cell'') est une fonction élémentaire pour laquelle on dispose des différentes "vues" permettant son utilisation par des outils CAO :
    32 
    33     * vue physique : dessin des masques, permettant d'automatiser le placement et le routage,
    34     * vue logique : schéma en transistors permettant la caractérisation (surface, consommation, temps de propagation),
    35     * vue comportementale : description VHDL permettant la simulation logique des circuits utilisant cette bibliothèque.
    36 
    37 La bibliothèque de cellules utilisée dans ce TP est la bibliothèque '''sxlib''', développée par le laboratoire LIP6, pour la chaîne de CAO '''Alliance'''.
    38 La particularité de cette bibliothèque est d'être "portable" : le dessin des masques de fabrication utilise une technique de dessin symbolique, qui permet d'utiliser cette bibliothèque de cellules pour n'importe quel procédé de fabrication CMOS possédant au moins trois niveaux d'interconnexion.
    39 
    40 Évidemment, les caractéristiques physiques (surface occupée, temps de propagation) dépendent du procédé de fabrication.
    41 Les cellules que vous utiliserez dans ce TP ont été caractérisées pour un procédé de fabrication CMOS 0.35 micron.
    42 
    43 La liste des cellules disponibles dans la bibliothèque '''sxlib''' peut être obtenue en consultant la page man :
     39
     40== 1.2 La bibliothèque sxlib ==
     41
     42Une cellule pré-caractérisée  (en anglais ''standard cell'') est  une fonction élémentaire
     43pour laquelle on dispose des différentes  "vues" permettant son utilisation par des outils
     44CAO :
     45
     46  * vue physique: dessin des masques, permettant d'automatiser le placement et le routage.
     47  * vue logique: schéma en transistors permettant la caractérisation (surface,
     48    consommation, temps de propagation),
     49  * vue comportementale: description VHDL permettant la simulation logique des circuits
     50    utilisant cette bibliothèque.
     51
     52La  bibliothèque  de  cellules  utilisée  dans  ce TP  est  la  bibliothèque  '''sxlib''',
     53développée  par  le   laboratoire  LIP6,  pour  la  chaîne   de  CAO  '''Alliance'''.   La
     54particularité  de cette  bibliothèque est  d'être "portable"  : le  dessin des  masques de
     55fabrication  utilise une  technique  de  dessin symbolique,  qui  permet d'utiliser  cette
     56bibliothèque  de cellules pour  n'importe quel  procédé de  fabrication CMOS  possédant au
     57moins trois niveaux d'interconnexion.
     58
     59Évidemment,  les  caractéristiques  physiques  (surface  occupée,  temps  de  propagation)
     60dépendent du procédé de fabrication.  Les cellules  que vous utiliserez dans ce TP ont été
     61caractérisées pour un procédé de fabrication CMOS 0.35 micron.
     62
     63La liste  des cellules disponibles dans  la bibliothèque '''sxlib''' peut  être obtenue en
     64consultant la page man:
     65
    4466{{{
    4567> man sxlib
    4668}}}
    4769
    48 Comme vous pourrez le constater, il existe plusieurs cellules réalisant la même fonction logique. Les deux cellules ''na2_x1'' et ''na2_x4'' réalisent toutes les deux la fonction NAND à 2 entrées, et ne diffèrent entre elles que par leur puissance électrique : la cellule ''na2_x4'' est capable de charger une capacité de charge 4 fois plus grande que la cellule ''na2_x1''. Évidemment, plus la cellule est puissante, plus la surface de silicium occupée est importante.
    49 Vous pouvez visualiser le dessin des masques de ces cellules en utilisant l'éditeur graphique de la chaîne '''alliance''' '''graal'''.
    50 
    51   == 1.3 Schéma des blocs ==
    52 
    53     === 1.3.1 Multiplexeur ===
    54 
    55 Un multiplexeur 4 bits peut être réalisé en utilisant 4 cellules ''mx2_x2'' suivant le schéma ci-dessous :
     70Comme vous pourrez  le constater, il existe plusieurs cellules  réalisant la même fonction
     71logique. Les deux cellules ''na2_x1'' et  ''na2_x4'' réalisent toutes les deux la fonction
     72NAND à  2 entrées,  et ne diffèrent  entre elles  que par leur  puissance électrique  : la
     73cellule ''na2_x4'' est capable de charger une capacité de charge 4 fois plus grande que la
     74cellule ''na2_x1''. Évidemment, plus la cellule est puissante, plus la surface de silicium
     75occupée est importante.   Vous pouvez visualiser le dessin des masques  de ces cellules en
     76utilisant l'éditeur graphique de la chaîne '''alliance''' '''graal'''.
     77
     78
     79== 1.3 Schéma des blocs ==
     80
     81=== 1.3.1 Multiplexeur ===
     82
     83Un multiplexeur  4 bits peut  être réalisé en  utilisant 4 cellules ''mx2_x2''  suivant le
     84schéma ci-dessous :
    5685
    5786[[Image(mux.jpg, nolink)]]
    5887
    59 Vous pouvez consulter le modèle comportemental de la cellule ''mx2_x2'' : [attachment:mx2_x2.vbe mx2_x2.vbe].
    60 
    61     === 1.3.2 Registre ===
    62 
    63 Un registre 4 bits peut être réalisé en utilisant 4 cellules ''sff1_x4'' suivant le schéma ci-dessous :
     88Vous   pouvez   consulter   le   modèle   comportemental   de   la   cellule   ''mx2_x2'':
     89[attachment:mx2_x2.vbe mx2_x2.vbe].
     90
     91
     92=== 1.3.2 Registre ===
     93
     94Un registre 4 bits peut être réalisé en utilisant 4 cellules ''sff1_x4'' suivant le schéma
     95ci-dessous:
    6496
    6597[[Image(reg.jpg, nolink)]]
    6698
    67 La cellule ''sff1_x4'' est une bascule D à échantillonnage sur front montant. Vous pouvez consulter le modèle comportemental de cette cellule : [attachment:sff1_x4.vbe sff1_x4.vbe].
    68 
    69     === 1.3.3 Additionneur ===
    70 
    71 Un additionneur 4 bits peut être réalisé en interconnectant 4 additionneurs 1 bit, suivant le schéma ci-dessous :
     99La cellule ''sff1_x4'' est une bascule  D à échantillonnage sur front montant. Vous pouvez
     100consulter   le  modèle   comportemental   de  cette   cellule  :   [attachment:sff1_x4.vbe
     101sff1_x4.vbe].
     102
     103
     104=== 1.3.3 Additionneur ===
     105
     106Un additionneur 4 bits peut être réalisé en interconnectant 4 additionneurs 1 bit, suivant
     107le schéma ci-dessous:
    72108
    73109[[Image(adder.jpg, nolink)]]
    74110
    75 Un additionneur 1 bit (encore appelé ''Full Adder'') possède 3 entrées a,b,c, et deux sorties s et r.
    76 La table de vérité est définie par le tableau ci-dessous.
    77 Le bit de "somme" s vaut 1 lorsque le nombre de bits d'entrée égal à 1 est impair.
    78 Le bit de "report" est égal à 1 lorsqu'au moins deux bits d'entrée valent 1.
     111Un additionneur  1 bit  (encore appelé ''Full  Adder'') possède  3 entrées a,b,c,  et deux
     112sorties s  et r.  La  table de vérité  est définie par le  tableau ci-dessous.  Le  bit de
     113"somme" s  vaut 1  lorsque le  nombre de bits  d'entrée égal  à 1 est  impair.  Le  bit de
     114"report" est égal à 1 lorsqu'au moins deux bits d'entrée valent 1.
    79115
    80116||a||b||c||s||r||
     
    98134[[Image(full_adder.jpg, nolink)]]
    99135
     136
    100137= 2 Travail à effectuer =
    101138
    102   == 2.1 Bloc mux ==
    103 
    104   * Récupérer les deux fichiers permettant de créer le bloc '''mux''' et les étudier :
     139== 2.1 Initialisation de l'environnement Coriolis 2 ==
     140
     141Un script vous est fourni pour initialiser l'environnement pour coriolis 2.
     142Il s'exécute de la façon suivante:
     143{{{
     144> . ~jpc/M2-TOOLS/environment/coriolis2.sh
     145}}}
     146Il va:
     147  1. Positionner les variables d'environnement: {{{PATH, LD_LIBRARY_PATH, PYTHONPATH, ...}}}.
     148  2. Copier les fichiers de configuration:
     149     * [attachment:.environment.alliance.xml .environment.alliance.xml].
     150     * [attachment:.environment.alliance.xml .coriolis2.configuration.xml].
     151
     152== 2.1 Bloc mux ==
     153
     154  * Récupérer les deux fichiers permettant de créer le bloc '''mux''' et les étudier:
    105155    * [attachment:mux.py Netlist en '''Stratus''' du bloc '''mux''']
    106156    * [attachment:genmux.py Script pour la création de la netlist]
     
    124174}}}
    125175
    126 Si le script s'effectue sans erreur, un fichier ''.vst'' est normalement généré.
    127 Vous pouvez vérifier qu'il décrit bien le circuit voulu.
    128 
    129   == 2.2 Bloc registre ==
    130 
    131   * En s'inspirant du multiplexeur, écrire le bloc '''reg''' avec '''Stratus''' en utilisant exclusivement les cellules de la bibliothèque '''sxlib'''. Ce bloc prend lui aussi comme paramètre le nombre de bits. En outre, il vérifie que son paramètre est compris entre 2 et 64 (ce n’est pas fait dans mux).
     176Si le  script s'effectue sans  erreur, un fichier  ''.vst'' est normalement  généré.  Vous
     177pouvez vérifier qu'il décrit bien le circuit voulu.
     178
     179
     180== 2.2 Bloc registre ==
     181
     182  * En  s'inspirant  du multiplexeur,  écrire  le  bloc  '''reg''' avec  '''Stratus'''  en
     183    utilisant exclusivement les cellules de la bibliothèque '''sxlib'''. Ce bloc prend lui
     184    aussi comme  paramètre le nombre de  bits. En outre,  il vérifie que son  paramètre est
     185    compris entre 2 et 64 (ce n’est pas fait dans mux).
     186
    132187  * Ecrire le script python permettant de créer l'instance du registre.
    133188
    134   == 2.3 Bloc additionneur ==
    135 
    136   * Ecrire le bloc '''full_adder''' en utilisant exclusivement les cellules de la bibliothèque '''sxlib'''.
     189
     190== 2.3 Bloc additionneur ==
     191
     192  * Ecrire  le  bloc  '''full_adder'''  en  utilisant exclusivement  les  cellules  de  la
     193    bibliothèque '''sxlib'''.
    137194  * Ecrire le script python permettant de créer l'instance du '''full_adder'''.
    138   * Ecrire le bloc '''adder''' instanciant le '''full_adder''' créé. Ce bloc prend lui aussi comme paramètre le nombre de bits et vérifie que son paramètre est compris entre 2 et 64 (ce n’est pas fait dans mux).
     195  * Ecrire le  bloc '''adder'''  instanciant le '''full_adder'''  créé. Ce bloc  prend lui
     196    aussi comme paramètre le nombre de bits  et vérifie que son paramètre est compris entre
     197    2 et 64 (ce n’est pas fait dans mux).
    139198  * Ecrire le script python permettant de créer l'instance de l'additionneur.
    140199
    141   == 2.4 Circuit addaccu ==
     200
     201== 2.4 Circuit addaccu ==
    142202 
    143203  * Ecrire le circuit '''addaccu''' avec '''Stratus'''.
     
    145205    Le circuit '''addaccu''' prend également comme paramètre le nombre de bits.
    146206  * Ecrire le script python permettant de créer des instances de l'addaccu.
    147   * Ecrire un fichier '''Makefile paramétrable''' permettant de produire chaque composant et le circuit '''addaccu''' en choisissant le nombre de bits.
     207
     208  * Ecrire un  fichier '''Makefile paramétrable''' permettant de  produire chaque composant
     209    et le circuit '''addaccu''' en choisissant le nombre de bits.
     210
    148211  * Générer le circuit sur 4 bits.
    149212  * Visualiser la netlist obtenue avec '''xsch'''.
    150213
    151   == 2.5 Fonction Generate ==
    152 
    153 Il n'est pas toujours très pratique d'avoir à générer avec plusieurs scripts les différents blocs d'un circuit.
    154 Le langage '''Stratus''' fournit donc une alternative : la fonction '''Generate'''.
    155 
    156 Par exemple, pour générer une instance du multiplexeur fourni, il suffit d'ajouter la ligne suivante dans le fichier '''addaccu''' :
     214
     215== 2.5 Fonction Generate ==
     216
     217Il  n'est  pas  toujours très  pratique  d'avoir  à  générer  avec plusieurs  scripts  les
     218différents blocs d'un circuit.  Le langage '''Stratus''' fournit donc une alternative : la
     219fonction '''Generate'''.
     220
     221Par exemple,  pour générer  une instance  du multiplexeur fourni,  il suffit  d'ajouter la
     222ligne suivante dans le fichier '''addaccu''' :
    157223{{{
    158224Generate ( "mux.mux", "mux_%d" % self.n, param = { 'nbit' : self.n } )
    159225}}}
    160226
    161 Dans cette fonction, le premier argument représente la classe '''Stratus''' créée (format : ''nom_de_fichier.nom_de_classe''), le deuxième argument est le nom du modèle généré, le dernier argument est un dictionnaire initialisant les différents paramètres de cette classe.
    162 
    163   * Modifier le fichier décrivant l'addaccu et le Makefile de façon à pouvoir créer les instances de ce circuit en n'ayant besoin que d'un script.
    164 
    165   == 2.6 Description de patterns ==
    166 
    167 La chaîne de CAO '''Alliance''' fournit un outil permettant de décrire des séquences de stimuli : l'outil '''genpat'''.
    168 '''Stratus''' fournit le même service pour la chaîne de CAO '''Coriolis'''.
    169 De plus, '''Stratus''' encapsule l'appel au simulateur '''asimut'''.
    170 
    171   * Récupérer les deux fichiers décrivant le bloc mux avec création du fichier de patterns et simulation, et les étudier :
    172     * [attachment:mux2.py Netlist en '''Stratus''' du bloc '''mux''' avec la description des patterns]
    173     * [attachment:genmux2.py Script pour la création de la netlist, du fichier de patterns et du lancement du simulateur]
     227Dans cette fonction, le premier argument représente la classe '''Stratus''' créée (format:
     228''nom_de_fichier.nom_de_classe''), le  deuxième argument est  le nom du modèle  généré, le
     229dernier  argument est  un dictionnaire  initialisant  les différents  paramètres de  cette
     230classe.
     231
     232  * Modifier le  fichier décrivant l'addaccu et le  Makefile de façon à  pouvoir créer les
     233    instances de ce circuit en n'ayant besoin que d'un script.
     234
     235
     236== 2.6 Description de patterns ==
     237
     238La chaîne  de CAO '''Alliance''' fournit un  outil permettant de décrire  des séquences de
     239stimuli : l'outil  '''genpat'''.  '''Stratus''' fournit le même service  pour la chaîne de
     240CAO '''Coriolis'''.  De plus, '''Stratus''' encapsule l'appel au simulateur '''asimut'''.
     241
     242  * Récupérer les deux fichiers décrivant le bloc mux avec création du fichier de patterns
     243    et simulation, et les étudier :
     244    * [attachment:mux2.py Netlist  en '''Stratus''' du bloc '''mux'''  avec la description
     245      des patterns]
     246    * [attachment:genmux2.py Script pour la création de la netlist, du fichier de patterns
     247      et du lancement du simulateur]
    174248  * Créer les patterns et effectuer la simulation des deux autres blocs de la même façon.
    175   * Une fois tous les sous blocs validés, créer les patterns et effectuer la simulation du bloc '''addaccu'''.
    176 
    177   == 2.7 Circuit addsubaccu ==
    178 
    179 Maintenant, nous souhaitons que l’addaccu puisse effectuer soit des additions, soit des soustractions.
    180 Un nouveau paramètre sera donc à apporter pour choisir la fonction à effectuer (Vous avez le choix pour le nom et les valeurs possibles de ce paramètre).
    181 Ce nouveau composant sera sur le même schéma que le précédent, avec des modifications à apporter au circuit et/ou ses composants.
    182 
    183   * Créer un nouveau composant, appelé '''addsubaccu''' qui prend en compte cette nouvelle contrainte.
     249  * Une fois tous les sous blocs validés, créer les patterns et effectuer la simulation du
     250    bloc '''addaccu'''.
     251
     252
     253== 2.7 Circuit addsubaccu ==
     254
     255Maintenant, nous  souhaitons que l’addaccu puisse  effectuer soit des  additions, soit des
     256soustractions.   Un nouveau  paramètre sera  donc à  apporter pour  choisir la  fonction à
     257effectuer (Vous avez le  choix pour le nom et les valeurs  possibles de ce paramètre).  Ce
     258nouveau  composant sera sur  le même  schéma que  le précédent,  avec des  modifications à
     259apporter au circuit et/ou ses composants.
     260
     261  * Créer un nouveau composant, appelé '''addsubaccu''' qui prend en compte cette nouvelle
     262    contrainte.
    184263  * Ecrire le script python permettant de créer des instances de l'addsubaccu.
    185   * Ecrire un fichier '''Makefile''' paramétrable permettant de produire le circuit '''addsubaccu'''.
     264  * Ecrire  un  fichier  '''Makefile'''  paramétrable  permettant de  produire  le  circuit
     265    '''addsubaccu'''.
    186266  * Ecrire les patterns du composant '''addsubaccu''' et valider le bloc.
    187267
    188   == 2.8 Bibliothèque dpgen ==
     268
     269== 2.8 Bibliothèque dpgen ==
    189270
    190271Une bibliothèque d'opérateurs existe en '''Stratus''', la bibliothèque '''dpgen'''.
    191272
    192 Pour connaitre les générateurs dont vous disposez, consultez la documentation fournie :
     273Pour connaitre les générateurs dont vous disposez, consultez la documentation fournie:
    193274
    194275http://www-soc.lip6.fr/~jpc/coriolis2/en/html/dpgen/index.html
    195276
    196   * Ecrire un nouveau composant '''addsubaccu''' en utilisant les générateurs paramétrables de cette bibliothèque à votre disposition.
     277  * Ecrire   un  nouveau   composant   '''addsubaccu'''  en   utilisant  les   générateurs
     278    paramétrables de cette bibliothèque à votre disposition.
     279
    197280  * Valider ce bloc avec les mêmes patterns que le bloc précédent.
    198281
     282
    199283= 3 Compte rendu =
    200284
     
    202286
    203287  * Vous présenterez un schéma de la hiérarchie du circuit '''addaccu'''.
    204   * Vous expliciterez les choix que vous avez fait pour modifier le circuit '''addaccu''' et/ou ses composants de façon à créer le circuit '''adddsubaccu'''.
    205   * Vous décrirez quels générateurs de la bibliothèque '''dpgen''' vous avez utilisé et pourquoi.
    206 
    207 Vous fournirez tous les fichiers écrits, avec les '''Makefile''' permettant d'effectuer la génération des deux circuits (et l'effacement des fichiers générés).
     288  * Vous expliciterez les choix que vous  avez fait pour modifier le circuit '''addaccu'''
     289    et/ou ses composants de façon à créer le circuit '''adddsubaccu'''.
     290  * Vous décrirez  quels générateurs de la  bibliothèque '''dpgen''' vous  avez utilisé et
     291    pourquoi.
     292
     293Vous fournirez tous les fichiers écrits, avec les '''Makefile''' permettant d'effectuer la
     294génération des deux circuits (et l'effacement des fichiers générés).