Couverture - Moodle - École Polytechnique de Montréal

Chap 3 Vérification fonctionnelle
2) Couverture avec System Verilog
INF8500 SE: Conception et vérification
Plan
• Introduction (modèle de progrès
couverture)
• Couverture structurelle
• Couverture fonctionnelle
• Groupe, sondes et couverture croisées
• Exemples
et
2
INF8500 SE: Conception et vérification
1
Modèle de progrès
• Bien que le plan de vérification cible qu’est-ce
qui doit être vérifié et comment il doit être
vérifié, il est nécessaire de pouvoir aussi
mesurer le progrès.
• Pour la simulation, nous avons trois classes de
métriques de couverture:
– Ad hoc
– Structurelles (e.g. code)
– Fonctionnelles (e.g. fonctionnalités)
INF8500 SE: Conception et vérification
Modèle de progrès
INF8500 SE: Conception et vérification
2
Modèle de progrès
INF8500 SE: Conception et vérification
Couverture Ad hoc
• Détection de bugs
• Temps de simulation après la découverte du
dernier bug
• Le nombre total de cycles de simulation
• Ces métriques ne donnent aucune
information qualitative sur le pourcentage
de la spécification non vérifié.
INF8500 SE: Conception et vérification
3
Couverture structurelle
• La couverture de code (en anglais code coverage)
est une mesure utilisée en génie logiciel pour décrire
le taux de code source testé d'un programme.
• Ceci permet de mesurer la qualité des tests
effectués.
• Seulement le code pour le DUTdoit être couvert.
• Le code du testbenches doit être tracé pour
confirmer qu’il a été exécuté (une portion du code
non exécutée va conduire à une partie du DUT non
vérifiée).
INF8500 SE: Conception et vérification
Exemple de couverture de code
•
•
•
•
•
•
•
•
•
Statement coverage
Toggle Coverage
State machine coverage
Visited State coverage
Event Coverage
Branch coverage
Expression Coverage
Path Coverage
Signal Coverage
• See ModelSim(Questa)
INF8500 SE: Conception et vérification
4
Venant de wikipedia
• Couverture des fonctions (Function coverage) - Chaque fonction dans
le programme ont-elles été appelée?
• Couverture des instructions (Statement Coverage) - Chaque ligne du
code a-t-elle été exécutée et vérifiée ?
• Couverture des points de tests (Condition Coverage) - Chaque point
d'évaluation (tel que le test d'une variable) a-t-il été exécuté et vérifié ?
(Le point de test teste-t-il ce qu'il faut ?)
• Couverture des chemins d'exécution (Path Coverage) - Chaque
parcours possible (par exemple les 2 cas vrai et faux d'un test) a-t-il été
exécuté et vérifié ?
INF8500 SE: Conception et vérification
Exemples pour instructions,
chemins d’exécution et expressions
INF8500 SE: Conception et vérification
5
Couverture fonctionnelle
• La couverture fonctionnelle est une
métrique qui reflète le degré de vérification
de chaque fonctionalité.
• Autrement dit on veut s’assurer chaque
fonctionnalité a été vérifiée par au moins un
cas de test.
INF8500 SE: Conception et vérification
Couverture fonctionnelle
– Métriques typiques
•
•
•
•
•
Espace d’adressage
Code d’opération
Niveau d’occupation d’un FIFO
Le jeu de données pour une opération donnée
Assertion (décrit un peu plus loin)
– La couverture fonctionnelle est fonction du
contexte.
INF8500 SE: Conception et vérification
6
Couverture fonctionnelle
• La couverture fonctionnelle ne prouve pas
que la conception est correctement exécuté,
juste qu'il a été exercé. C'est le travail du
banc d'essai pour prouver la bonne
exécution (scoreboard).
• Métrique plus complexe à identifier et à
analyser que la couverture structurelle.
INF8500 SE: Conception et vérification
Couverture fonctionnelle
• L'expérience a montré une corrélation
étroite entre la couverture fonctionnelle et la
métrique déverminage (bogues / semaine).
INF8500 SE: Conception et vérification
7
Limitations de la couverture
fonctionnelle
• La connaissance du fonctionnement pour vérifier est limitée par
la spécification et la connaissance de la conception.
• Il n'y a pas une liste définie à 100% de la fonctionnalité et par
conséquent il peut y avoir une fonctionnalité qui n'est pas dans
la liste.
• Il n'y a pas de véritable moyen de vérifier qu'un modèle de
couverture est correcte sauf la vérification manuelle.
• L'efficacité de la couverture fonctionnelle est limitée à la
connaissance du designer.
15
INF8500 SE: Conception et vérification
Interprétation des métriques
(Measuring Completeness)
Il faut peut être
revoir votre
plan de vérification
Il faut peut être
voir du coté de la
vérification formelle
INF8500 SE: Conception et vérification
8
Couverture fonctionnelle en SV
• Il y a 3 constructions pour la couverture
fonctionnelle en SV: covergroup, coverpoint et
cross
• Un modèle de couverture en SV est une construction
hiérarchique à deux niveaux: un groupe de
couverture (covergroup) rassemble les sondes
(coverpoint). Les sondes se rapportent à des
variables tandis que les groupes définit les
conditions d’observation.
• Il est possible de former des mesures croisées (cross)
entre plusieurs groupes ou sondes.
INF8500 SE: Conception et vérification
Le Covergroup
• Le covergroup intègre la spécification d’un modèle de
couverture.
• Il s’agit d’un type user-defined
• Le type est défini et plusieurs instances peuvent être crées dans
différents contexte.
• Similaire à une classe, une fois défini, une instance de
covergroup peut être créé en utilisant l’opérateur new.
• Un covergroup peut être défini dans:
–
–
–
–
Module,
Program
Interface
Class
INF8500 SE: Conception et vérification
9
Le Covergroup
• Chaque spécification de covergroup peut inclure les
éléments suivants
– Un événement de synchronisation qui synchronise
l'échantillonnage des points de couverture
• On peut synchroniser le groupe de couverture sur un
évènement particulier, e.g. sur un front montant d’horloge, au
moyen de l’opérateur @
• Demander explicitement l’échantillonnage en appelant la
méthode sample définie pour chaque groupe
– Un ensemble de points de couverture
– La couverture croisée entre les points de couverture
– Options de couverture
INF8500 SE: Conception et vérification
Le Covergroup
• Synchronisation sur un évènement:
• Demande explicite de sample:
INF8500 SE: Conception et vérification
10
Le Coverpoint (sondes)
• Peut être une variable ou une expression
• Chaque couverture contient un ensemble de
boites (bins) associé à un ensemble de
valeurs ou de transition.
– Au moins une occurrence doit être trouvée par
boite.
– Les boites (bins) peuvent être définis par le
concepteur ou générés par l’outil.
INF8500 SE: Conception et vérification
Coverage example
program automatic test(busifc.TB ifc);
class Transaction;
rand bit [31:0] data;
rand bit [ 2:0] port; // Eight
port numbers
endclass
covergroup CovPort;
coverpoint tr.port; // Measure
coverage
endgroup
(suite)
initial begin
Transaction tr;
CovPort ck;
ck = new(); // Instantiate group
tr = new();
repeat (32) begin
/ / Run a few cycles
assert(tr.randomize); // Create a transaction
ifc.cb.port <= tr.port; // and transmit
ifc.cb.data <= tr.data; // onto interface
ck.sample();
// Gather coverage
@ifc.cb;
// Wait a cycle
end
end
endprogram
INF8500 SE: Conception et vérification
11
Coverage report example (VCS)
La couverture est complète si, pour
chaque covertpoint (sonde), au moins
une occurrence de chaque valeur ou
intervalle de valeurs a été observée.
Seul le port 0 n’est pas exercé donc
78 de la couverture est atteinte.
INF8500 SE: Conception et vérification
Coverage report example (VCS)
Avec 1 itérations
de plus on arrive
à 100% de couverture
INF8500 SE: Conception et vérification
12
Bins (Boîtes)
• SystemVerilog divise en un maximum de boites:
auto_bin_max_bins
• La valeur de défaut de auto_max_bins est 64
• Par exemple, une variable 16 bits (65,536 possibilités)
offrira 64 bins de 1,024 valeurs.
• On peut modifier le défaut:
On a ici 2 boîtes: 0 à 3 et 4 à 7
INF8500 SE: Conception et vérification
Autres exemples de bins
bit [15:0] i;
covergroup cg_Short @(posedge Clock);
c : coverpoint i;
endgroup
//The simulator could potentially create 216 bins for the coverpoint.
//(In fact, there is a //default of a maximum of 64 automatically created bins.)
// It would probably be more useful to define some bins to hold specific values or ranges of
values:
covergroup cg_Short @(posedge Clock);
coverpoint i {
bins zero = { 0 };
bins small = { [1:100] };
bins hunds[3] = { 200,300,400,500,600,700,800,900 };
bins large = { [1000:$] };
bins others[] = default;
Tous les autres valeurs non énumérées plus haut.
};
Attention à vérifier si default entre dans le
rapport de couverture
endgroup
INF8500 SE: Conception et vérification
13
Autres exemples de bins
INF8500 SE: Conception et vérification
Autres exemples de bins
Ignorer dans les statistiques
Message d’erreur reporter
et exit
•
Si une occurrence apparait dans une boite illégale, un message d’erreur est émis au
simulateur
•
Répartition uniforme: ici les valeurs 0 à 99 sont réparties dans 10 boîtes
INF8500 SE: Conception et vérification
14
Couverture conditionnelle
• On utilise iff pour ajouter une condition au point de
couverture
covergroup CoverPort;
coverpoint port iff (!bus_if.reset);
Endgroup
• Utilisation des fonctions start et stop:
intial begin
CovPort ck=new;
#1ns bus_if.reset=1;
ck.stop();
#100ns bus_if.reset=0;
ck.start();
…
end
INF8500 SE: Conception et vérification
Couverture de transition
INF8500 SE: Conception et vérification
15
Couverture croisée (cross)
Tel que mentionné précédemment, il est
possible de former des mesures croisées
(cross) entre plusieurs groupes, sondes ou
même boites.
INF8500 SE: Conception et vérification
Rapport de couverture croisée
Même si tous les valeurs de kind et port values ont été générées,
environ 1/8 des combinaisons croisées n’ont pas été visitées.
Systemverilog s’attend à un total de 128 (8X16) bins:
INF8500 SE: Conception et vérification
16
Rapport de couverture croisée
• 4 premiers résultats des 128 possibilités:
INF8500 SE: Conception et vérification
Autre exemple
INF8500 SE: Conception et vérification
17
Exemple de Doulos*
enum {Red, Green, Blue} Colour;
covergroup cg_Colour @(posedge Clock);
coverpoint Colour;
endgroup
cg_Colour = new cg_inst;
* http://www.doulos.com/knowhow/sysverilog/tutorial/constraints/
INF8500 SE: Conception et vérification
Exemple de Doulos avec transitions
enum {Idle, State1, State2} State;
covergroup cg_State @(posedge Clock);
states : coverpoint State;
state_trans : coverpoint State {
bins legal[] = ( Idle => State1, State2 ),
( State1, State2 => Idle);
bins idle[] = ( Idle [* 2:4] );
bins illegal = default sequence;
}
endgroup
Toutes les transitions qui ne sont pas
couvertes plus haut. Attention! Ces
valeurs ne sont pas prises en compte
dans le rapport de couverture même
avec un bin qui ne serait pas illegal
ou ignore.
Réf. http://www.doulos.com/knowhow/sysverilog/tutorial/constraints/ et
http://www.asic-world.com/systemverilog/coverage10.html
INF8500 SE: Conception et vérification
18
Boîtes de couverture croisée(Binof)
•
•
•
c1 mesure l’occurrence simultanée de a0 et b0
c2 mesure le croisement de l’ensemble a1 et b1 (i.e. le complément de c1)
c3 mesure les occurrences de a incluse dans l’intervalle [0:10]
INF8500 SE: Conception et vérification
Résumé des options de
couverture
• Voir la table 19-1—Instance-specific coverage options du
SystemVerilog LRM (IEEE 1800 – 2009) pour les coverage
option:
–
–
–
–
–
–
–
–
–
–
weight= number
goal=number
name=string
comment=string
at_least=number
detect_overlap=boolean
auto_bin_max=number
cross_num_print_missing= Number
per_instance=boolean
get_inst_coverage=boolean
INF8500 SE: Conception et vérification
19
Pilotage du test par la couverture
• La couverture peut être mesurée de façon globale,
à la fin de la simulation. Mais il est également
possible de connaître le pourcentage de couverture
à tout instant.
• Cette possibilité ouvre la voie au pilotage des tests
par la mesure de couverture.
• Dans ce qui suit, voici deux exemples.
INF8500 SE: Conception et vérification
Relever les compteurs
Résultats:



Global:
73.437500
Tous les groupes: 73.437500
Une sonde:
71.87500
INF8500 SE: Conception et vérification
20
Relever les compteurs
• $get_coverage: fournit une information globale sur
l’ensemble des groupes de couverture présents dans la
simulation
• get_coverage: fournit une mesure relative à une classe
de groupes ou une sonde de cette classe. La valeur
retournée est une moyenne de toutes les instances de
la classe.
• get_inst_coverage: fournit une mesure de couverture
relative à une instance de groupe ou de sonde. La
valeur retournée concerne cette seule instance.
INF8500 SE: Conception et vérification
Arrêter un test quand la
couverture est atteinte
Résultats:

Durée de simulation: 2665 ns
INF8500 SE: Conception et vérification
21
SystemVerilog Checks and Coverage
Construct Usage Overview
INF8500 SE: Conception et vérification
Exemple: commutateur ATM
•
Une suite de tests a été développé pour la couverture de la
switch ATM. Nous avons obtenu un taux de couverture de 100%:
- Pour une génération complètement pseudo-aléatoire: 708 transactions
- En travaillant avec la couverture fonctionelle: 229 transactions
Test 3
Test 2
Test 1
100
Taux de Couverture
80
60
40
20
0
0
100
200
300
400
500
Transactions appliquées
INF8500 SE: Conception et vérification
600
700
Sébastien Regimbal, École
Polytechnique de Montréal
22