Historique et concepts
2023-2024
SystemC est un “langage” de modélisation et de description du matériel.
C++
SystemC est un standard ouvert (Standard IEEE-1666)
Une implémentation de référence, libre (open source) est distribuée par Accellera.
SystemC permet de décrire du matériel en
C++
/comelec/softs/opt/systemc/current
. Le
répertoire contient le source ainsi qu’une version compilée pour Linux
x86_64.SystemC évolue
À la base, c’est des contributions de plusieurs entreprises qui ont été regroupées pour devenir un standard.
La première version de SystemC apportait déjà tous les éléments nécessaires pour la description du matériel :
La version 2 de SystemC a apporté des mécanismes de modélisation plus haut niveau dits transactionnels. D’abord sous la forme d’une extension (TLM : Transaction Level Modeling) qui a été ensuite intégrée au standard. La version 2.3 de SystemC apporte la 2e version de cette extension (TLM 2.0).
CoWare et Frontier Design, n’existent plus. Elles ont disparu dans les multiples fusions et rachats entre les différents acteurs du marché de l’EDA.
La version 3.0.0 a pour objectif d’améliorer les performances, et de maintenir à jour SystemC en l’adaptant aux évolution des versions de C++.
Pourquoi utiliser C++
pour décrire du
matériel ?
Pour modéliser efficacement un système complet contenant du logiciel et du matériel.
Dans un système sur puce (SoC : System On Chip) il y a du matériel :
et du logiciel exécuté sur ce matériel.
Il faut donc un moyen efficace de modéliser l’ensemble.
Cette modélisation a pour but de :
C++
a été choisi car :
Dans un modèle, avec quel niveau de précision doit-on représenter le comportement ?
Le temps est-il important ?
Tous les signaux sont importants ?
A-t-on besoin d’être précis dans le modèle ou seulement aux interfaces ?
Pour la fonctionnalité :
Pour décrire un algorithme, on n’a besoin de décrire que la
succession d’opérations menant au résultat. Dans cette description
fonctionnelle le temps nécessaire à l’exécution de ces
différentes étapes n’a pas besoin d’apparaître. Ce type de modèle est en
général un point de départ pour définir les différentes fonctionnalités
que notre système devra réaliser. On parle de modèle Untimed
Functionnal (UTF
).
Dès qu’on veut évaluer les performances d’une implémentation pour connaître, par exemple :
on doit introduire une notion de temps.
On doit donc avoir au moins, une description fonctionnelle avec une
information de temps sur chaque étape. On parle de modèle Timed
Functionnal (TF
).
Pour l’interface :
Pour décrire des échanges de données dans le système, il peut suffire de les décrire en termes de transactions. Des lectures ou des écritures entre différents éléments du système (un processeur, une mémoire…). S’il y a plusieurs transactions en parallèle, il faut pouvoir garantir l’ordre dans lequel elles ont lieu.
Si en plus, on veut pouvoir vérifier que ces transactions respectent un certain protocole de bus, il faut que le modèle décrive précisément tous les signaux de contrôle.
Dans la conception d’un système sur puce (SoC) on passe par plusieurs étapes. À partir d’un modèle fonctionnel, on sépare l’application en partie logicielle et partie matérielle. On parle de partitionnement.
Ensuite, les modèles de chaque partie sont raffinés.
Pour la partie logicielle, on va utiliser des modèles du support d’exécution de plus en plus précis en :
Pour la partie matérielle, on va également passer par plusieurs étapes. À partir d’un modèle architectural, dans lequel on définit les différents blocs utilisés, on passe à des modèles transactionnels faisant apparaître les différents transferts de données puis les temps nécessaires pour les traitements et les transferts.
Ces modèles deviennent de plus en plus précis au cours du développement jusqu’à obtenir un modèle précis au cycle et au bit près. Ce modèle est dit CABA (Cycle Accurate Bit Accurate) qui peut servir de référence à l’écriture d’un modèle RTL synthétisable.
Tout au long de ce flot de développement on doit aussi conserver un modèle de référence pour vérifier la conformité avec l’application de départ.
Remarque :
Le modèle RTL est un modèle CABA dans lequel, en plus d’être précis au cycle près et au bit près, on doit respecter un style de codage particulier.
L’idée derrière SystemC est d’avoir un langage unique pour écrire des modèles à ces différents niveaux d’abstraction.
Avantages :
Pourquoi est-ce possible en SystemC ?
Dans la réalité SystemC n’est pas utilisé pour tout faire. Pourquoi ?
Dans l’industrie, SystemC est principalement utilisé comme langage de modélisation. Il est rarement utilisé pour produire des modèles fonctionnels haut niveau ni pour produire des modèles au niveau RTL.
Actuellement, SystemC est utilisé pour la conception de modèles transactionnels permettant de simuler efficacement des systèmes sur puce. Par exemple des modèles de :
L’utilisation de SystemC permet de concevoir des modèles dont on peut faire évoluer la précision jusqu’à des modèles CABA. Ces modèles peuvent alors être interfacés avec des modules écrits dans d’autres langages de description tels que SystemVerilog ou VHDL.
Des habitudes
Les outils
SystemC est une bibliothèque logicielle écrite en C++ qui contient les éléments nécessaires à la modélisation d’un système matériel numérique.
C’est-à-dire, ce qu’il faut pour simuler le parallélisme du matériel :
Plus des extensions pour :
Il faut noter qu’il existe depuis 2010 une extension AMS (Analog/Mixed-signal) de SystemC pour la modélisation des systèmes analogiques et mixtes. Cette extension utilise un moteur de simulation analogique (à temps continu) différent du moteur événementiel et des concepts propres à la simulation analogique qui ne seront pas abordés ici.
SystemC est une bibliothèque construite au-dessus de C++ donc tout ce qui est disponible en C++ l’est aussi en SystemC. Ceci est important pour pouvoir réutiliser des bibliothèques logicielles existantes qu’elles aient été écrites en C ou en C++.
Au-dessus de C++, un moteur de simulation événementiel est implémenté. Ce moteur permet de gérer les processus et les évènements comme dans d’autres langages HDL (Verilog ou VHDL).
L’implémentation open source de référence distribuée par Accellera contient aussi le moteur de simulation implémenté en C++.
SystemC définit un certain nombre de types utiles à la modélisation du matériel, parmi lesquels :
0
,1
,x
,z
),Sont aussi définis les éléments nécessaires à la description hiérarchique : modules, ports et canaux.
En SystemC, les canaux de communication vont au-delà des simples signaux pour permettre des niveaux d’abstraction plus élevés. Un certain nombre de canaux primaires existe dans la bibliothèque (signaux, Fifo…) mais des canaux supplémentaires peuvent être définis si besoin.
Au-dessus de tout ça des bibliothèques supplémentaires sont implémentées. Certaines sont fournies avec l’implémentation de référence telles que les bibliothèques pour la modélisation transactionnelle (TLM/TLM2.0) d’autres sont indépendantes comme la bibliothèque pour la vérification (SVC).
D’autres bibliothèques basées sur SystemC peuvent être fournies par des tiers (vendeur d’outils, d’IP…).
La bibliothèque est disponible sur le site d’Accellera :
Peut-être installée sur Linux, Mac OSX et Windows et peut être
compilée au moins avec g++
, clang++
ou
Visual C++
.
Est déjà installée sur les machines de l’école.
Sur Debian/Ubuntu Récent disponible par apt
Pour les distributions Linux récente, la bibliothèque est disponible à travers le système de distribution de paquets standard.
Sur Debian (version 10 minimum) ou Ubuntu (19.x minimum) elle peut être installée comme suit:
sudo apt install libsystemc-dev
Si vous devez compiler la bibliothèque à partir des sources, il faut télécharger l’archive Core SystemC Language and Examples disponible sur le site officiel.
La procédure d’installation est décrite en détail dans le fichier
INSTALL
dans l’archive de la bibliothèque.
Le plus simple sur une machine Linux est de
l’installer dans /usr/local/
pour que les fichiers
d’en-tête et la bibliothèque soit automatiquement trouvé à la
compilation et durant l’exécution de vos programmes.
Pour cela, une fois l’archive décompressée, dans le répertoire que vous obtiendrez, il suffit de faire:
./configure --prefix=/usr/local --with-unix-layout
make -j4
sudo make install
sudo ldconfig
Le fichier INSTALL.md
donne la liste des systèmes et
compilateurs supportés. Voici un extrait donnant cette liste pour la
version 3.0.0 de SystemC.
SystemC can be installed on the following UNIX, or UNIX-like platforms:
* Linux
* Architectures
- x86_64 (64-bit)
- x86 (32-bit) application running on x86_64 (64-bit) kernel
(`../configure --host=i686-linux-gnu`)
* Compilers
- GNU C++ compiler
- Clang C++ compiler
- or compatible
* macOS
* Architectures
- Apple Silicon
- x86_64 (64-bit)
* Compilers
- Clang C++ compiler
- or compatible
* Windows
* Compatibility layer
- MinGW / MSYS
* Architectures
- x86_64 (64-bit)
* Compilers
- GNU C++ compiler
- or compatible
Note: _Not all combinations are equally well-tested and some combinations
may not work as expected. Please report your findings by following
the instructions in the [CONTRIBUTING](CONTRIBUTING.md) file._
The [RELEASENOTES.md](RELEASENOTES.md) file contains a list of detailed platforms,
architectures, and compiler versions that have been used for testing this release.
Sauf si vous avez un compilateur C++ extraterrestre, vous devriez pouvoir utiliser SystemC.
Aussi, sachez que la version en cours de développement est accessible publiquement sur GitHub.
hello.cpp
#include <systemc.h>
int sc_main (int argc, char * argv[])
{
<< "hello world" << endl;
cout
return 0;
}
La fonction principale n’est pas main
mais
sc_main
.
La fonction main
existe quand même, elle est fournie par
la bibliothèque SystemC. Elle s’occupe de configurer l’environnement de
simulation avant d’appeler la fonction sc_main
en lui
passant les arguments qu’elle a reçus.
Le fichier d’en-tête systemc.h
contient les définitions
des éléments de la bibliothèque. En plus,
C++
, par exemple iostream
namespace
) relatifs à SystemC et à la bibliothèque
standard (std
).Si on a besoin de gérer précisément les en-têtes et les espace de
noms on peut préférer inclure systemc
.
Les sources C++ et C sont compilés puis l’édition de liens est faite
pour générer un exécutable. Parmi ces sources, doit figurer la
définition de la fonction sc_main
.
La bibliothèque SystemC doit être fournie pour l’édition de liens. Elle apporte les éléments suivants :
main
,Comme, il s’agit d’un flot de compilation standard pour du C++, on peut faire appel à d’autres bibliothèques du système.
Makefile
SYSTEMC ?= /comelec/softs/opt/systemc/current
ARCH = linux64
CPPFLAGS = -isystem $(SYSTEMC)/include
CXXFLAGS = -Wall -g
LDFLAGS = -L$(SYSTEMC)/lib-$(ARCH)
LDLIBS = -lsystemc
Dans ce Makefile
minimaliste pour g++
:
systemc
au moment de
l’édition de liens.Si la bibliothèque est installée dans des répertoires UNIX standards,
seule la définition de la variable LDLIBS
est vraiment
nécessaire. Malgré cela, gardez la définition des autres variables pour
pouvoir compiler votre code sur les machines de l’école.
L’exécution donne :
SystemC 3.0.0-Accellera --- Jul 5 2024 14:19:51
Copyright (c) 1996-2024 by all Contributors,
ALL RIGHTS RESERVED
hello world
Le message indiquant la version de SystemC est issu de la
bibliothèque et montre bien que des choses sont faites avant l’appel à
sc_main
.
© Copyright 2016-2024, Tarik Graba, Télécom Paris. | |
Le contenu de cette page est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International . | |
Ce document reprend des parties du cours en ligne sur SystemC d'Alexis Polti disponible ici. |