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