Rapport de TP ASIC
Transcription
Rapport de TP ASIC
Rapport de TP ASIC 2008/2009 Par : Hamza BOUKABACHE Olivier PISTRE Application Specific Integrated Circuit 5eme AE Dans un marché de plus en plus concurrentiel, l’électronique actuelle tend vers une complexité d’intégration de plus en plus croissante dans le but d’exécuter toujours plus de fonctions. Dans ce contexte là et dés les années 90, de nouveaux composants intégrés tels que les ASIC (Application Specific Integrated Circuit) feront leurs apparition. Entièrement dédiés, les ASICs permettent en général d’exécuter un grand nombre de fonctionnalités uniques et sur mesure. Leurs gros tau d’intégration les rendent cependant assez cher à la production et donc moins attractifs pour les petites série. Pour ce rapport, nous proposons de suivre le flot de conception des ASICs pour la réalisation d’un circuit simple et basique : Un compteur 8 bits Figure N°1 : Compteur 8bits Où : CK RST LOAD SENS EN Din Dout Horloge. Reset (actif bas). Signal de commande synchrone de chargement du compteur (actif haut). Définit le sens du comptage. Enable – permet au compteur de compter s’il est à la masse (actif bas) Donnée à charger dans le compteur quand la commande LOAD est active Sortie sur 8 bits Lors de tout le processus de conception il est vital de suivre chaque étape du flot de conception (Cf. figure n°2). Le non respect d’une de ces étapes peut mener au meilleur des cas à un ASIC non fonctionnel. Nous structurerons dons notre rapport sur ce model, où chaque étape de ce flot constituera un chapitre. Conception comportemental du compteur en VHDL Simulation après placement routage Simulation fonctionnelle Synthèse et optimisation Placement routage Simulation après synthèse Figure N°2 : Le flot de conception ASIC 1 - La description comportementale du compteur : La conception de l’ASIC se fait en utilisant un langage de description propre à ce genre d’application. Il en existe plusieurs tel que Verilog ou SystemC. Dans notre cas nous utiliserons le VHDL. library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; entity counter is port ( Rst, Load, En, Sens, Clk: in std_logic ; Din : in std_logic_vector(0 to 7); Dout : out std_logic_vector(0 to 7) ); end counter; architecture bah of counter is signal Aux : std_logic_vector(0 to 7); begin process (Rst, Clk) begin if Rst='0' then Aux <= "00000000"; elsif Clk'event and Clk='1' then if En = '1' then if Load = '1' then Aux <= Din; else if sens = '0' then Aux <= Aux+1; else Aux <= Aux-1; end if; end if; end if; end if; end process ; Dout <= Aux; end bah ; 2 - Simulation fonctionnelle : L’étape de simulation est nécessaire pour valider le code VHDL. Pour cela nous devons écrire un autre code pour tester le bon fonctionnement du compteur en lui envoyant des signaux logiques correspondant aux signaux d’entrées (Cf. figure N°1). library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; entity test_counter is end test_counter; architecture bench of test_counter is component counter is port( Rst, Load, En, Sens, Clk: in std_logic ; Din : in std_logic_vector(0 to 7); Dout : out std_logic_vector(0 to 7) ); end component; for all : counter use entity work.counter(bah); signal Rst_T, Load_T, En_T, Sens_T: std_logic ; signal Clk_T : std_logic :='0'; signal Din_T : std_logic_vector(0 to 7); signal Dout_T : std_logic_vector(0 to 7); begin count: counter port map (Rst_T, Load_T, En_T, Sens_T, Clk_T, Din_T, Dout_T); Clk_T <= not Clk_T after 50 ns ; Rst_T <= '0','1' after 80 ns ; En_T <= '1','0' after 1200 ns; Din_T <= "00000000","10000000" after 90 ns ; Load_T <= '0','1' after 200 ns, '0' after 300 ns; Sens_T <= '0','1' after 500 ns; end bench ; Cependant, une simulation réussit ne signifie pas forcement que le code est synthétisable et ne garantie encore mois le bon fonctionnement l’ASIC. D’autres considérations sont à prendre compte tels que les chemins critiques, la fréquence minimum de fonctionnement… Nous verrons ces points après chacun en détail. Pour tester le bon fonctionnement du compteur nous avons intégré le code counter.vhd et son fichier teste dans la plateforme nclaunch de Cadence. Apres compilation nous lançons finalement la simulation pour obtenir le résultat suivant : Figure N°2 : Simulation fonctionnelle La simulation étant satisfaisante nous pouvons passer à l’étape de synthèse logique. 3 - Synthèse logique Une fois que le code a été simulé et qu’on a bien testé le bon respect du cahier des charges, on passe à l’étape de synthèse. Cette étape consiste à produire à partir du code VHDL un circuit électronique constitué de sous éléments basics tels que des portes logiques et des bascules récupérés à partir d’une Library d’un fondeur de semi-conducteur. La synthèse permet aussi de voire si le code VHDL tapé lors de la toute première étape est cohérent. On peut ainsi vérifier par exemple que le nombre de bascules est acceptable ou dans le cas contraire, revenir au code et modifier les parties responsable de l’anomalie. Logique combinatoire R E G I S T E Logique combinatoire R E G I S T E R E G I S T E Figure N°3 : Représentation des différents niveaux d’un circuit synchrone La synthèse se fait à l’aide l’outil Design Analyser de Cadence qui permet de réaliser automatiquement le circuit à partir de la description comportementale. L’outil offre plusieurs niveaux d’abstraction, du simple schéma bloc au circuit électronique. Figure N°4 : Vision block du compteur 8 bits En descendant au niveau électronique nous obtenons le circuit suivant : Figure N°5 : Le schéma électrique du compteur 8 bits 3- 1 Optimisation du circuit Afin de pousser aux limites notre circuit, il est possible d’opérer une étape d’optimiser lors de la synthèse afin d’obtenir une baisse de consommation et une fréquence de fonctionnement plus rapide. Il est cependant très difficile d’obtenir les deux car l’augmentation de la fréquence de commutation induit forcement une augmentation de la consommation. La plupart du temps un compromis et trouvé. Dans notre cas nous nous intéresserons qu’à l’optimisation en fréquence. Pour ce faire, le logiciel tentera de trouver les chemins critiques (les chemins les plus longs entre deux niveaux de registre) et de les réduire. Cette dernière se fait de façon incrémentale de sorte à ce qu’au final il n’y est plus de retard sur les parties combinatoires. Période 5ns 3ns 2ns Nombre de cellules 60 72 Consommation 2.5mW 3.6mW Design impossible Design impossible Tableau N°1 : Récapitulatif des résultats obtenus dans le journal de synthèse Le résultat obtenu doit cependant être regardé de manière critique, même si dans l’apparence le circuit parait fonctionner à la fréquence optimal, il est possible que la commutation des bits au niveau des registres ne se fasse pas de façon synchrone. Cette anomalie peut être occasionnée : Une mauvaise répartition de l’arbre d’horloge due aux divers délais de propagation Une optimisation trop excessive des chemins combinatoire entre deux niveaux mémoire On verra qu’au final il peut y avoir d’autres origines au problème autres que l’optimisation en elle même. A la fin de cette étape nous remarquons que le circuit électronique a changé. En effet l’outil d’optimisation en réduisant les chemins critique a changé la configuration des bascules et portes logiques représentés figure N°5. On obtient ainsi un nouveau circuit : Figure N°5 : Le circuit du compteur après optimisation Remarquez que le circuit est organisé en plusieurs niveaux hiérarchiques tels que l’additionneur ou le soustracteur non définit au niveau RTL et dont la présence se justifie par l’utilisation de librairies. Figure N°6 : Le circuit mise à plat après optimisation Il est cependant possible de mettre à plat le circuit à l’aide de la commende ungroup. Il devient ainsi possible de vérifier la cohérence entre le code VHDL et le circuit à proprement dit (Cf. figure N°6). Le teste le plus simple serait de calculer le nombre de bascules existante. Nous en comptant 8, ce qui correspond tout à fait à la nature du circuit. 4- Simulation après synthèse Le circuit étant réalisé, le logiciel sait à partir des données fournis dans la librairie AMS qu’elles sont les délais de propagation dans chaque porte logique. Le simulateur peut ainsi calculer les retards que vont subir les signaux en passant le circuit. Pour ce faire nous devons inclure le fichier contenant toutes ces données (.SDF) que nous avons sauvegardé après la fin de l’étape d’optimisation. A la fréquence maximale de fonctionnement (obtenu lors de l’étape d’optimisation) plusieurs problèmes apparaissent : Un retard de la commutation des états de sortis. Le comptage n’est donc pas tout à fait synchrone avec les tops d’horloge. Ceci est du aux délais de commutations des portes qui constituent le compteur. Des états aléatoires du comptage à chaque top d’horloge. Ceci n’est pas critique car le circuit fonctionne en logique synchrone. 5- Placement & routage : La simulation après synthèse a permis de valider le bon fonctionnement de notre circuit. Nous pouvons donc passer à l’étape de placement routage. Cette étape consiste à passer de la vision abstraite du circuit à la version silicium. Pour cela nous utiliserons la librairie de design kit AMS3.6 qui assure une technologie de 0.35µm à 4 niveaux de métal. Cette étape est très critique car il existe un certain nombre de règles à respecter pour assurer le bon fonctionnement du circuit. La première d’entre elle est d’assurer une bonne répartition des alimentations à tout le circuit. Pour cela on commence par dimensionner la surface de la puce pour laisser assez d’espace aux annaux d’alimentations plus le circuit (Floorplan à 1 et core d’utilisation à 85%). Pour assurer la bonne répartition des courants dans le circuit d’alimentation nous assurons une largeur de piste de 4µm à 20µ du bord de la puce. Pour des raisons de CEM (Compatibilité Electromagnétique) nous placerons respectivement une piste d’alimentation et une piste de masse sur toute la surface de la puce (Cf. figure N°7). On place ensuite les cellules électriques (standard cells) dont les layouts sont contenus dans le fichier .LEF Figure N°7 : La puce en vision abstraite avec son circuit d’alimentation L’étape suivante consiste à designer l’arbre d’horloge pour distribuer le clock à toutes les cellules histoire de minimiser les retards et les désynchronisations. Cette étape est très critique et assez complexe, car il faut distribuer le signal d’horloge tout en minimisant la longueur des pistes pour minimiser les effets RC liées à la techno et a la topologie du layout. Nous nous contenterons donc de visualiser l’arbre d’horloge qui a été généré automatiquement (Cf. Figure N°8). L’étape suivante consiste à router les différentes interconnexions reliant les cellules entres elles sur les différentes couches de métal. Heureusement le routage se fait automatiquement (Cf. Figure N°9). Figure N°8 : L’arbre d’horloge ici représenté en rouge. Les Pins d’entrée sortie Figure N°9 : La puce avec ses interconnexions Maintenant que toutes les étapes principales du routage ont été effectués nous pouvons « zoomer » sur la puce au niveau transistor pour vérifier l’intégrité de la puce. Figure N°10 : La puce avec ses différents niveaux de dopages Remarquez la présence de nombreuses erreurs entourées par des carrés blancs. Ces erreurs sont indiquées par le DRC (design rules check). Elles sont dues au non respect du design rule (règles de routages liés à la technologie utilisée). Dans notre cas on ne respecte pas la distance minimale entre deux niveaux dopé (N-well). Pour corrigé cela nous utilisons un fichier script qui va fusionner tout les N-Well adjacents entre eux pour n’en former qu’un seul. Nous obtenons ainsi la figure N°12. SiO2 Poly Si N-well Erreur de type spacing Figure N°12 : Erreur de type Spacing Figure N°11 : La puce avec ses différents niveaux de dopages sans erreurs de DRC 6- Simulation après Placement et Routage – Backannotation Cette étape est l’étape de validation finale, elle permet de vérifier que le layout final est bien fonctionnel et qu’il est conforme aux attentes du cahier des charges. Cette étape consiste l’ultime étape de vérification avant l’étape de réalisation. Malheureusement nous n’avons pu tester notre circuit car le logiciel retournait une erreur du type : incohérence entre fichier SDF et fichier VHDL. Conclusion Durant ce TP nous avons suivie le flot de conception d’un circuit ASIC avec tout se que cela a impliqué comme optimisation en fréquence ou en consommation. Nous avons aussi constaté la corrélation qui existe entre la technologie utilisée et le code VHDL sur les performances souhaités. De se fait nous avons pu nous familiarisé avec un outil de conception et de simulation puissant qu’est Cadence.