| 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 | }}} |