Flot de conception VLSI/FPGA
ModelSim SE



Tutorial


ENSSAT - Université de Rennes 1

 


 

1. Introduction

Ce tutorial a pour objectif l'apprentissage de base du logiciel ModelSim SE dédiés à la conception d'ASIC et de FPGA.
Le logiciel ModelSim SE permet la simulation temporelle au niveau RT (transfert de registre) ou au niveau porte, à partir des langages VHDL ou Verilog.
Une aide en ligne des outils est disponible dans le help.

2. Simulation logique avec ModelSim SE de Mentor Graphics

2.1. Introduction et lancement des outils

L'invocation de l'outil de simulation se fait par le menu "démarrer/programmes".
Il faut ensuite cliquer sur "Create a Project" dans la fenêtre Welcome.
Ensuite choisissez un répertoire de travail sur votre disque, un nom de projet et laisser le nom de bibliothèque work.
Avant d'effectuer une simulation, il est nécessaire de créer plusieurs fichiers de test (testbench).

2.2. Création des fichiers

     Pour simuler un circuit, il faut 3 fichiers .vhd :

Nous utiliserons un exemple de fichier code : compteur.vhd Ouvrez un nouveau fichier (menu File /new/source/VHDL) et copiez le code du compteur. Ajoutez ce fichier à votre projet.

     library IEEE;
     use IEEE.STD_LOGIC_1164.ALL;


     entity compteur is
        port ( ... ) ;
     end compteur;


     architecture comportementale of compteur is
        ....
     end comportementale;

Le fichier de simulation (ou testbench) est un fichier .vhd, il doit toujours être structuré de la même façon.
Voici un exemple de fichier de simulation : sim_compteur.vhd

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library work;
use work.all;

ENTITY bench IS
END bench;

ARCHITECTURE test OF bench IS
COMPONENT compteur
generic (size : integer := 16 );
port ( reset : in Std_Logic;
clk : in Std_Logic;
up : in Std_Logic;
load : in Std_Logic;
value : in integer range 0 to size-1;
output : out integer range 0 to size-1) ;
end COMPONENT;

constant Tclk : time := 10 ns;
signal clk_cpt : std_logic:= '0';
signal reset_cpt: std_logic:= '1';
signal up_cpt : std_logic:= '1';
signal load_cpt: std_logic:= '0';
signal val_cpt : integer range 0 to 15 := 9;
signal out_cpt : integer range 0 to 15;

begin

cpt : compteur generic map(16) port map (reset_cpt, clk_cpt, up_cpt, load_cpt, val_cpt,out_cpt);

GENERATE_CLOCK : process
begin
clk_cpt<= '0';
WAIT FOR Tclk/2;
clk_cpt<= '1';
WAIT FOR Tclk/2;
end process GENERATE_CLOCK;

CPT_SIM : process
begin
reset_cpt<= '1';
up_cpt<= '1';
load_cpt<= '0';
WAIT FOR 3*Tclk;
reset_cpt<= '0';
WAIT FOR 10*Tclk;
load_cpt<= '1';
WAIT FOR 10*Tclk;
load_cpt<= '0';
WAIT FOR 30*Tclk;
up_cpt<= '0';
WAIT FOR 40*Tclk;

wait;
end process CPT_SIM;


end test;

Le fichier de configuration est aussi un .vhd, il est obligatoire mais peut être inclus dans le fichier précédent.
Voici un exemple de fichier de configuration : cfg_compteur.vhd

      library IEEE;
      use IEEE.STD_LOGIC_1164.ALL;
      library work;
      use work.ALL;


      configuration compteur_cfg of bench is
         for test
            for cpt:compteur
                  use entity work.compteur(comportementale);
            end for;
         end for;
      end compteur_cfg;

Remarque: Les fichiers de configuration et de testbench peuvent être utilisés aussi bien au niveau RTL qu'au niveau porte. Il suffira de modifier le nom de l'architecture dans les fichiers sim_compteur.vhd et cfg_compteur.vhd. Si la netlist après synthèse a pour nom d'architecture SYN_comportementale au lieu de comportementale

      configuration compteur_cfg_gate of bench_compteur is
         for comportementale
            for cpt:compteur
                  use entity work.compteur(SYN_comportementale);
            end for;
         end for;

      end compteur_cfg_gate;

2.3. Analyse des fichiers

Avant de tester le circuit, il faut l'analyser. Pour cela il nous faut ajouter dans le projet les fichiers VHDL à compiler.

Il est bien sur possible de compiler les fichiers un par un en cas d'erreur. Un éditeur de texte s'ouvre lorsque l'on double-clique sur les fichiers .vhd.

2.4. Lancement de la simulation

Choisissez l'onglet Library, puis, en double-cliquant sur la configuration compteur_cfg, la simulation se charge.
Ceci est équivalent à : Design->Load Design->compteur_cfg. Par la suite il est conseillé d'utiliser cette procédure car elle permet de gérer les options de simulation (timing, ...).

vsim


Avant de continuer la simulation, une petite explication de cet outil s'impose. L'écran est composé de 7 parties:

Nous allons maintenant continuer la simulation.

2.5. Simulation au niveau porte

Maintenant que vous venez de faire la simulation au niveau RTL, il faut faire la simulation au niveau porte avec la netlist compteur_gate.vhd. Pour cela supprimez le fichier compteur.vhd du projet, puis ajoutez le fichier compteur_gate.vhd dans le projet en cours, puis modifiez le fichier cfg_compteur.vhd (comportementale en SYN_comportementale) ou créez un nouveau fichier de configuration cfg_compteur_gate.vhd. Recompilez l'ensemble. La configuration instancie maintenant la netlist au niveau porte et non plus la spécification RTL d'origine contenue dans compteur.vhd.

Il est en outre nécessaire de générer un fichier au format SDF (Standard Delay Format) compteur.sdf sous dc_shell ou design_analyzer dans la "Command Window" en tapant la commande : write_sdf compteur.sdf. Ce fichier contient les délais des portes et les estimations des délais d'interconnexions.

load design         load design 2


A partir de ce moment, la simulation prend en compte les portes logiques qui constituent la netlist du compteur et les informations de délais fournies par le fichier SDF. Relancez la simulation, vous voyez maintenant apparaître des temps de propagation entre l'horloge et les sorties du compteur ainsi que des messages vous indiquant les instants où des glitchs apparaîssent.

Il ne vous reste plus qu'à faire vos propres composants dans le cadre de votre projet. Bon courage!