98 | | TODO |
| 98 | == 4.1 Préplacement des structures régulières === |
| 99 | |
| 100 | Introduire les étapes suivantes dans la méthode ''Layout'' du fichier ''am2901_core.py'' décrivant le coeur du circuit AM2091 : |
| 101 | * Placer le chemin de données : fonction ''Place()''. |
| 102 | * Agrandir la boite d'aboutement du coeur : fonction ''!ResizeAb()''. |
| 103 | (Cette étape est utile pour réserver la place nécessaire au placement des cellules de la partie contrôle. |
| 104 | La logique "irrégulière" constituant la partie contrôle n'a pas besoin d'être placée explicitement. Cela sera fait automatiquement par la suite !) |
| 105 | * Placer les rails de rappels d'alimentation dans le coeur : fonctions ''!AlimVerticalRail()'' et ''!AlimHorizontalRail()''. |
| 106 | * Placer les connecteurs du coeur : fonction ''!AlimConnectors()''. |
| 107 | * Modifier l'appel à la fonction ''Generate'' dans le chip de façon à générer la vue physique du coeur. |
| 108 | * Faire appel à la méthode ''View'' pour visualiser. |
| 109 | |
| 110 | == 4.2 Placement du coeur et de la couronne de plots == |
| 111 | |
| 112 | Dans le fichier ''amd2901_chip.py'' fourni, les plots sont instanciés dans la méthode ''Netlist''. |
| 113 | Il vous faut donc : |
| 114 | |
| 115 | * Définir la taille de la boîte d'aboutement globale du circuit de façon à ce que les plots puissent être placés à la périphérie : fonction ''!DefAb()''. |
| 116 | (On peut commencer par définir une boite d'aboutement de 4000 par 4000 et essayer ensuite de la réduire) |
| 117 | * Placer le coeur du circuit au centre de la boîte d'aboutement du chip : fonction ''!PlaceCentric()''. |
| 118 | * Définir sur quelle face et dans quel ordre placer les plots, cela se fait à l'aide des 4 fonctions : ''!PadNorth()'', ''!PadSouth()'', ''!PadEast()'' et ''!PadWest()''. |
| 119 | * Visualiser le résultat. |
| 120 | |
| 121 | == 4.3 Routage des alimentations == |
| 122 | |
| 123 | * Créez la grille d'alimentation : fonction ''!PowerRing()''. |
| 124 | * Visualisez le résultat. |
| 125 | |
| 126 | == 4.4 Placement de la logique irrégulière == |
| 127 | |
| 128 | C'est le placeur '''mistral''' qui se charge de placer automatiquement les cellules non encore placées. |
| 129 | Il détecte quelles sont les cellules qui n'ont pas été placées et complète le placement en utilisant les zones "vides". |
| 130 | |
| 131 | [[Image(placement.jpg,nolink)]] |
| 132 | |
| 133 | * Appelez le placeur '''mistral''' : fonction ''!PlaceGlue ()''.. |
| 134 | (Attention : Pour pouvoir placer automatiquement la logique "irrégulière", il faut avoir préalablement défini la position des plots d'entrée/sortie sur les 4 faces du circuit. L'outil de placement automatique place les cellules non placées en se basant sur les attirances vers les plots ainsi que vers les cellules déjà placées.) |
| 135 | * Visualisez le résultat. |
| 136 | * Effectuez le placement automatique de cellules de bourrage : fonction ''!FillCell()''. |
| 137 | * Visualisez le résultat. |
| 138 | |
| 139 | == 4.5 Routage des signaux d'horloge == |
| 140 | |
| 141 | * Construisez le réseau maillé correspondant au signal d'horloge interne : fonction ''!RouteCk()''. |
| 142 | * Visualisez le résultat. |
| 143 | |
| 144 | == 4.6 Routage des signaux logiques == |
| 145 | |
| 146 | L'appel au routeur automatique '''nero''' n'est pas encore intégré dans le langage '''Stratus'''. |
| 147 | Pour effectuer le routage de tous les signaux autres que le signal d'horloge et les signaux d'alimentation, il faut lancer '''nero''' de la manière suivante : |
| 148 | {{{ |
| 149 | > nero -V -p amd2901_chip amd2901_chip amd2901_chip_r |
| 150 | }}} |
| 151 | |
| 152 | L'option -p indique que vous fournissez un fichier de placement en argument. Le deuxième argument est le fichier définissant la ''netlist'', le troisième est le nom du fichier résultat. |
| 153 | |
| 154 | == 4.5 Validation == |
| 155 | |
| 156 | * Validez le routage en utilisant les les outils '''druc''', '''cougar''' et '''lvx'''. |
| 157 | {{{ |
| 158 | > druc amd2901_chip_r |
| 159 | > export MBK_OUT_LO=al |
| 160 | > cougar -f amd2901_chip_r |
| 161 | > lvx vst al amd2901_chip amd2901_chip_r -f |
| 162 | }}} |
| 163 | |
| 164 | * Resimulez la netlist extraite avec '''asimut'''. |
| 165 | Précisez le format de la netlist dans la variable d'entrée '''MBK_IN_LO''' avant la simulation. |
| 166 | {{{ |
| 167 | > export MBK_IN_LO=al |
| 168 | }}} |
| 169 | |
| 170 | * Pour connaitre le nombre de transistors, vous pouvez effectuer une extraction au niveau transistors : |
| 171 | {{{ |
| 172 | > cougar -v -t amd2901_chip_r amd2901_chip_r_t |
| 173 | }}} |