SystemC est un ensemble de classes et de macros C++ qui fournissent une interface de simulation pilotée par événements (voir aussi simulation d'événements discrets ). Ces fonctionnalités permettent à un concepteur de simuler des processus concurrents , chacun décrit à l'aide d' une syntaxe C++ simple . Les processus SystemC peuvent communiquer dans un environnement simulé en temps réel, en utilisant des signaux de tous les types de données offerts par C++, certains supplémentaires offerts par la bibliothèque SystemC, ainsi que ceux définis par l'utilisateur. À certains égards, SystemC imite délibérément les langages de description matérielle VHDL et Verilog , mais est plus justement décrit comme un langage de modélisation au niveau système .
SystemC est appliqué à la modélisation au niveau système , à l'exploration architecturale, à la modélisation des performances, au développement logiciel , à la vérification fonctionnelle et à la synthèse de haut niveau . SystemC est souvent associé à la conception au niveau système électronique (ESL) et à la modélisation au niveau transactionnel (TLM).
Spécification de la langue
SystemC est défini et promu par l'Open SystemC Initiative (OSCI — maintenant Accellera ), et a été approuvé par l'IEEE Standards Association sous le nom IEEE 1666-2011 - le manuel de référence du langage SystemC (LRM). Le LRM fournit la déclaration définitive de la sémantique de SystemC. L'OSCI fournit également un simulateur de preuve de concept open source (parfois appelé à tort simulateur de référence), qui peut être téléchargé à partir du site Web de l'OSCI. Bien que l'intention de l'OSCI soit que les fournisseurs commerciaux et les universités puissent créer des logiciels originaux conformes à la norme IEEE 1666, dans la pratique, la plupart des implémentations de SystemC ont été au moins en partie basées sur le simulateur de preuve de concept de l'OSCI.
Par rapport aux HDL
SystemC présente des similitudes sémantiques avec VHDL et Verilog , mais on peut dire qu'il présente une surcharge syntaxique par rapport à ces derniers lorsqu'il est utilisé comme langage de description de matériel . D'un autre côté, il offre une plus grande gamme d'expression, similaire au partitionnement de conception orienté objet et aux classes de modèles. Bien qu'il s'agisse strictement d'une bibliothèque de classes C++, SystemC est parfois considéré comme un langage à part entière. Le code source peut être compilé avec la bibliothèque SystemC (qui comprend un noyau de simulation) pour donner un exécutable. Les performances de l'implémentation open source OSCI sont généralement inférieures à celles des simulateurs VHDL/Verilog commerciaux lorsqu'ils sont utilisés pour la simulation du niveau de transfert de registre .
Versions
La version 1 de SystemC comprenait des fonctionnalités courantes du langage de description du matériel , telles que la hiérarchie structurelle et la connectivité, la précision du cycle d'horloge, les cycles delta, la logique à quatre valeurs (0, 1, X, Z) et les fonctions de résolution de bus.
À partir de la version 2 de SystemC, l'accent a été mis sur l'abstraction des communications, la modélisation au niveau des transactions et la modélisation des plateformes virtuelles. Des ports abstraits, des processus dynamiques et des notifications d'événements temporisés ont également été ajoutés.
Caractéristiques linguistiques
Modules
SystemC possède une notion de classe conteneur appelée module. Il s'agit d'une entité hiérarchique qui peut contenir d'autres modules ou processus.
Les modules sont les éléments de base d'une hiérarchie de conception SystemC. Un modèle SystemC se compose généralement de plusieurs modules qui communiquent via des ports. Les modules peuvent être considérés comme un élément de base de SystemC.
Ports
Les ports permettent la communication de l'intérieur d'un module vers l'extérieur (généralement vers d'autres modules) via des canaux.
Signaux
SystemC prend en charge les signaux résolus et non résolus. Les signaux résolus peuvent avoir plusieurs pilotes (un bus) tandis que les signaux non résolus ne peuvent avoir qu'un seul pilote.
Exportations
Les modules disposent de ports par lesquels ils se connectent à d'autres modules. SystemC prend en charge les ports unidirectionnels et bidirectionnels.
Les exportations intègrent des canaux et permettent la communication de l'intérieur d'un module vers l'extérieur (généralement vers d'autres modules).
Processus
Les processus sont utilisés pour décrire les fonctionnalités. Les processus sont contenus dans des modules. SystemC fournit trois abstractions de processus différentes qui peuvent être utilisées par les concepteurs de matériel et de logiciel. Les processus sont les principaux éléments de calcul. Ils sont concurrents.
Chaînes
Les canaux sont les éléments de communication de SystemC. Ils peuvent être de simples câbles ou des mécanismes de communication complexes comme des FIFO ou des canaux de bus .
Canaux élémentaires :
- signal : l'équivalent d'un fil
- tampon
- fifo
- mutex
- sémaphore
Interfaces
Les ports utilisent des interfaces pour communiquer avec les canaux.
Événements
Les événements permettent la synchronisation entre les processus et doivent être définis lors de l'initialisation.
Types de données
SystemC introduit plusieurs types de données qui prennent en charge la modélisation du matériel.
Types de normes étendues :
sc_int<n>entier signé sur n bitssc_uint<n>entier non signé de n bitssc_bigint<n>entier signé sur n bits pour n > 64sc_biguint<n>entier non signé de n bits pour n > 64
Types logiques :
sc_bitBit unique à 2 valeurssc_logicBit unique à 4 valeurssc_bv<n>vecteur de longueur n de sc_bitsc_lv<n>vecteur de longueur n de sc_logic
Types de points fixes :
sc_fixed<>point fixe signé avec modèlesc_ufixed<>point fixe non signé basé sur un modèlesc_fixpoint fixe signé non modélisésc_ufixvirgule fixe non signée et non modélisée
Histoire
- 27/09/1999 Annonce de l'initiative Open SystemC
- 01/03/2000 Sortie de SystemC V0.91
- 2000-03-28 Sortie de SystemC V1.0
- 2001-02-01 Publication de la spécification SystemC V2.0 et du code source bêta V1.2
- 2003-06-03 Sortie du manuel de référence du langage SystemC 2.0.1 LRM
- 2005-06-06 Publication de la norme de modélisation au niveau des transactions SystemC 2.1 LRM et TLM 1.0
- 2005-12-12 L'IEEE approuve la norme IEEE 1666–2005 pour SystemC
- 13/04/2007 Sortie de SystemC v2.2
- 09/06/2008 Sortie de la bibliothèque TLM-2.0.0
- 27/07/2009 Sortie de TLM-2.0 LRM, accompagné de la bibliothèque TLM-2.0.1
- 08/03/2010 Sortie des extensions SystemC AMS 1.0 LRM
- 2011-11-10 L'IEEE approuve la norme IEEE 1666–2011 pour SystemC
- 06/04/2016 L'IEEE approuve la norme IEEE 1666.1–2016 pour SystemC AMS
- 05/06/2023 L'IEEE approuve la norme IEEE 1666–2023
SystemC trouve ses origines dans le travail sur le langage de programmation Scenic décrit dans un article du DAC de 1997.
ARM Ltd., CoWare , Synopsys et CynApps se sont associés pour développer SystemC (CynApps est devenu plus tard Forte Design Systems ) pour lancer sa première version préliminaire en 1999. Le principal concurrent de l'époque était SpecC, un autre package open source basé sur C développé par le personnel de l'UC Irvine et certaines sociétés japonaises.
En juin 2000, un groupe de normalisation connu sous le nom d' Open SystemC Initiative a été formé pour fournir une organisation neutre au sein de l'industrie pour héberger les activités de SystemC et pour permettre aux plus grands concurrents de Synopsys, Cadence et Mentor Graphics, une représentation démocratique dans le développement de SystemC.
Exemple de code
Exemple de code d'un additionneur :
#include "systemc.h" SC_MODULE ( additionneur ) // déclaration de module (classe) { sc_in < int > a , b ; // ports sc_out < int > sum ; void do_add () // processus { sum . write ( a . read () + b . read ()); // ou simplement sum = a + b } SC_CTOR ( additionneur ) // constructeur { SC_METHOD ( do_add ); // enregistrer do_add dans le noyau sensitive << a << b ; // liste de sensibilité de do_add } };
Estimation de la puissance et de l'énergie dans SystemC
L'estimation de la puissance et de l'énergie peut être réalisée dans SystemC au moyen de simulations. Powersim est une bibliothèque de classes SystemC destinée au calcul de la consommation de puissance et d'énergie du matériel décrit au niveau système. À cette fin, les opérateurs C++ sont surveillés et différents modèles énergétiques peuvent être utilisés pour chaque type de données SystemC. Les simulations avec Powersim ne nécessitent aucune modification du code source de l'application.