Tutorial: Synthèse logique et vérification avec - Enseirb

Transcription

Tutorial: Synthèse logique et vérification avec - Enseirb
Tutorial: Synthèse logique et vérification avec
Design Compiler et ModelSim
Camille Leroux
1
Introduction
Ce tutorial a pour objectif l’apprentissage des outils de conception Design Compiler (Synopsys) et ModelSim SE (Mentor Graphics) dédiés à la conception et à
la simulation d’ASICs numériques.
Le logiciel Design Compiler permet la synthèse logique grâce aux outils design_vision
(en mode graphique) et dc_shell (en mode ligne de commande).
Le logiciel ModelSim SE permet la simulation temporelle d’un circuit au niveau
comportemental ou au niveau porte, à partir des langages VHDL ou Verilog.
D’autres outils équivalents existent mais ces deux outils font références dans l’industrie des circuits integrés numériques.
Le tutorial va vous permettre, dans un premier temps, d’appréhender ces outils en
présentant leurs principales composantes. Ensuite, nous nous appuierons sur un
exemple concret : la synthèse logique et la vérification d’un compteur 6 bits.
2
Flot de conception/vérification Design Compiler + Modesim
L’outil Design Compiler (DC) fait la traduction d’une description VHDL en un
réseau de portes logiques (netlist) : c’est ce que l’on appelle la synthèse logique.
Les portes logiques utilisées dans la netlist sont habituellement fournies par un
fondeur de circuit (AMS, ST Microelectronics, Intel, Samsung, etc...) sous forme
de librairie : c’est ce que l’on appelle la Librairie de Cellules Standard ou bien le
Design Kit.
La Figure 1 représente les principales étapes du flot de conception ASIC avec l’outil
Design Compiler (pour la synthèse logique) et Modelsim (pour la vérification). La
librairie de cellules standards que nous allons utiliser est une librairie AMS 0.35µm.
analyze : Cette première étape charge le ou les fichier(s) vhdl à lire et effectue
une vérification synthaxique du fichier d’entrée (counter.vhdl). L’outil vérifie non1
Figure 1 – Flot de conception
seulement les erreurs de synthaxes mais il s’assure également que le VHDL est
synthetisable.
elaborate : Cette phase correspond à une traduction du VHDL comportemental en une version structurelle du design. Les portes logiques constituants la
netlist générée sont génériques (GTECH) indépendantes de la technologie. Durant cette étape l’outil réalise déjà un certain nombre d’optimisations. A l’issue de
cette étape, il est possible de sauvegarder le design dans un format propre à l’outil
(*.ddc).
compile : Il s’agit de l’étape de synthèse logique à proprement parlé. L’outil
traduit la netlist générique en une netlist constituée des cellules de la librairie standard. L’outil effectue un grand nombre d’optimisations combinatoires pour pouvoir
respecter les contraintes imposées par l’utilisateur dans le fichier de contraintes
(contrainte.tcl). Lors de cette étape, il est également possible de demander à
l’outil de faire plus ou moins d’optimisations. Plus les optimisations sont poussées,
plus le temps de synthèse est long. A l’issue de cette étape là, il est possible de
sauvegarder le design (*.ddc), de générer la netlist au format vhdl et de générer
un fichier d’annotations temporelles (*.sdf). Ces deux derniers seront utilisés pour
l’étape de vérification post-synthèse dans l’outil ModelSim.
report : A l’issue de la synthèse logique, il est possible de générer tout un tas
de rapports de synthèses qui permettent de quantifier les performances du circuit
2
généré (fréquence max, analyse du chemin critique, consommation de puissance,
surface,...).
vsim : C’est le processus de vérification post-synthèse dans lequel le concepteur vérifie que la netlist générée par l’outil a bien un comportement strictement
équivalent à la description VHDL comportementale d’entrée. Les simulations sont
faites avec l’outil ModelSim
Dans ce TP nous allons appliqué ce flot de conception à un compteur binaire 6
bits.
3
3.1
Préparation de l’espace de travail
Mise en place de l’environnement
Récupérez le fichier tuto_synopsys.tar.gz se trouvant à l’adresse :
cleroux.vvv.enseirb-matmeca.fr/EN219/TP/.
— Créez un répertoire tuto_synopsys/,
— Copiez y le fichier tuto_synopsys.tar.gz et décompressez le avec la commande tar -zxvf tuto_synopsys.tar.gz.
3.2
Paramétrage des fichiers de configuration de Design Compiler
Avant de faire des synthèses logiques il est nécessaire de dire à l’outil où se trouve
la librairie standard. Les chemins des librairies standards sont spécifiés dans un
script ./scripts/synopsys_dc.setup.
Le design kit que nous utilisons est fourni par la société AMS. Il s’agit d’une
technologie CMOS avec une caractéristique de 0.35µm.
Ouvrez et examinez le fichier de configuration synopsys_dc.setup.
Déduisez-en les caractéristiques de la librairie standard utilisée.
Quelles autres librairies avons-nous à disposition ? Pourquoi avoir
plusieurs librairies ?
4
Structuration du répertoire de travail
De manière générale l’utilisation d’outils de conception implique la manipulation d’un grand nombre de fichiers (crées par l’utilisateur ou bien générés par
l’outil). Pour s’y retrouver, il est donc primordial de définir une structure de répertoire de travail qui permette de s’y retrouver facilement. Voici la structure de
répertoire que vous devrez utiliser :
3
— ./db : pour mettre vos netlist au format .ddc
— ./scripts : pour mettre vos scripts de synthèse
— ./sim : pour mettre tous les fichiers liés à la simulation dans modelsim (avant
et après synthèse) : test benches vhdl, netlist, fichiers .sdf, ...
— ./source : pour mettre vos fichiers source à synthétiser (.vhdl)
— ./work : contient les fichiers générés par DC. Ce repertoire est crée par
l’outil, nul besoin de le créer vous-même.
— ./report : pour mettre les rapports de synthèse contenant les informations
de timing, surface, conso de puissance, etc...
Remarque : DC n’utilise comme point d’entrée que des fichiers de type VHDL
(ou Verilog). Il n’existe pas de méthode de saisie graphique pour décrire un système
numérique. Les netlists issues de la synthèse logique peuvent etre exportées sous
différents formats : VHDL, Verilog, edif, ddc, ...
5
Synthèse logique
Ce tutorial s’appuie sur l’exemple d’un compteur 6 bits dont nous allons réaliser
l’analyse complète en détaillant toutes les étapes de la synthèse logique et de la
vérification.
5.1
Lancement de l’outil
IMPORTANT : Placez vous toujours dans votre répertoire de travail
($HOME/tuto_synopsys/counter) AVANT de lancer Design Compiler.
Il existe deux manières d’utiliser l’outil de synthèse :
— la première consiste en l’emploi d’une interface en mode ligne de commande.
Pour cela on utilise la commande : dc_shell qui lance l’environnement (apparition du prompt dc_shell dans le terminal) ;
— la deuxième consiste en l’emploi d’une interface graphique. La commande :
design_vision permet de lancer l’environnement graphique. La fenêtre
Design Vision apparaît alors à l’écran.
Pour les premières utilisations, il est conseillé d’utiliser l’interface graphique qui
est nettement plus conviviale que l’interface en mode ligne de commande. Toutes
les commandes de dc_shell peuvent être lues au fur et à mesure de leur exécution dans la fenêtre Log en bas de l’écran. Il est également possible d’écrire
des commandes de Design Compiler (dc_shell) dans la ligne design_vision>
sous la fenêtre Log. Dans la suite de ce tutorial, nous utiliserons l’interface graphique Design_vision mais nous entrerons également des commandes dans la
ligne design_vision>. Avec un peu d’experience, vous verrez qu’il devient vite
4
fastidieux d’utiliser l’interface graphique. Beaucoup de tâches peuvent être automatisées avec des scripts. Les scripts présentent également l’avantage de pouvoir
reproduire des résultats de synthèse à l’identique.
5.2
Fichier VHDL à synthétiser
Vous devez réaliser la synthèse logique d’un compteur 6 bits. Le point d’entrée de
l’outil est un fichier VHDL. Ce fichier (counter.vhdl) se trouve dans le répertoire
source de votre répertoire de travail.
ATTENTION : Tout VHDL n’est pas synthétisable ! Seul un sous-ensemble de
VHDL est synthétisable.
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity counter is
port( rst : in std_logic;
clk : in std_logic;
enable : in std_logic;
value : out std_logic_vector(5 downto 0));
end counter;
architecture RTL of counter is
signal bit_counter: std_logic_vector(5 downto 0);
begin
data_counter_proc : process(rst, clk)
begin
if(rst= ’1’) then
bit_counter <= (others =>’0’);
elsif(clk’event and clk = ’1’) then
if(enable = ’1’) then
bit_counter <= bit_counter + 1;
end if;
end if;
end process;
5
value <= bit_counter;
end RTL;
5.3
Chargement et analyse d’un fichier VHDL dans Design Vision
Placer vous à la racine de votre projet :
cd $HOME/tuto_synopsys/counter .
Lancer l’outil :
design_vision .
La première chose à faire est de donner les informations sur la librairie standard à
utiliser. Pour cela, il faut exécuter le script ./scripts/synopsys_dc.setup. Dans
l’invite de commande dc_shell, tapez : source ./scripts/synopsys_dc.setup .
On peut alors lancer la phase d’analyse du fichier .vhd : Dans l’interface graphique
faire File > Analyze > Add, puis sélectionnez le fichier ./source/counter.vhdl,
spécifier le format VHDL, la librairie WORK et cliquez sur OK.
L’outil vérifie la synthaxe du ou des fichiers VHDL et crée un certain nombre de
fichiers intermédiaires dans le répertoire ./work.
La commande dc_shell équivalente est :
analyze -f vhdl counter.vhdl
IMPORTANT : Après chaque commande il est primordial de vérifier qu’aucune
erreur n’a été détectée dans l’onglet de Log. Vous pouvez retrouver l’historique des
commandes dans l’onglet history.
5.4
Phase d’élaboration du modèle VHDL (synthèse logique technoindépendante)
La phase d’élaboration correspond à une synthèse logique indépendante de la
technologie utilisée, il s’agit de générer une vue RTL du design à partir de sa
description VHDL.
Pour lancer la phase d’élaboration : File > Elaborate. Choisissez le circuit à
synthétiser dans la bibliothèque de travail WORK, si vous utilisez une entité generic,
précisez la valeur des variables générique, puis lancez l’élaboration (OK). Vérifiez
qu’aucune erreur n’est détectée pendant cette phase. Le schéma correspondant
peut être alors visualisé : Schematic > New Schematic view
La commande dc_shell équivalente est :
elaborate counter -arch "RTL" -lib WORK -update
6
5.5
Sauvegarde d’un résultat de synthèse
Après l’élaboration, le résultat obtenu peut être sauvegardé afin d’être utilisé
sur plusieurs cibles technologiques ou dans le but d’être optimisé suivant différents
critères (vitesse, surface, conso,...). Pour sauvegarder votre design :File > Save
As, nommez le counter_elab et choisissez le format .ddc et placer le fichier dans
le répertoire ./db. Le format .ddc est le format interne à Synopsys. La commande
dc_shell équivalente est :
write -format ddc -hierarchy -output "./db/counter_elab.ddc"
5.6
Mise en oeuvre des contraintes
Les contraintes sont des déclarations explicites qui définissent les objectifs à
atteindre pour le circuit considéré. L’outil propose de jouer sur les contraintes de
temps, de surface et de consommation de puissance. Par défaut, l’outil minimise
la surface en respectant la contrainte de temps imposée.
Lors de la phase d’optimisation, DC utilise deux modèles de contraintes :
— les contraintes implicites, qui sont imposées par la bibliothèque technologique ;
— les contraintes d’optimisation (ou contraintes explicites) imposées par l’utilisateur.
Il existe trois manières de spécifier les contraintes : par ligne de commande, par
l’interface graphique ou bien directement dans le fichier VHDL. Nous utiliserons la
première méthode. Les contraintes sont réunies dans le fichier ./scripts/contrainte.tcl :
# Create user defined variables
set CLK_PORT [get_ports clk]
set CLK_PERIOD 4.00
set CLK_SKEW 0.0
set INPUT_DELAY 0.0
set OUTPUT_DELAY 0.0
set MAX_AREA 380000
# Time Budget
create_clock -period $CLK_PERIOD -name my_clock $CLK_PORT
set_dont_touch_network my_clock
set_clock_uncertainty $CLK_SKEW [get_clocks my_clock]
set_input_delay $INPUT_DELAY -max -clock my_clock [remove_from_collection [all_inpu
set_output_delay $OUTPUT_DELAY -max -clock my_clock [all_outputs]
7
# Area Constraint
set_max_area $MAX_AREA
Pour exécuter toutes les commandes contenues dans ce fichier, dans la ligne de
commande design_vision tapez :
source ./scripts/contrainte_counter.tcl
5.7
Compilation et optimisation du design (synthèse logique technodépendante)
Pour se rendre compte de l’importance de l’étape de synthèse il est nécessaire
d’observer les résultats de compilation avant optimisation (cf section sur l’élaboration). On applique maintenant l’étape d’optimisation pour la technologie ciblée :
Design > Compile Design. Ouvrez ensuite le nouveau schéma. On observe que
le design est maintenant un réseau de portes logiques de la bibliothèque AMS.
La commande dc_shell équivalente est :
compile
Après avoir vérifier qu’aucune erreur n’est détectée par l’outil, nous allons sauvegarder le résultat de synthèse en vue d’une simulation du design synthétisé au
niveau porte.
Exécuter les commandes suivantes dans la ligne de commande design_vision :
— write_sdf ./sim/source/counter_syn.sdf permet d’écrire dans un fichier les temps de propagations à travers chaque porte logique du design
synthétisé.
— write -format ddc -hierarchy -output "./db/counter_syn.ddc" permet de sauvegarder votre design au format .ddc.
— write -hierarchy -format vhdl -output ./sim/source/counter_syn.vhdl
permet de sauvegarder la netlist générée au format .vhdl. Nous utiliserons
cette netlist ainsi que le fichier .sdf pour la simulation post-synthèse dans
Modelsim.
Ouvrez et étudiez le fichier .sdf et le fichier .vhdl générés.
Lors de l’écriture du fichier sdf, un message de type Information
apparaît dans le Log. Que signifie ce message ? Sommes-nous dans le
cas suggéré ?
8
5.8
Caractéristique du circuit obtenu
Pour obtenir les caractéristiques temporelles du circuit, taper :
report_timing> ./report/counter.timing .
Pour obtenir les caractéristiques de surface du circuit, taper :
report_area> ./report/counter.area .
Pour obtenir les caractéristiques de conso. de puissance du circuit, taper :
report_power> ./report/counter.power .
Pour obtenir des infos sur les cellules standards instanciées dans le design,
taper :
report_cell> ./report/counter.cell
Pour obtenir des infos sur l’horloge :
report_clock> ./report/counter.clock
Pour obtenir un résumé des caractéristique du circuit généré :
report_qos> ./report/counter.qos
5.9
Script dc_shell
Les étapes décrites jusqu’ici sont très similaires d’un design à un autre. Il est
donc très commode d’utiliser des scripts qui permettent d’automatiser la synthèse logique et donc de gagner du temps ! Les étapes décrites dans ce tutorial
sont rassemblées dans deux scripts : ./scripts/run.tcl qui contient les commande de synthèse et de reporting et ./scripts/contrainte.tcl qui contient
les contraintes à appliquer à notre design : counter. Pour exécuter ce script, il
suffit de taper la commande :
source ./scripts/run.tcl
6
6.1
Simulation pré/post synthèse avec Modelsim
Pourquoi simuler ?
Modelsim est un outil de simulation de systèmes numériques développé par la
société MentorGraphics. C’est un outil très largement utilisé dans l’industrie.
9
Nous allons utiliser Modelsim pour simuler notre système avant synthèse (simulation comportementale) et après synthèse (simulation de la netlist générée par
DC).
La simulation post-synthèse permet d’une part de valider l’étape de synthèse
logique en s’assurant que la netlist générée par DC a bien le même comportement
que la description comportementale. D’autre part, Modelsim permet de simuler
notre système avec une contrainte de temps (fréquence d’horloge fixée) afin de
vérifier que notre système peut fonctionner avec la fréquence maximum annoncée
par DC.
6.2
Simulation pré-synthèse
Figure 2 – Simulation pré-synthèse
La simulation pré-synthèse permet de vérifier le fonctionnement de notre système, c’est à dire de s’assurer que le VHDL/Verilog que l’on a écrit permet bien
de faire ce que l’on souhaite (un comptage modulo 64).
L’invocation de l’outil modelsim se fait par la commande vsim. Une fois l’outil lancé, assurez-vous d’être dans le répertoire de simulation : File > Change
Directory et choisir le répertoire $HOME/tuto_synopsys/counter/sim. Notez que
le répertoire sim/ contient un sous répertoire source/ qui contiendra les différents
10
fichiers source nécessaire à la simulation.
Pour préparer la simulation du compteur au niveau comportemental (avant
synthèse) :
— Créez un nouveau projet que l’on nommera par example simu_counter dans
le répertoire sim/ : File > New > Project, puis :
Browse > $HOME/tuto_synopsys/counter/sim/
— Ajouter au projet le fichier VHDL contenant la description comportementale
du compteur :
Project > Add To Project > Existing File :
$HOME/tuto_synopsys/counter/source/counter.vhdl
— Ajouter également le test bench qui se trouve dans le répertoire sim/source
$HOME/tuto_synopsys/counter/sim/source/tb_counter.vhdl
— Compiler tous les fichiers : Compile > Compile All
Votre système est alors prêt à être simulé. Pour lancer la simulation :
— Ouvrir la fenêtre de simulation : Simulate > Start Simulation
— Dans l’onglet Design, sélectionner l’architecture behavior du test bench
— Cliquez sur OK, la simulation se lance
— Faites glisser les signaux que vous souhaitez visualiser dans l’onglet wave.
— Dans l’invite de commande de modelsim, tapez : restart, puis run 1us.
Vous pouvez vérifier que la sortie value du compteur correspond bien à un comptage modulo sur 6 bits.
6.3
Simulation post-synthèse
Figure 3 – Simulation post-synthèse
Pour faire une simulation post-synthèse dans Modelsim, nous avons besoin de
quatre éléments :
11
1. Un test bench (tb_counter.vhdl). Celui-ci se trouve déjà dans le projet.
2. Une netlist de notre circuit générée par Design Compiler utilisant les portes
logiques de la librairie AMS : counter_syn.vhdl
3. Une description fonctionnelle des portes logiques de la librairie AMS : fichiers vhdl ou verilog se trouvant dans le répertoire ./sim/source/libs_ams
(c35_CORELIB.v et c35_UDP.v)
4. Les temps de propagation de toutes les portes logiques contenues dans notre
netlist estimés par Design Compiler : fichier counter_syn.sdf
Ajout de la netlist :
— Enlevez la description comportementale du compteur : dans l’onglet Project,
clique droit sur counter.vhdl puis Remove from Project
— Ajouter la description au niveau porte : Project > Add to Project > Existing
File > $HOME/synopsys/counter/sim/source/counter_syn.vhdl
Compilation de la librairie :
— Créez une bibliothèque : Dans l’invite de commande, tapez :
vlib c35_corelib .
Une bibliothèque est normalement créee dans l’onglet Library et un répertoire c35_corelib est crée dans $HOME/synopsys/counter/sim/.
— Compilez les fichiers verilog dans la librairie c35_corelib : tapez
vlog -work c35_corelib ./source/libs_ams/c35_CORELIB.v , puis
vlog -work c35_corelib ./source/libs_ams/c35_UDP.v
Compilation et simulation du design avec les timings Nous allons maintenant simuler le compteur en incluant les annotations temporelles calculées pendant la synthèse logique (counter_syn.sdf) :
— Compilez : Compile > Compile All
— Ouvrez la fenêtre de simulation : Simulation > Start Simulation
— Dans l’onglet SDF, chargez le fichier d’annotations temporelles à appliquer
au composant à tester (/tb_counter/uut) :
— Browse > counter_syn.sdf
— Apply to Region > tb_counter/uut (on applique les temps spécifiés
dans le fichier .sdf uniquement au counter se trouvant dans le test
bench)
— Sélectionnez les temps de propagation min : Delay > max
— Dans l’onglet Librairies rajouter la librairie que vous venez de compiler :
c35_corelib
12
— Dans l’onglet Design, sélectionnez une résolution en ns, décochez la case
enable optimization et lancez la simulation du testbench
Le compteur fonctionne t-il correctement ?
7
Annexe
Voici une liste non exhaustive des fichiers utilisés dans design compiler :
— Extension des fichiers sources
— les fichiers .v sont des fichiers source en langage Verilog
— les fichiers .vhd/.vhdl sont des fichiers source en langage VHDL
— les fichiers .edif sont des fichiers source au format EDIF
— Extension des fichiers de synthèse et de script
— les fichiers .sdf (standard delay format) sont des fichiers contenant les
temps de propagations extraits après synthèse
— les fichiers .scr/.sh/.tcl sont des fichiers script
— Extension des fichiers de rapport de compilation et de login
— les fichiers .log sont des fichiers contenant toutes les commandes et alias de
l’application. Fichier très utile pour tracer les erreurs lors de la synthèse.
— les fichiers .db/.ddc sont répertoriés dans la base de données du logiciel.
C’est également l’extension par défaut de DDC.
13