Introduction à SystemC

Historique et concepts

Tarik Graba

2023-2024

Présentation de l’UE

Objectifs

Introduction

Généralités



Historique

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 SystemC


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 :


À quel niveau d’abstraction ?

Que veut dire niveau de représentation ?


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.


Que veut dire niveau de représentation ?

Niveaux d’abstraction dans un flot de conception

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.


SystemC : Un langage pour tous les modèles

L’idée derrière SystemC est d’avoir un langage unique pour écrire des modèles à ces différents niveaux d’abstraction.

Avantages :

SystemC : Un langage pour tous les modèles

Pourquoi est-ce possible en SystemC ?

SystemC : Un langage pour presque tous les modèles

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.


SystemC : Un langage pour presque tous les modèles

Des habitudes

Les outils

SystemC

La bibliothèque

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.


Structure de la bibliothèque

Organisation de la bibliothèque SystemC

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 :

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…).


Comment récupérer et installer SystemC

La bibliothèque est disponible sur le site d’Accellera :

http://accellera.org/downloads/standards/systemc

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.

https://github.com/accellera-official/systemc

Premier exemple Hello World

hello.cpp

#include <systemc.h>

int sc_main (int argc, char * argv[])
{

   cout << "hello world" << endl;

   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,

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.


Que doit-on compiler ?

Flot de compilation

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 :

Comme, il s’agit d’un flot de compilation standard pour du C++, on peut faire appel à d’autres bibliothèques du système.


Première compilation

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++ :

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.


Retour au sommaire du cours