|
 |
 |


|
 |
 |
Les microcontrôleurs 32 bits sont sous le charme des coeurs Arm
Les multimètres de table
Autosar et UML
Le marché classé de l'électronique
|
 |
|
|





 |
|
Abréviations, expression inédite, évolution du vocabulaire, le lexique d'Electronique International vous explique l'électronique et son environnement !
|
 > tout le lexique |
|
|
|
 |

SystemVerilog se prête aux défis des nouvelles conceptions
Stuart Sutherland (Sutherland HDL) et Bassam Tabbara (Novas Software )
[ LANGAGE DE PROGRAMMATION ]
SystemVerilog se prête aux défis des nouvelles conceptions
Face à la complexité croissante des circuits intégrés, l'industrie de la CAO doit aller vers des langages de programmation plus évolués. Un exemple de cette nouvelle génération est représenté par SystemVerilog. Stuart Sutherland, membre
du comité de standardisation SystemVerilog d'Accellera et rédacteur du manuel de référence de SystemVerilog explique ici les fondements de ce langage (*).
Stuart Sutherland (Sutherland HDL) et Bassam Tabbara (Novas Software )
, Electronique Mensuel,
le 10/05/2005 à 07h00
Pour consultez cet article avec les schémas(.Pdf), cliquez ici.
Parmi les langages de programmation pour circuits intégrés, SystemVerilog est celui qui bénéficie de l'héritage le plus riche. En effet, tenant compte de l'expérience de milliers de conception en Verilog et VHDL et de plusieurs années
de support de la part des industriels, SystemVerilog innove sur de nombreux points par rapport à ses devanciers. Il incorpore par exemple des mécanismes de génération de test, autrefois propriétaires et naguère réservés aux langages de définition de
fichiers de test (les
« test-benchs »
) comme Vera ou Temporal. Il fait un bond en avant en incluant les capacités de détection de réponses propres aux assertions des langages Temporal OVA et PSL. De
nouvelles instructions d'agrégation de données, telles que
« struct »
et ses semblables, rendent le débogage bien plus efficace. Il apporte enfin une abstraction accrue du niveau de la conception, la
notion d'encapsulation des données, une syntaxe et une sémantique modernisées et de nombreux mécanismes améliorant la productivité.
Ainsi, la modélisation abstraite et les types étendus du langage SystemVerilog ouvrent la voie à la conception comportementale de niveau système, faisant passer la conception HDL (Hardware design langage) du niveau de l'implémentation
RTL à celui de l'algorithmique. Cette élévation du niveau d'abstraction se traduit notamment par une productivité plus grande pour le concepteur, tout en n'ayant qu'un effet minimal sur l'efficacité de la synthèse. Par ailleurs, la modélisation au
niveau transactions, introduite dans SystemVerilog, permet non seulement de mieux adapter le débogueur à la taille de la conception, grâce au regroupement et à l'organisation des données, mais également de mieux comprendre cette conception grâce à
une représentation abstraite et à une visualisation claire de celle-ci.
SystemVerilog ajoute par ailleurs une multitude d'instructions au sein des blocs de processus qui rendent l'inférence des intentions du programmeur plus précise. Une avancée utile pour les outils externes à la conception, notamment
les débogueurs, qui doivent présenter les données de conception de manière efficace. Pour ce faire, la variété des abstractions proposées par SystemVerilog rend l'organisation des données, leur exploration et leur présentation plus abordables pour
les utilisateurs.
La séparation du comportement et de la communication est une autre philosophie clé de ce nouveau langage. Il autorise des gains importants en termes de productivité grâce à la possibilité de réutiliser le design, que ce soit au sein
d'une implémentation, à travers plusieurs versions ciblant divers marchés avec différents compromis ou à travers les générations successives d'un même design.
Vers une conception et un débogage « avancés »
Dans les pratiques courantes de conception, on observe souvent que les ingénieurs conservent scrupuleusement des traces de ce qui marche et de ce qui ne marche pas. Ainsi, les conceptions en Verilog ou VHDL ont accumulé au fil des ans
une longue liste de souhaits de la part des utilisateurs sur ce qu'il faut ou ne faut pas faire, sur les corrections, les fonctions qui manquent, les opérations redondantes, etc. La communauté des développeurs a oeuvré pour répondre à ces
desideratas afin de les inclure au sein du langage SystemVerilog. Grâce à cet apport, SystemVerilog peut être considéré comme un Verilog perfectionné car il est bâti au-dessus de Verilog-2001.
Dans le même temps, la productivité et la lisibilité du langage ont été améliorées grâce à l'ajout de plusieurs instructions issues du langage C et du monde logiciel. Ces constructions incluent notamment les instructions
« typedef »
,
« enum »
, et
« struct »
.
« Typedef »
permet la
création et l'utilisation ultérieure de types redéfinis par le concepteur.
« Enum »
facilite l'encodage de valeurs et permet de manipuler des noms simples en lieu et place de ces valeurs. Quant à
l'instruction
« struct »
, elle encapsule les données et permet de les déplacer en groupe de manière aisée et transparente. Ces nouvelles fonctions ont notamment pour avantage de faciliter grandement le
débogage au cours de la conception (figure 1).
Comprendre les intentions et les interprétations
Un code Verilog mal écrit induit parfois des problèmes d'incohérence au moment des opérations de simulation ou de synthèse, ceci en raison de l'ambiguïté de la description. Un exemple frappant est fourni par l'instruction
« always »
utilisée dans Verilog pour modéliser de la logique combinatoire, de la logique à verrouillage (latched logic), de la logique séquentielle ou de la logique de test (figure 2). Les outils
logiciels qui lisent ce code doivent alors inférer (c'est-à-dire deviner) quelle était l'intention de l'ingénieur concernant le type de matériel, en se basant sur le contenu de la procédure et sur son contexte. Ainsi, un simulateur traitera le bloc
« always »
(et sa sortie) comme une bascule à verrouillage (latch) parce que la liste de sensibilité est incomplète ; tandis qu'un outil de synthèse le traitera en tant que logique combinatoire,
comme si la liste était complète avec le signal de sélection
« sel »
. Un débogueur comportemental pourrait, de son côté, analyser cette situation en considérant les consignes de synthèse. Il signalerait
alors cette incohérence en marquant par exemple la sortie du bloc d'un commentaire
« bascule non voulue »
. En général, cependant, ces scénarios peuvent porter à confusion et, même en suivant des règles
strictes, il arrive aux outils de mal interpréter l'intention du concepteur, que ce soit à cause d'un signal manquant dans la liste de sensibilité, d'un front montant non attendu ou même d'une affectation mal ordonnée.
Pour remédier à cette situation, SystemVerilog ajoute des instructions spéciales orientées matériel :

always_ff : pour modéliser la logique séquentielle ;

always_comb : pour modéliser la logique combinatoire ;

always_latch : pour modéliser la logique à verrouillage.
Ces instructions permettent de lever l'ambiguïté de l'intention et rendent la conception et la mise au point plus simples, en minimisant les pertes de temps passées en cycles inutiles d'interprétations et réinterprétations, avec des
outils comme des compilateurs et des analyseurs de code capables de signaler immédiatement toute instruction mal utilisée. Ces nouvelles instructions permettent donc de clarifier un certain nombre de situations jusque-là ambiguës (figure 3).
Dans le même esprit, d'autres erreurs d'interprétation fréquentes pour les instructions décisionnelles sont les scénarios où les pragmas
« full case »
et
« parallel
case »
des outils de synthèse créent des incohérences avec les simulateurs. Pour corriger ce point, SystemVerilog ajoute les mots-clés modificateurs de décision
« unique »
et
« priority »
, compréhensibles par les simulateurs et les synthétiseurs.
Une approche orientée vers les communications
L'un des principaux apports du langage SystemVerilog est l'ajout de la notion d'interfaces, qui permet de grouper des interconnexions et d'encapsuler ainsi des blocs de communication. Les
« interface
containers »
(les classes d'interfaces) sont très similaires aux
« module containers »
des langages de programmation logicielle. Elles peuvent contenir des déclarations de
variables, de tâches et de fonctions partagées par tous les utilisateurs de l'interface, ainsi que des procédures de modélisation et des assertions de vérification. Quel est le but de ces interfaces ? En fait, en séparant le comportement de la
communication, on isole les descriptions des fonctions de la communication et de la transmission de données. Ceci représente un bénéfice direct en termes de conception et de débogage grâce à une réduction drastique des duplications inutiles et
sujettes à erreurs, comme les connexions aux nombreux ports identiques des modules dans le cas des bus (figure 4).
Un autre intérêt de cet isolement est de permettre de détailler progressivement les abstractions. En effet, il arrive souvent qu'un concepteur démarre son travail à partir d'une implémentation abstraite de la communication. Ou encore
d'un schéma simple qui, plus tard, ne sera plus suffisant en ne permettant pas le respect des contraintes de latence et de bande passante. Ainsi avec, d'une part, ce principe de la séparation et, d'autre part, celui d'une modélisation abstraite
pouvant être détaillée ou remplacée par des descriptions plus précises ou des schémas plus réels, la conception devient alors réutilisable et facile à maintenir au fur et à mesure de son avancement. Le concepteur peut par exemple apporter des
modifications à la stratégie de communication au sein de l'interface elle-même, au lieu de toucher tous les modules aux alentours (figure 5). Cette idée, avec les méthodologies et outils qui l'accompagnent, a vu le jour il y a déjà quelques années
(voir référence 2) et fait désormais partie des bonnes pratiques de conception système.
La notion d'abstraction et de progression dans le détail des communications est également au centre de la notion de vérification par composition : en effet, la vérification peut être partitionnée entre comportement et
communication, du niveau d'abstraction le plus haut jusqu'aux blocs individuels. Ainsi, grâce aux interfaces, le débogage à annotations (utilisé par exemple dans l'outil Debussy de Novas Software) est extensible et devient un puissant moyen de suivi
des communications. La visualisation ajoute un niveau d'abstraction, grâce auquel l'occurrence
« interface »
regroupe la multitude de fils en un seul objet à mettre à jour ou à passer aux blocs
alentours (figure 6).
Déboguer au niveau des transactions
L'affinage progressif de la description des communications conduit à un concept d'abstraction de données très utile, celui des transactions. Il s'agit d'un foralisme permettant de décrire quelles données sont transférées entre
différents éléments du design, et comment. Les transactions peuvent servir aux débogueurs pour gérer les masses de données générées et les présenter sous une forme compréhensible par l'utilisateur. Les formalismes de transactions peuvent varier.
Cela va d'un simple marquage des données à une encapsulation complexe et détaillée d'un schéma de communication ou de transmission de données.
Pour modéliser les transactions, il est possible d'emprunter des concepts, des terminologies et des notations aux travaux de recherche déjà réalisés en matière de notations graphiques et de langages à métamodèles, comme l'UML. Par
exemple, on peut considérer une transaction comme un véritable objet, qui peut être représenté et manipulé avec les données de conception dans les fenêtres de débogage (par exemple dans une fenêtre de visualisation de signaux). La transaction
possédera alors un label permettant de la manipuler et un jeu d'attributs, qui pourront avoir des valeurs et des types et de nombreuses associations avec d'autres transactions. Ces dernières peuvent jouer différents rôles tels que parent/enfant,
successeur/prédécesseur, etc. Les associations peuvent aussi avoir une multiplicité (de 1 à beaucoup) et prendre la forme de compositions ou agrégations (figure 7).
(*) Cet article est le premier volet de la description des principales avancées offertes par SystemVerilog. La seconde partie, portant sur le caractère orienté objet du langage, l'écriture des fichiers de test et le débogage
à base d'assertions, sera publiée dans le prochain numéro de la revue.
Glossaire des termes utilisés
Affectation (VHDL, Verilog) :
instruction permettant de modifier la valeur d'un signal.
Agrégation (bases de données) :
réunion d'ensembles de données.
Assertion (programmation) :
expression logique placée dans le code source afin d'envoyer un message si une condition donnée n'est pas réalisée.
Classe (langages à objets) :
ensemble d'objets similaires par leurs structures de données (attributs) et leurs comportements (méthodes).
Container (langages à objets) :
objet qui en contient d'autres (vecteur, tableau...)
Fuite de mémoire (programmation) :
se produit lorsqu'un programme
« grignote »
peu à peu toute la mémoire disponible, jusqu'à ce que le système tombe en
panne.
Encapsuler (langages à objets) :
regrouper données et procédures au sein de classes d'objets et dans le même temps, définir des droits d'accès pour leur protection.
enum (C, C++) :
instruction qui permet de définir et de nommer un ensemble de constantes.
Instance (langages à objets) :
un représentant particulier d'une classe d'objets.
Inférence (intelligence artificielle) :
déduction logique automatique (effectuée par un analyseur, un compilateur, un moteur d'inférence, etc.).
Liste de sensibilité (VHDL, Verilog) :
liste des signaux qui déclenchent, par leur changement de valeur, l'activité d'un processus/d'un bloc procédural.
Module (Verilog, SystemVerilog) :
unité de base d'un modèle qui représente une entité logique implantée en matériel (porte, compteur 32 bits, mémoire, CPU, réseau...).
Objet (langages à objets) :
élément de programme défini par ses procédures (méthodes) et ses structures de données (attributs). Chaque objet a les mêmes attributs et méthodes que les autres objets de sa classe,
et ses propres valeurs de données.
posedge, negedge (Verilog, VHDL) :
mots-clés indiquant quel front de signal doit être attendu (front montant, front descendant).
struct (C, C++) :
instruction qui permet de grouper des variables de type différent dans une même structure.
Thread (programmation) :
tâche ou processus léger, correspondant à une routine ou à un petit programme doté d'un seul fil d'exécution
Type d'une variable (C, C++) :
ensemble des valeurs possibles d'une variable.
typedef (C, C++) :
instruction qui permet de définir de nouveaux noms de types, synonymes de types existants, afin de rendre le code plus clair.
Pour en savoir plus

Bibliographie
1. Accellera,
« SystemVerilog 3.1a Language Reference Manual »
, Accellera, June 2004.
2. James A. Rowson, Alberto Sangiovanni-Vincentelli,
« Interface-Based Design »
, Dac, 1997.
3. Yu-Chin Hsu, Bassam Tabbara, Yirng-An Chen, Furshing Tsai,
« Advanced Techniques for RTL Debugging »
, Dac, June 2003.
4. Grant Martin,
« UML for Embedded Systems Specification and Design : Motivation and Overview »
, Date, 2002.
5. Karen Piper,
« SystemVerilog : A Design and Synthesis Perspective »
, 13th EDA Interoperability Developers' Forum, Synopsys Inc., October 2003.
|
|
 |
|