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. |
| 7 | Dans ce TP, nous souhaitons réaliser un générateur de circuit addaccu amélioré avec comme |
| 8 | paramètre, entre autres, le nombre de bits. Ce générateur sera, dans un premier temps, |
| 9 | conçu avec les cellules de sxlib, puis avec les cellules de dpsxlib. |
| 10 | |
| 11 | Nous verrons dans ce TP comment '''Stratus''' permet de décrire des netlists paramétrables |
| 12 | et de les utiliser. Les Netlists seront placés-routés de différentes manières pour montrer |
| 13 | l'intérêt du placement procédural. |
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'''. |
| 29 | Les deux blocs '''mux''' et '''reg''' sont des générateurs paramétrables décrits dans le |
| 30 | langage '''Stratus''', ce sont des interconnexions de portes de bases, fournies par la |
| 31 | bibliothèque de cellules pré-caractérisées SXLIB. |
| 32 | |
| 33 | Le 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'''. |
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 | |
| 42 | Une cellule pré-caractérisée (en anglais ''standard cell'') est une fonction élémentaire |
| 43 | pour laquelle on dispose des différentes "vues" permettant son utilisation par des outils |
| 44 | CAO : |
| 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 | |
| 52 | La bibliothèque de cellules utilisée dans ce TP est la bibliothèque '''sxlib''', |
| 53 | développée par le laboratoire LIP6, pour la chaîne de CAO '''Alliance'''. La |
| 54 | particularité de cette bibliothèque est d'être "portable" : le dessin des masques de |
| 55 | fabrication utilise une technique de dessin symbolique, qui permet d'utiliser cette |
| 56 | bibliothèque de cellules pour n'importe quel procédé de fabrication CMOS possédant au |
| 57 | moins trois niveaux d'interconnexion. |
| 58 | |
| 59 | Évidemment, les caractéristiques physiques (surface occupée, temps de propagation) |
| 60 | dépendent du procédé de fabrication. Les cellules que vous utiliserez dans ce TP ont été |
| 61 | caractérisées pour un procédé de fabrication CMOS 0.35 micron. |
| 62 | |
| 63 | La liste des cellules disponibles dans la bibliothèque '''sxlib''' peut être obtenue en |
| 64 | consultant la page man: |
| 65 | |
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 : |
| 70 | Comme vous pourrez le constater, il existe plusieurs cellules réalisant la même fonction |
| 71 | logique. Les deux cellules ''na2_x1'' et ''na2_x4'' réalisent toutes les deux la fonction |
| 72 | NAND à 2 entrées, et ne diffèrent entre elles que par leur puissance électrique : la |
| 73 | cellule ''na2_x4'' est capable de charger une capacité de charge 4 fois plus grande que la |
| 74 | cellule ''na2_x1''. Évidemment, plus la cellule est puissante, plus la surface de silicium |
| 75 | occupée est importante. Vous pouvez visualiser le dessin des masques de ces cellules en |
| 76 | utilisant 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 | |
| 83 | Un multiplexeur 4 bits peut être réalisé en utilisant 4 cellules ''mx2_x2'' suivant le |
| 84 | schéma ci-dessous : |
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 : |
| 99 | La cellule ''sff1_x4'' est une bascule D à échantillonnage sur front montant. Vous pouvez |
| 100 | consulter le modèle comportemental de cette cellule : [attachment:sff1_x4.vbe |
| 101 | sff1_x4.vbe]. |
| 102 | |
| 103 | |
| 104 | === 1.3.3 Additionneur === |
| 105 | |
| 106 | Un additionneur 4 bits peut être réalisé en interconnectant 4 additionneurs 1 bit, suivant |
| 107 | le schéma ci-dessous: |
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. |
| 111 | Un additionneur 1 bit (encore appelé ''Full Adder'') possède 3 entrées a,b,c, et deux |
| 112 | sorties 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. |
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 | |
| 141 | Un script vous est fourni pour initialiser l'environnement pour coriolis 2. |
| 142 | Il s'exécute de la façon suivante: |
| 143 | {{{ |
| 144 | > . ~jpc/M2-TOOLS/environment/coriolis2.sh |
| 145 | }}} |
| 146 | Il 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: |
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). |
| 176 | Si le script s'effectue sans erreur, un fichier ''.vst'' est normalement généré. Vous |
| 177 | pouvez 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 | |
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 | |
| 217 | Il n'est pas toujours très pratique d'avoir à générer avec plusieurs scripts les |
| 218 | différents blocs d'un circuit. Le langage '''Stratus''' fournit donc une alternative : la |
| 219 | fonction '''Generate'''. |
| 220 | |
| 221 | Par exemple, pour générer une instance du multiplexeur fourni, il suffit d'ajouter la |
| 222 | ligne suivante dans le fichier '''addaccu''' : |
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] |
| 227 | Dans 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 |
| 229 | dernier argument est un dictionnaire initialisant les différents paramètres de cette |
| 230 | classe. |
| 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 | |
| 238 | La chaîne de CAO '''Alliance''' fournit un outil permettant de décrire des séquences de |
| 239 | stimuli : l'outil '''genpat'''. '''Stratus''' fournit le même service pour la chaîne de |
| 240 | CAO '''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] |
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 | |
| 255 | Maintenant, nous souhaitons que l’addaccu puisse effectuer soit des additions, soit des |
| 256 | soustractions. Un nouveau paramètre sera donc à apporter pour choisir la fonction à |
| 257 | effectuer (Vous avez le choix pour le nom et les valeurs possibles de ce paramètre). Ce |
| 258 | nouveau composant sera sur le même schéma que le précédent, avec des modifications à |
| 259 | apporter au circuit et/ou ses composants. |
| 260 | |
| 261 | * Créer un nouveau composant, appelé '''addsubaccu''' qui prend en compte cette nouvelle |
| 262 | contrainte. |
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 | |
| 293 | Vous fournirez tous les fichiers écrits, avec les '''Makefile''' permettant d'effectuer la |
| 294 | génération des deux circuits (et l'effacement des fichiers générés). |