| | 2 | {{{ |
| | 3 | #!html |
| | 4 | <h1> TP8 : Placement et routage du circuit AMD2901</h1> |
| | 5 | }}} |
| | 6 | [[PageOutline]] |
| | 7 | = 1 Outils utilisés = |
| | 8 | Vous allez utiliser les outils de placement flot Coriolis et le routeur d'Alliance, ainsi |
| | 9 | que tous les outils de vérification vus dans le TP précédent. |
| | 10 | Vous utiliserez aussi '''lvx''', le comparateur de netlists. |
| | 11 | |
| | 12 | = 2 Environnement technologique = |
| | 13 | Outre l'environnement technologique de la première partie du TP, vous devez positionner |
| | 14 | : |
| | 15 | {{{ |
| | 16 | > export VH_MAXERR=10 |
| | 17 | > export MBK_WORK_LIB=. |
| | 18 | > export MBK_CATA_LIB=$ALLIANCE_TOP/cells/sxlib |
| | 19 | > export MBK_CATA_LIB=$MBK_CATA_LIB :$ALLIANCE_TOP/cells/dp_sxlib |
| | 20 | > export MBK_CATA_LIB=$MBK_CATA_LIB :$ALLIANCE_TOP/cells/pxlib |
| | 21 | > export MBK_CATA_LIB=$MBK_CATA_LIB :. |
| | 22 | > export MBK_CATAL_NAME=CATAL |
| | 23 | > export MBK_IN_LO=vst |
| | 24 | > export MBK_OUT_LO=vst |
| | 25 | > export MBK_IN_PH=ap |
| | 26 | > export MBK_OUT_PH=ap |
| | 27 | > export CRL_OUT_LO=vst |
| | 28 | > export CRL_OUT_PH=ap |
| | 29 | > export PYTHONPATH=/opt/coriolis/lib/python2.3/site-packages/stratus |
| | 30 | > export PYTHONPATH=/opt/coriolis/lib/python2.3/site-packages/isobar :$PYTHONPATH |
| | 31 | > export PYTHONPATH=/opt/coriolis/lib/python2.3/site-packages :$PYTHONPATH |
| | 32 | }}} |
| | 33 | NB : Ces variables d'environnement sont positionnées par défaut, mais il peut être |
| | 34 | utile de les vérifier. |
| | 35 | = 3 Précautions quant au nommage des fichiers = |
| | 36 | D'une manière générale, les fichiers décrivant une netlist logique doivent porter le |
| | 37 | même nom que le fichier correspondant décrivant la vue physique. |
| | 38 | |
| | 39 | C'est à dire que le fichier amd2901_dpt.vst (vue logique) doit correspondre au fichier amd2901_dpt.ap |
| | 40 | (vue physique). Il en va de même pour le fichier amd2901_core. |
| | 41 | |
| | 42 | |
| | 43 | = 4 Travail sur le chemin de données : Préplacement des opérateurs = |
| | 44 | Le TP précédent vous a permis de décrire la netlist hiérarchique du chemin de donn |
| | 45 | ées. Vous allez maintenant placer les colonnes du chemin de données de manière à |
| | 46 | profiter de la régularité du chemin de données. |
| | 47 | Pour réaliser votre placement des opérateurs, vous disposez des fonctions de ''''STRATUS'''' |
| | 48 | suivantes : |
| | 49 | * Place() |
| | 50 | * !PlaceRight(), !PlaceTop(), !PlaceLeft(), !PlaceBottom() |
| | 51 | * !SetRefIns() |
| | 52 | * !DefAb(), !ResizeAb() |
| | 53 | |
| | 54 | Toutes ces fonctions doivent être utilisées dans la méthode Layout. |
| | 55 | Reprenons l'exemple du TP précédent, on donne le code suivant pour le fichier circuit.py : |
| | 56 | {{{ |
| | 57 | #!/usr/bin/env python |
| | 58 | from stratus import * |
| | 59 | # definition de la cellule |
| | 60 | class circuit ( Model ): |
| | 61 | ... |
| | 62 | def Layout ( self ): |
| | 63 | Place ( self.instance_nand2_4bits, NOSYM, XY ( 0, 0 ) ) |
| | 64 | PlaceRight ( self.instance_or2_4bits, NOSYM ) |
| | 65 | PlaceRight ( self.instance_add2_4bits, NOSYM ) |
| | 66 | }}} |
| | 67 | Ensuite pour le fichier test_circuit.py, il faut rajouter l'appel à la méthode Layout : |
| | 68 | {{{ |
| | 69 | #!/usr/bin/env python |
| | 70 | from stratus import * |
| | 71 | from circuit import circuit |
| | 72 | my_circuit = circuit ( "mon_circuit" ) # creation du circuit |
| | 73 | my_circuit.Interface() # creation de l’interface |
| | 74 | my_circuit.Netlist() # creation de la netlist |
| | 75 | my_circuit.Layout() # creation du layout |
| | 76 | my_circuit.View() # pour afficher le layout |
| | 77 | my_circuit.Save ( PHYSICAL ) # sauver les fichiers mon_circuit.vst et mon_circuit.ap |
| | 78 | }}} |
| | 79 | |
| | 80 | Reprenez le fichier amd2901_dpt.py. Pour l'instant, ce fichier ne comporte qu'une |
| | 81 | description de la netlist. Cela vous a permis de générer une description structurelle |
| | 82 | sous la forme d'un fichier .vst. Il s'agit maintenant de placer explicitement les colonnes. |
| | 83 | '''Le placement des colonnes du chemin de données ne doit pas être |
| | 84 | fait au hasard. La faisabilité et la qualité du routage en dépendent ''' |
| | 85 | |
| | 86 | Aidez-vous du manuel de STRATUS : |
| | 87 | |
| | 88 | https://www-asim.lip6.fr/recherche/coriolis/doc/en/html/stratus/index.html |
| | 89 | |
| | 90 | |
| | 91 | |
| | 92 | Utilisez STRATUS pour générer le tout : |
| | 93 | {{{ |
| | 94 | > ./execute_amd2901_dpt.py |
| | 95 | }}} |
| | 96 | |
| | 97 | [[Image(preplacement.jpg,nolink)]] |
| | 98 | |
| | 99 | = 5 Travail sur le coeur : Préplacement des structures régulières = |
| | 100 | à partir du fichier de description structurelle [attachment:amd2901_core.py coeur du circuit] que vous avez enrichi |
| | 101 | de la description des "netlists" de la partie contrôle et de la partie chemin de données, effectuez les étapes suivantes dans la méthode |
| | 102 | Layout : |
| | 103 | |
| | 104 | * Placer le chemin de données : fonction Place () |
| | 105 | |
| | 106 | * Agrandir la boite d'aboutement du coeur : fonction !ResizeAb () |
| | 107 | cette étape est utile pour réserver la place pour la partie contrôle |
| | 108 | |
| | 109 | * Placer les rails de rappels d'alimentation dans le coeur : |
| | 110 | fonctions !AlimVerticalRail () et !AlimHorizontalRail () |
| | 111 | |
| | 112 | * Placer les connecteurs du coeur : fonction !AlimConnectors () |
| | 113 | |
| | 114 | |
| | 115 | '''ATTENTION ''': La logique "irrégulière" constituant la partie contrôle n'a pas besoin |
| | 116 | d'être placée explicitement. Cela sera fait automatiquement par la suite ! |
| | 117 | |
| | 118 | '''Vérifiez le résultat''' |
| | 119 | {{{ |
| | 120 | > ./execute_amd2901_core.py |
| | 121 | }}} |
| | 122 | |
| | 123 | |
| | 124 | = 6 Travail sur le cicuit complet = |
| | 125 | |
| | 126 | Prenez le fichier [attachment:amd2901_chip.py circuit complet avec les plots] et complétez la méthode Layout |
| | 127 | comme indiqué ci-dessous. |
| | 128 | |
| | 129 | == 6.1 Placement de la couronne de plots et du coeur == |
| | 130 | |
| | 131 | Dans le fichier amd2901_chip.py fourni, les plots sont instanciés dans la méthode |
| | 132 | Netlist : |
| | 133 | {{{ |
| | 134 | def Netlist ( self ) : |
| | 135 | ... |
| | 136 | Inst ( "pck_px", "p_ck" |
| | 137 | , map = { ’pad’ : self.ck |
| | 138 | , ’ck’ : cki |
| | 139 | , ’vddi’ : self.vdd |
| | 140 | , ’vssi’ : self.vss |
| | 141 | , ’vdde’ : self.vdde |
| | 142 | , ’vsse’ : self.vsse |
| | 143 | } |
| | 144 | |
| | 145 | ) |
| | 146 | }}} |
| | 147 | Il vous faut donc, dans la méthode Layout : |
| | 148 | |
| | 149 | |
| | 150 | * Définir la taille de la boîte d'aboutement globale du circuit de façon à ce que |
| | 151 | les plots puissent être placés à la périphérie : fonction !DefAb () (Commencer par |
| | 152 | définir une boite d'aboutement de 4000 par 4000 et vous essaierez ensuite de la |
| | 153 | diminuer) |
| | 154 | |
| | 155 | * Placer le coeur du circuit au centre de la boîte d'aboutement du chip : fonction |
| | 156 | !PlaceCentric () |
| | 157 | |
| | 158 | * Définir sur quelle face et dans quel ordre vous souhaitez placer les plots. Cela se |
| | 159 | fait à l'aide des 4 fonctions : !PadNorth (), !PadSouth (), !PadEast () et !PadWest (). |
| | 160 | |
| | 161 | * Vérifiez le résultat : |
| | 162 | {{{ |
| | 163 | > ./execute_amd2901_chip.py |
| | 164 | }}} |
| | 165 | |
| | 166 | == 6.2 Routage des alimentations == |
| | 167 | Vous devez utiliser la fonction !PowerRing () pour créer la grille d'alimentation. |
| | 168 | Vérifiez le résultat : |
| | 169 | {{{ |
| | 170 | > ./execute_amd2901_chip.py |
| | 171 | }}} |
| | 172 | |
| | 173 | |
| | 174 | == 6.3 Placement de la logique irrégulière == |
| | 175 | C'est le placeur '''Mistral''' qui se charge de placer les cellules de la partie de contrôle. |
| | 176 | Il détecte quelles sont les cellules qui n'ont pas été placées et complète le placement en |
| | 177 | utilisant les zones "vides". Pour appeler le placeur '''Mistral''', vous devez faire appel à la |
| | 178 | fonction ''!PlaceGlue ()'' |
| | 179 | |
| | 180 | [[Image(zoomPlaceGlue.jpg,nolink)]] |
| | 181 | |
| | 182 | Attention : Pour pouvoir placer automatiquement la logique "irrégulière", il faut |
| | 183 | que les plots soient placés. L'outil de placement du flot CORIOLIS place les cellules |
| | 184 | en se basant sur les attirances de celles-ci vers les plots ainsi que vers les cellules déjà |
| | 185 | placées. |
| | 186 | [[Image(placement.jpg,nolink)]] |
| | 187 | Vérifiez le résultat : |
| | 188 | {{{ |
| | 189 | > ./execute_amd2901_chip.py |
| | 190 | }}} |
| | 191 | |
| | 192 | |
| | 193 | [[Image(rappel.jpg,nolink)]] |
| | 194 | |
| | 195 | Le placement automatique se termine par l'appel à la fonction !FillCell () qui effectue |
| | 196 | le placement automatique de cellules de bourrage. |
| | 197 | [[Image(zoomFillCell.jpg,nolink)]] |
| | 198 | |
| | 199 | Vérifiez le résultat : |
| | 200 | |
| | 201 | {{{ |
| | 202 | > ./execute_amd2901_chip.py |
| | 203 | }}} |
| | 204 | |
| | 205 | == 6.4 Routage des signaux d'horloge == |
| | 206 | |
| | 207 | Vous devez utiliser la fonction !RouteCk () qui route le signal d'horloge. |
| | 208 | Vérifiez le résultat : |
| | 209 | {{{ |
| | 210 | > ./execute_amd2901_chip.py |
| | 211 | }}} |
| | 212 | |
| | 213 | [[Image(zoomCk.jpg,nolink)]] |
| | 214 | |
| | 215 | == 6.5 Routage des signaux logiques == |
| | 216 | Routez automatiquement tous les signaux autres que le signal d'horloge et les signaux |
| | 217 | d'alimentation en utilisant NERO de la manière suivante : |
| | 218 | {{{ |
| | 219 | > nero -V -p amd2901_chip amd2901_chip amd2901_chip_r |
| | 220 | }}} |
| | 221 | |
| | 222 | L'option -p indique que vous transmettez un placement, à savoir celui du chip. Le |
| | 223 | troisième argument est la netlist du chip, le quatrième est le fichier résultat. |
| | 224 | |
| | 225 | |
| | 226 | NOTA BENE : La variable '''MBK_CATA_LIB''' ne doit contenir qu'une seule fois les |
| | 227 | chemins d'accès aux bibliothèques. |
| | 228 | |
| | 229 | == 6.6 Validation du chip == |
| | 230 | |
| | 231 | |
| | 232 | * On validera le travail de '''NERO''' avec les outils '''DRUC''', '''COUGAR''' et '''LVX'''. |
| | 233 | {{{ |
| | 234 | > druc amd2901_chip_r |
| | 235 | > export MBK_OUT_LO=al |
| | 236 | > cougar -f amd2901_chip_r |
| | 237 | > lvx vst al amd2901_chip amd2901_chip_r -f |
| | 238 | }}} |
| | 239 | |
| | 240 | * Simulez à nouveau la netlist extraite avec '''ASIMUT'''. Précisez le format de la netlist |
| | 241 | dans la variable d'entrée '''MBK_IN_LO''' avant la simulation. |
| | 242 | {{{ |
| | 243 | > export MBK_IN_LO=al |
| | 244 | }}} |
| | 245 | |
| | 246 | '''Faites attention au fichier CATAL!''' |
| | 247 | * Pour connaitre le nombre de transistors, on effectue une extraction du circuit au niveau |
| | 248 | transistor : |
| | 249 | {{{ |
| | 250 | > cougar -v -t amd2901_chip_r amd2901_chip_r_t |
| | 251 | }}} |
| | 252 | |
| | 253 | = Conclusion = |
| | 254 | Ce TP vous a permis de passer par la plupart des étapes nécessaires à la conception |
| | 255 | "back-end" et la validation d'un circuit réalisé en cellules précaractérisées avec préplacement |
| | 256 | des parties régulières. |
| | 257 | |
| | 258 | Ces mêmes outils seront utilisés pour laréalisation du processeur MIPS R3000. |
| | 259 | Le compte-rendu du TP doit comporter : |
| | 260 | |
| | 261 | Vos logins, vos noms et prénoms, et vos répertoires de travail pour ce TP (laissez |
| | 262 | libre accès à vos répertoires en lecture !). |
| | 263 | Une description exacte de la méthodologie employée, incluant les éventuels probl |
| | 264 | èmes rencontrés. |
| | 265 | |
| | 266 | |
| | 267 | Pour l'amd2901, décrivez le flot de conception. Quels choix avez-vous retenus |
| | 268 | pour le placement des colonnes du chemin de données, votre circuit est-il limité |
| | 269 | par les plots ou par la taille du coeur (pad limited ou core limited)... Quels |
| | 270 | sont les résultats donnés par lvx... Les schémas sont appréciés. |
| | 271 | |
| | 272 | Les Makeles du flot total. ( Les Makefiles seront testés à la fin de ce TP) |
| | 273 | NE PAS JOINDRE DE LISTINGS DE FICHIERS (SAUF LES MAKEFILES). |
| | 274 | Merci et bon courage ! |
| | 275 | |
| | 276 | |