Version 1.1 du 21 août 1997
Ce tutorial vous permettra de prendre en main les outils suivants :
Afin d'utiliser les diffÈrents outils de COMPASS nous allons
rÈaliser un jeu permettant d'apprendre compter.
La description du jeu est donnÈe en annexe, il n'est pas
nÈcessaire de la lire avant de commencer le tutorial. Les
blocs seront synthÈtisÈs par les diffÈrents
outils de compass, puis simulés.
Copiez tous les fichiers du rÈpertoire /usr/local/exemples/compass-tutorial/ sous le répertoire $HOME/compass prÈalablement crÈÈ. Ce rÈpertoire contient alors certains fichiers du tutorial et le fichier de configuration compass.boo qui contient les informations nécessaires à la gestion de Compass (répertoire de travail, librairies technologiques, clés, fenêtres,...).
Compass gère les fichiers de manière non structurée.
Il place dans le répertoire de lancement tous les fichiers
de la librairie associé à ce répertoire.
VÈrifier que le .cshrc ne contient pas une commande
cd et
placez vous dans le répertoire $HOME/compass avant
d'exécuter Compass.
Compass peut être lancé dans deux modes différents :
Mode graphique : compass
Mode textuel : compass -shell
Nous utiliserons pour le tutorial le mode graphique qui nécessite l'environnement XWindows. Le mode textuel est équivalent à l'ouverture d'un terminal! dans l'environnement graphique. Ce mode contient une commande très pratique : ? ou help qui donne la liste des commandes utilisables.
Une Aide on-line est disponible par la commande iview
-comp ou compass -help.
L'outil Compass ouvre une fenêtre StatusWindow qui vous
donne accËs tous les outils de Compass. Le milieu
de l'écran montre le chemin d'accès (Search Path)
aux différentes librairies dans lequel il cherchera les
instances à placer et à utiliser. Il s'agit ici
de la technologie 0.7 µm du fondeur ES2 ou des librairies
FPGA Altera Flex8K ou Xilinx XC4K.
Le menu applications de cette fenÍtre donne accËs aux différents outils graphiques :
Tous les fichiers sont comme des cellules possédant un nom et un type (schéma, netlist, layout,...). Le type de la cellule est en fait l'extension du fichier unix (adder.la <=> [la]adder).
[la] Schéma Logic Assistant
[nls] Netlist de schéma
[nle] Netlist extraite après placement routage
[sim] Fichier de simulation logique
[ly] Layout physique
[pst] Estimation des capacités par floorplan
[cmd] Fichier de simulation temporelle
[trc] Fichier rÈsultant de la simulation logique
[lis] Chemin critique
[lg] Informations sur la netlist
Toutes ces cellules sont stockées dans des librairies.
La librairie utilisateur contient les fichiers du design courant.
La librairie portable est indépendante de la technologie
utilisée et contient toutes les cellules de base pour un
design. Il existe d'autres librairies portables pour l'utilisation
des fonctions spéciales VHDL, StateMachines, DataPath,
etc. Les librairies technologiques dépendent du type de
composant utilisé (Standard Cells, Gate Array) et sont
utilisées pour obtenir les informations nécessaires
à la simulation et au layout.
Le search path est une liste ordonnée de librairies dans lequel Compass recherche les cellules. Il peut être édité mais doit normalement contenir :
librairie de travail : il s'agit de votre répertoire $HOME/compass
la librairie Portable (portabler1)
une librairie technologique (e.g. cb80hd230d, cb80hb230d)
la librairie des PAD (plots d'ES) du circuit (cb80io230d)
la librairie des RAM et ROM statiques et dynamiques
(e.g. cb80rs210d, cb80ra210d, cb80ro210d)
les librairies des différents compilateurs utilisés lors du design (e.g. cb80dp230d ...)
la librairie miscellaneous cmosch00x
Les boutons de la souris sont définis comme suit :
Sélectionner logicAssistant dans le menu applications.
Plusieurs zones apparaissent dans la fenêtre logicAssistant :
La barre de menu
La barre d'icÙnes de commandes qui contient les fonctions de zoom ainsi que certaines commandes d'Èditions
La barre d'Ètat qui indique la position du curseur, les objets sÈlectionnÈs ainsi que la derniËre commande selectionnÈe
Nous allons créer le compteur/décompteur 4 bits
du projet servant de support au tutorial. Il pourra être
réalisé soit en utilisant les différentes
méthodes de spécification de fonctions (datapath,
schéma à base de portes, machine d'états
graphique, VHDL). Nous allons ici le spÈcifier par un schÈma
base de porte logiques élémentaires issues
de la bibliothèque de standard cells.
Ouvrez une session logic assistant.
Placement d'une cellule :
Placer ensuite 2 mux 2-to-1 [la]mx21d1 et 2 portes and [la]an02d1
Déplacement et effacement d'une cellule
Choisissez move dans le pop-up (BD). Cliquez BG sur la
cellule à déplacer, une croix apparaît. Cliquez
do-it (BM) à l'endroit ou vous voulez placer la cellule.
La commande delete est d'une utilisation identique
Connexions
La commande wire est utilisée en combinaison avec les boutons mark et do-it. BG permet de placer le début de la connexion et BM fixe la fin du dessin du fil.
Utilisez undo et redo pour annuler ou renouveler les dernières commandes.
Un noeud peut être nommé par la commande change.
Créez la figure suivante puis save all! sous
le nom udctr.
On utilisera ce bloc élémentaire pour créer
le compteur grâce aux commandes copy et paste
du menu edit. Pour cela sélectionnez copy,
puis sélectionner un zone autour du schéma avec
BG. On choisira ensuite le point de copie en cliquant sur BM.
Ce point de copie correspond à la croix qui servira de
référence à la commande paste. Sélectionnez
ensuite paste puis cliquez sur BG pour faire apparaître
un nouvel ensemble de cellules. La commande cut et paste
est le seul moyen de déplacer un bloc.
Connecteurs d'E/S
Pour ajouter un connecteur utilisez la commande connector
(BD) et cliquez sur l'extrÈmitÈ du fil avec
BG. Entrez le nom du connecteur ainsi que son type ( Input, Output,
.... ). Il est possible de changer le nom du connecteur avec la
commande change.
Bus et breakout
Nous allons ajouter un bus Q de sortie au schéma.
1 - Nommer les noeud un un : Q[0], Q[1].... Q[3].
2 - Ou utiliser busname (commands -> bus -> busname) : Cliquez sur le fil reliÈ au MSB du bus avec BG, entrez Q[3:0] dans la boite de dialogue, ce fil est automatiquement nommÈ Q[3]. Cliquez (BG) ensuite sur les autres signaux jusqu'au LSB.
Compléter le schéma du compteur en respectant le nom des connecteurs et sauvegardez le!
Edition de l'icône
La commande file -> new suivie d'un place instance de [la]udctr crée un symbole par défaut du compteur 4 bits. commands -> edit icon permet de changer ce symbole en cliquant dessus. Pour une sauvegarde du symbole utilisez subcell -> save.
Il existe des commandes permettant d'améliorer le dessin de l'icône : line, circle, fill, etc.
Il est inutile de sauver ce nouveau schéma car il correspond à un placement du compteur dans un schéma de hiérarchie supérieure. Il est possible de visualiser un schÈma de niveau infÈrieur du compteur avec subcell -> push. |
|
On utilise pour cela le screener qui vérifie une netlist portable issue d'un schéma ou d'une synthèse. Pour créer, si elle n'existe pas, cette netlist [nls]udctr il faut exécuter la commande file ->output -> netlist! de logic assistant après avoir charger le schéma [la]udctr.
On ouvre ensuite une session terminal (menu applications de la statusWindow) afin de faire apparaître une fenÍtre shell avec le prompt COMPASS>. Tapez utility screen pour invoquer le programme.
open [nls]udctr
screen
Pour visualiser les erreurs éventuelles ouvrez une fenêtre
TextEditor (menu applications)
puis open [scr]udctr. Corrigez les erreurs du schéma
(les erreurs concernant les "primary signals should go thru
I/O buffers" sont normales à ce niveau de hiérarchie).
Le screener permet également d'obtenir des informations (taille, nombre de portes, consommation, etc.) sur n'importe quelle netlist Compass [nls]xxxx. On pourra l'utiliser par exemple pour vérifier la cohérence de la netlist du circuit complet.
On utilise pour cela l'outil ChipTime qui permet une analyse statique temporelle des systèmes synchrones. Il vérifie les violations de setup/hold, donne le chemin critique du circuit ou le temps de n'importe quel chemin, et indique les éventuels décalage d'horloge (skew).
Ouvrez une session terminal et tapez ChipTime pour
invoquer le programme.
open [nls]udctr # chargement de la netlist
set clock clk -period 100 # dÈfinition de clk ( pÈriode = 100ns)
set omitpath -thru rstb # Èvite de trouver le chemin critique
#sur le reset asynchrone
report skew # fournit le skew dans le pire des cas
report path # recherche le chemin le plus critique et l'affiche
report timing -allPaths
Toutes les commandes exécutées dans un shell peuvent Ítre regroupées dans un fichier [cmd] et chargées dans l'outil par la commande open (le fichier [cmd]udctr pour l'analyse temporelle du compteur vous est fourni).
On utilise l'outil QSIM qui permet une analyse dynamique temporelle.
Ouvrez une session terminal et invoquez QSIM. Les commandes
de simulation sont regroupées dans un fichier [sim] et
chargées dans le simulateur par la commande open
(le fichier [sim]udctr - voir ci-dessous - pour la simulation
de [nls]udctr vous est fournit). AprËs chaque lancement de
simulation, il est conseillÈ d'utiliser la commande quit
qui permet de fermer tous les fichiers ouverts lors de la simulation.
load [nls]udctr # chargement de la netlist Compass a simuler
watch (display) clk rstb ud # definition de la liste des E/S
watch (display) ceb Q # a visualiser
set radix 16 Q # Q : affichÈ en hexadÈcimal
output sim_udctr # ouvre le fichier [trc]compteur
# ( rÈsultat de la simulation, utilisable par PostSim
2)
trace (tabular) # static / dynamique / tabular : format
du fichier [trc]
wave udctr # creation de fichiers [wft] et [wfd] utilisable par
PostSim2
set clock clk 0(50) 1(50) # defintion de l'horloge a T=100ns
h rstb # positionne rstb a 1
h ud ceb
cycle # lance la simulation pour 1 cycle d'horloge
l rstb # positionne rstb a 1
cycle
h rstb
cycle 8 # lance la simulation pour 8 cycles d'horloge
l ceb
cycle 2
h ceb
cycle 2
l ud
cycle 5
l rstb
cycle
h rstb
cycle 5
Remarques:
Ouvrez l'outil PostSim2 (menu applications) puis faites un load du fichier [trc] pour visualiser graphiquement les résultats de simulation.
Les outils cell compiler et data-path compiler permettent
de définir des structures optimisées de layout sous
une autre forme que des cellules standard.
Le cell compiler permet de compiler des multiplieurs, ROM
et RAM optimisés sous forme de blocs durs directement implantables
dans le circuit. Un fichier [tpl] (template) est utilisé
pour générer une cellule paramétrée.
La compilation crée une cellule [pcl] (parameter cell).
Les compilations sont effectuées directement dans le logic
assistant par compile -> simulation, après avoir
paramétrée la cellule, par commands -> pcl
-> set.
Le data path (chemin de données) est une structure logique opérant sur une donnée multi-bits. Le problème sera décrit sur un seul bit, puis le compilateur étendra la description au nombre de bits désirés. Ce compilateur peut générer :
- soit un bloc dur de layout optimisé utilisable dans l'ASIC
- soit une netlist portable en standard cell ou gate array à
placer/router.
La hauteur du Data Path dépend du nombre de bits de la fonction à réaliser
La longueur du Data Path dépend du type et du nombre de blocs fonctionnels réalisant cette fonction
Dans une session logic assistant vous saisissez le schéma suivant en utilisant les symboles de la librairie data path ( place instance -> cb80dp230d -> logicAssistant ). Placez le cartouche TitleBlock, on peut changer la largeur du chemin de données en modifiant les attributs de ce cartouche par la commande attribute (menu Pop-Pup). Le schéma sera sauvé sous add_comp_dp_spec. Les latchs sont des D-flip-flop avec contrôle de chargement, iscorrect est un comparator -> all 0's detector et les horloges sont des Non-inverting Clock Buffer.
Ouvrez une nouvelle session logicAssitant (file -> new). Placez un [tpl] template for D.P. Compiler (librairie cb80dp230d), entrez dans la textBox le nom add_comp_dp_icon. Ensuite, une fenêtre pcl apparaît dans laquelle on fixe les paramètres et on relie ce symbole au data path ci dessus avec les options suivantes:
DP_specification :add_comp_dp_spec, Output_Test_Format : QSIM Layout_Option : Optimized Cela crée un icône (cf.. figure droite) et fait du nom choisi un fichier [la]add_comp_dp_icon que l'on pourra utiliser dans le schéma global du projet par la commande place. |
|
La compilation s'effectue par commands -> compile -> simulation. Si une erreur subsiste dans le schéma, le placement n'aura pas eu lieu.
Le fichier suivant représente la description comportementale
[vhd]compteur d'un compteur 4 bits. Le reset est asynchrone, tandis
que load et up/down sont synchrones. On se référera
au manuel Asic Synthesizer for VHDL Design pour les problèmes
de syntaxe.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library COMPASS_LIB;
use COMPASS_LIB.COMPASS.ALL;
entity compteur is
port ( reset : in Std_Logic;
clk : in Std_Logic;
up : in Std_Logic;
load : in Std_Logic;
val : in Std_Logic_Vector(3 downto 0);
count : buffer Std_Logic_Vector(3 downto 0) );
end compteur;
architecture comportementale of compteur is
begin
synchrone : process(reset,clk)
begin
if reset='1' then
count <= "0000";
elsif clk'event and clk='1' then
if load = '1' then
count <= val;
elsif up = '1' then
count <= count + "0001";
else
count <= count - "0001";
end if;
end if;
end process;
end comportementale ;
Dans une autre session logic assistant faire un place instance de [vhd]compteur, selectionnez ASIC Synthetiser.
Entrez dans la textBox le nom compteur_icon. Cela crée un icône (cf.. figure droite) et fait du nom choisi (compteur_icon) un fichier [la]compteur_icon que l'on pourra utiliser dans le schéma global du projet. La compilation s'effectue par commands -> compile -> simulation. Si une erreur subsiste dans le fichier VHDL, la compilation n'aura pas eu lieu, les messages d'erreurs se situant dans la zone de dialogue. |
|
Il est possible de visualiser la netlist compilée en générant le schéma [la]compteur_icon_p_mksc, grâce à la commande open [nls]compteur_icon_p de logicAssistant. On peut également analyser cette netlist (surface, temps) grâce aux outils utility screen et ChipTime, QSIM... (cf §4 , §5 et §6).
Si vous apportez des modifications au fichier [vhd] il suffit
de compiler l'icÙne pour mettre jour la netlist.
Le compteur 4 bits synthétisé est le suivant :
Il est aussi possible de compiler un fichier [vhd] partir d'une fenÍtre terminal. L'avantage est de pouvoir controler les options d'optimisation . Tapez ASICsyn pour invoquer le programme.
COMPASS> ASICsyn
COMPASSAsicSyn>
open [vhd]compteur charge un [pcl], [cmd], [nls] ou un [vhd] existant
synthesize synthËse : convertion du vhdl en Èquations logiques set options d'optimisations : tapez set ? pour l'aide.
optimize optimisation de la netlist sur la bibliothËque portable
write écriture de la netlist optimisée [nls]compteur_p
exit/quit sort de l'outil Asic Synthesizer et écriture du fichier [nls]compteur_p
Compass intègre la possibilité de compilation spécifique aux machines d'état. Une FSM (Finite State Machine), qu'elle soit de type Moore ou de type Mealy, peut être décrite :
- soit par un fichier VHDL en utilisant ASIC Synthetiser,
- soit par un diagramme d'état sous forme de dessin en
utilisant les macros de la librairie state diagram dans AsicSyn
( le fichier [la]machine vous est fourni).
Les actions d'un Ètat ainsi que les transitions sont dÈfinies
par la commande attribute. L'exemple
ci-dessous nous montre la fenÍtre attributes
de l'Ètat compte dont les actions sont enable=1 et updown=1.
Les autres sorties prendront leur valeur par dÈfaut.
|
|
Dans une autre session logic assistant, il faudra créer un [pcl] en plaçant [tpl] Logic Synthetiser template ( librairie AsicSyn ) dont le nom est celui de l'icÙne : machine_icon (cf.. figure droite). Ce template se trouve dans la librairie asicsyn.
Une fenêtre pcl apparaît dans laquelle on fixe le format de sortie : QSIM et on relie ce symbole au fichier [la] ci dessus (cell_name : [la]machine).
La compilation s'effectue par commands -> compile -> simulation. Si une erreur subsiste dans la spécification, le placement n'aura pas eu lieu.
Simulez la machine d'Ètat avec le fichier de simulation
[sim]machine.
On peut utiliser directement une description VHDL reprenant la
syntaxe suivante :
ENTITY machine IS
PORT(
clk : IN Std_Logic;
resetb : IN Std_Logic;
valid : IN Std_Logic;
cancel : IN Std_Logic;
correct : IN Std_Logic;
affich : OUT Std_Logic;
latcha : OUT Std_Logic;
latchb : OUT Std_Logic;
latchans : OUT Std_Logic;
enable : OUT Std_Logic;
updown : OUT Std_Logic
);
END machine;
ARCHITECTURE comportementale
OF machine IS
TYPE STATEtype IS
(repos, compte, affiche, effaceb, memob, memoans,
calcul, interb, effacea, memoa, intera, decompte);
SIGNAL currentState, nextState
: STATEtype;
BEGIN
synch : PROCESS(clk, resetb)
BEGIN
IF resetb = '0' THEN
currentState <= repos;
ELSIF Rising_Edge(clk) THEN
currentState <= nextState;
END IF;
END PROCESS;
comb : PROCESS(currentState, valid, cancel, correct)
BEGIN
CASE currentState IS
WHEN repos =>
affich <= '1';
latcha <= '0';
latchb <= '0';
latchans <= '0';
enable <= '0';
updown <= '0';
IF valid = '1' THEN
nextState <= memoa;
ELSE
nextState <= repos;
END IF;
WHEN memoa =>
affich <= '0';
latcha <= '1';
latchb <= '0';
latchans <= '0';
enable <= '0';
updown <= '0';
IF dvalid = '0' THEN
nextState <= intera;
ELSE
nextState <= memoa;
END IF;
WHEN compte => ...
WHEN effaceb => ...
WHEN memob => ...
WHEN memoans => ...
WHEN calcul => ...
WHEN interb => ...
WHEN effacea => ...
WHEN intera => ...
WHEN decompte =>
affich <= '0';
latcha <= '0';
latchb <= '0';
latchans <= '0';
enable <= '1';
updown <= '0';
nextState <= affiche;
WHEN OTHERS =>
affich <= 'X';
latcha <= 'X';
latchb <= 'X';
latchans <= 'X';
enable <= 'X';
updown <= 'X';
nextState <= currentState;
END CASE;
END PROCESS;
END comportementale;
Editez le schéma global du projet, puis effectuer la compilation
physique des blocs compilÈs (Datapath, Rom, ...). Placez
[vhd]comp_to_bin qui vous est fourni et compilez le.
Placez ensuite les plots d'entrée/sortie en utilisant la
bibliothèque portabler1->Logic Assistant->pads/input
buffers. Les noms des diffÈrents pads sont indiquÈs
sur le schÈma suivant :
Remarque : pour les bus, il faut modifier la cardinalitÈ
des Pads par la commande Change.
Sauvegarder ce schÈma sous le nom [la]toplevel. Il est
fortement recommandé de passer cette netlist au screener
(cf. chapitre 4), puis de la simuler pour avoir une référence
pour la simulation post-routage.
Ouvrir une session chipComp. Ensuite on fera un open
de [nls]toplevel.
FPR -> Create Floor Plan -> Physical FP : permet d'effectuer le plan de masse.
seeds->seeds external : permet d'imposer le brochage des pads (alimentation par ex.)
seeds->set net width : permet de fixer la largeur de métal de certains signaux (Vdd, Vss par ex.)
seeds->set net weight : permet de mettre un poids de routage sur certains signaux (clock par ex.)
compileChip : placement routage global : placement des cellules (PlaceCell, Place Improve), routage des cellules (RouteCell), routage complet (RouteBLock). Il est possible de paramËtrer chaque Ètape ( cf. aide ). Ces commande peuvent Ítre exÈcutÈes une une dans le menu FPR.
Setup -> View -> CellName : pour visualiser
le nom des cellules.
Pour cette étape de placement-routage, il est bien sur
vivement recommandé de consulter la documentation compass.
Le placement routage crée un fichier [doc] qui contient
les informations de surface. On notera qu'il arrive fréquemment
que l'outil génère des " unrouted ".
C'est à dire des noeud qu'il n'arrive pas à router
sur le layout. On est dans ce cas obligé de les router
à la main en utilisant l'outil compose. VÈrifier
dans le fichier [doc] que le nombre de " unrouted "
est 0.
Sauvegardez le circuit dans un format ly ( File-> Output ->Physical : cliquez sur les deux 'ly').
Il faut lancer un terminal , puis extract pour crÈer une netlist [nle].
input [ly]projet (ou [cp] ou [ly])
output [nle]projet nom de la netlist extraite
extract extraction de netlist
Les outils suivants de post-vérification sont DRC
qui permet de vérifier les dessins de masques avant l'envoi
en fonderie et netCompare qui effectue une comparaison
entre la [nls] et la [nle].
La post-simulation s'effectue comme une simulation classique
sous qsim dans laquelle on charge la [nle] à la
place de la [nls]. Attention seul l'accès aux pads est
possible! Il faut dÈclarer les vecteur dans le fichier
[sim] ( ex : vector data[4 :0] ).
Le but est de rÈaliser un jeu permettant d'apprendre compter. L'utilisateur entre tour tour un nombre A, un nombre B, et propose un nombre S, somme de A et B. Les nombres A et B sont non signÈs, codÈs sur 4 bits, tandis que S sera Èvidemment codÈ sur 5 bits. Un bouton VALID permet d'indiquer que la valeur est lire, un bouton CANCEL permet d'annuler le dernier chiffre (A et B) entrÈ.
AprËs que l'utilisateur est validÈ les 3 valeurs, le rÈsultat sera affichÈ. La machine allume alors une LED si la rÈponse est correcte et incrÈmentÈ un compteur de bonne rÈponse. Dans le cas contraire, le compteur est dÈcrÈmentÈ. Avant que la rÈponse S ne soit rentrÈe par l'utilisateur, les sortie pilotant la LED et l'afficheur du rÈsultat sont en haute impÈdance.
La sortie du compteur doit Ítre faite en binaire signÈ
(3 bits de donnÈe, 1 bit de signe). On dispose d'une horloge
rapide et d'un reset gÈnÈral asynchrone).