Modélisation et vérification

Simulation

Exemple 1 : porte AND

Télécharger le fichier porte_and.smv et l'ouvrir dans emacs. Ouvrir ce fichier dans NuSMV en mode interactif (NuSMV -int porte_and.smv), puis taper la commande go. Simuler diverses exécutions du module à l'aide des commandes pick_state et simulate (utiliser pick_state -h et simulate -h pour obtenir la documentation de ces commandes).

Obtenir les états accessibles du système à l'aide de la commande print_reachable_states ainsi que la liste de ses transitions à l'aide de la commande print_fair_transitions. Dessiner le système de transitions correspondant.

Exemple 2 : compteur binaire

Télécharger le fichier binary_counter.smv et l'ouvrir dans emacs. Ouvrir ce fichier dans NuSMV en mode interactif. Utiliser la commande show_vars pour afficher la liste des variables du modèle. Afficher la liste des états accessibles, simuler ce modèle et dessiner son système de transitions.

Vérification

Exemple 3 : compteur modulaire

Télécharger le fichier modular_counter.smv et l'ouvrir dans emacs. En déduire le nombre d'états du modèle (confirmer avec la commande print_reachable_states). Dessiner son système de transitions.

À quoi correspond la spécification? Vérifier que le modèle satisfait cette spécification, en mode batch puis en mode interactif (avec la commande check_ltlspec). Modifier la valeur initiale de x à 1. Que se passe-t-il? Remettre la valeur à 0 et modifier la valeur de next(x) à x+1. Que se passe-t-il?

En utilisant la commande check_ltlspec, indiquez si le modèle satisfait la spécification G (counter < 4)?

Ajouter la propriété G ((0 <= counter) & (counter < 8)) au modèle dans emacs. Rechargez le modèle sans sortir du mode interactif de NuSMV (avec les commandes reset, read_model et go). Puis vérifier la spécification avec la commande check_ltlspec.

Exercices

Modéliser les exemples VHDL suivants en NuSMV. Simulez vos modèles pour vérifier qu'ils se comportent comme souhaité. Ajouter les spécifications et prouver que vos modèles satisfont leurs spécifications.

Exercice 1 : porte ou

    signal a,b,c : bit;
    c <= a or b;
  

Exercice 2 : multiplexeur

    signal a,b,c : bit_vector(0 to 3);
    signal x : bit;
    c <= a when x='0' else b;
  

Exercice 3 : fronts montants

    signal e : reg;
    signal clk : clock;
    Rising_edge : block(clk='1' and not clk'stable)
    begin
      e <= guarded '1';
    end block;
  

e vaut 1 extactement sur les fronts montants de clk.

Exercice 4 : bascule

    signal a : bit;
    signal b : reg;
    signal clk : clock;
    Bascule : block(clk='1' and not clk'stable)
    begin
      b <= guarded a;
    end block;
  

NB: la solution de l'exercice précédent permet de simplifier le problème. On peut considérer que la bascule réagit sur un flux booléen edge qui détecte les fronts montants de clk.

Exercice 5 : bascule avec condition de chargement

    signal a,x : bit;
    signal b : reg;
    signal clk : clock;
    Latch : block(clk='1' and not clk'stable and x='1')
    begin
      b <= guarded a;
    end block;