}}}
[[PageOutline]]
= 1 Préplacement des structures régulières =
Introduisez les étapes suivantes dans la méthode ''Layout'' du fichier ''mips_r3000_1m_core.py'' décrivant le coeur du mips :
* Placez le chemin de données aux coordonnées (0, 0) : fonction ''Place()''.
* Agrandissez la boite d'aboutement du coeur : fonction ''!ResizeAb()''. Cette étape est utile pour réserver la place nécessaire aux cellules de la partie contrôle qui seront placées de façon automatique par la suite. Vous pouvez par exemple dans un premier temps doubler sa hauteur et modifier votre choix une fois que vous aurez visualisé la partie contrôle placée.
* Placez les rails de rappels d'alimentation dans le coeur : fonctions ''!AlimVerticalRail()'' et ''!AlimHorizontalRail()''.
* Placez les connecteurs du coeur : fonction ''!AlimConnectors()''.
* Modifiez l'appel à la fonction ''Generate'' dans le chip de façon à générer la vue physique du coeur.
* Faites appel à la méthode ''View'' pour visualiser le résultat.
= 2 Placement du coeur et de la couronne de plots =
Introduisez les étapes suivantes dans la méthode ''Layout'' du fichier ''mips_r3000_1m_chip.py'' décrivant le mips :
* Définissez 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()''. Vous pouvez commencer par définir une boite d'aboutement de 8000 par 8000 et essayer ensuite de la réduire.
* Placez le coeur du circuit au centre de la boîte d'aboutement du chip : fonction ''!PlaceCentric()''.
* Définissez sur quelle face et dans quel ordre placer les plots, cela se fait à l'aide des 4 fonctions : ''!PadNorth()'', ''!PadSouth()'', ''!PadEast()'' et ''!PadWest()''. Les plots devront être placés en regard des cellules auxquelles ils sont connectés.
* Visualisez le résultat.
= 3 Routage des alimentations =
* Créez la grille d'alimentation : fonction ''!PowerRing()''.
* Visualisez le résultat.
= 4 Placement de la logique irrégulière =
C'est le placeur '''mistral''' de la chaîne '''Coriolis''' qui se charge de placer automatiquement les cellules non encore placées.
Il détecte quelles sont les cellules qui n'ont pas été placées et complète le placement en utilisant les zones "vides".
Dans votre cas, seules les cellules de la partie contrôle restent à placer.
* Appelez le placeur '''mistral''' : fonction ''!PlaceGlue ()''. 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 car l'outil de placement automatique place les cellules non placées en se basant sur les attirances vers les cellules déjà placées ET vers les plots.
* Une option existe pour la fonction de placement automatique qui permet d'obtenir un placement plus optimisé de la partie contrôle (algorithme plus optimisé et donc ... plut lent), il vous suffit de rajouter ''greedy = False'' lors de l'appel de la fonction ''!PlaceGlue()''.
* Visualisez le résultat.
* Effectuez le placement automatique de cellules de bourrage : fonction ''!FillCell()''.
* Visualisez le résultat.
= 5 Routage des signaux d'horloge =
* Construisez le réseau maillé correspondant au signal d'horloge interne : fonction ''!RouteCk()''.
* Visualisez le résultat.
= 6 Routage des signaux logiques =
Le routeur automatique de la chaîne '''Coriolis''' n'étant pas encore opérationnel, vous devez utiliser '''nero''', le routeur d' '''Alliance'''.
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 :
{{{
> nero -V mips_r3000_1m_chip mips_r3000_chip_r
}}}
* Les options -2, -3, -4, -5, -6 peuvent être utiles pour indiquer le nombre de couches d'alu utilisées pour le routage (-4 par défaut).
= 7 Validation =
* Validez le routage en utilisant les les outils '''druc''', '''cougar''' et '''lvx'''. L'appel à '''cougar''' effectue une extraction au niveau catalogue.
{{{
> druc mips_r3000_1m_chip_r
> export MBK_OUT_LO=al
> cougar -f mips_r3000_1m_chip_r
> lvx vst al mips_r3000_1m_chip mips_r3000_1m_chip_r -f
}}}
* Resimulez la netlist extraite avec '''asimut'''.
Précisez le format de la netlist dans la variable d'entrée '''MBK_IN_LO''' avant la simulation.
{{{
> export MBK_IN_LO=al
}}}
= 8 Analyse temporelle =
== 8.1 Extraction ==
Pour pouvoir utiliser '''TAS''', il vous faire faire une nouvelle extraction avec '''cougar''', cette fois si au niveau transistor (cette extraction vous permet également de connaitre le nombre de transistors de votre circuit). Cette extraction nécessite de cibler une technologie réelle, il faut donc initaliser la variable d'environnement '''RDS_TECHNO_NAME''' :
{{{
> export RDS_TECHNO_NAME=/users/soft/techno/labo/035/extract/prol035.rds
> export MBK_OUT_LO=al
> cougar -t mips_r3000_1m_chip_r mips_r3000_1m_chip_r_t
}}}
== 8.2 Chaines longues ==
'''TAS''' est un analyseur temporel.
Il permet d'obtenir les temps de propagation minimaux et maximaux entre les points de référence
(c'est à dire les '''connecteurs externes''' et les '''points mémorisants''') d'un circuit.
'''TAS''' travaille sans stimuli, c'est pourquoi il donne des délais '''pire-cas''' pour les chaînes longues.
L'environnement doit être correctement initialisé de façon à pouvoir utiliser '''TAS''' :
* Initialisez la variable d'environnement '''ELP_TECHNO_NAME''' :
{{{
export ELP_TECHNO_NAME=/users/soft/techno/labo/035/elp/prol035.elp
}}}
* Précisez le format d'entrée ('''.al''') dans la variable d'environnement MBK_IN_LO.
* Mettez en place l'environnement pour l'analyse de timing :
{{{
source avt_env.sh
}}}
* Il suffit ensuite de l'ancer l'outil '''TAS''' :
{{{
tas -t am2901_chip_r_t
}}}
* Consulter le man de '''TAS''' et essayer les différentes options pour comprendre le fonctionnement de '''TAS'''.
* Utiliser '''XTAS''' qui permet d'interpréter les résultats de '''TAS'''.
Disposant lui aussi d'un man, '''XTAS''' est agrémenté d'une aide en ligne.
{{{
xtas
}}}
'''XTAS vous permet de visualiser les chaines longues entre les points de référence du circuit et leur temps (entrées, registres, sorties).'''