Introduction à SystemC

Historique et concepts

Tarik Graba

P4 2018-2019

Présentation de l’UE

Objectifs

Organisation et évaluation

Introduction

Généralités



Historique

SystemC plus de 15 ans (bientôt 20) d’évolution !


À 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.


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


La procédure d’installation est décrite en détail dans le fichier INSTALL dans l’archive de la bibliothèque.

Le fichier README donne la liste des systèmes et compilateurs supportés. Voici un extrait donnant cette liste pour la version 2.3.2 de SystemC.

  2. This release is supported on the following platform combinations for
     which it has been tested:

      o 64-bit Linux (x86_64)
        (RedHat Enterprise 6; SuSE Enterprise Linux 11; Debian 9)
        - GNU C++ compiler versions gcc-4.2.2 through gcc-7.2.0
        - Clang C++ compiler versions clang-3.4 through clang-5.0
        - Intel C++ Compiler (ICC 15.0.0)

      o 64-bit Linux (x86_64) with 32-bit compiler (--host=i686-linux-gnu)
        (SuSE Enterprise Linux 11)
        - GNU C++ compiler versions gcc-4.2.2 through gcc-7.2.0
        - Intel C++ Compiler (ICC 15.0.0)

      o 64-bit Linux (aarch64)
        (Ubuntu 16.04)
        - GNU C++ compiler version gcc-4.5.0

      o 64-bit Mac OS X (x86_64)
        (10.12 Sierra)
        - Apple LLVM version 8.0 (clang-800.0.42.1)
        - GNU C++ compiler (MacPorts) versions gcc-4.9.0, gcc-5.4.0, gcc-6.3.0

      o Microsoft Windows
        (Windows Server 2008, Windows 10 Enterprise)
        - Microsoft Visual Studio 2010 (10.0) (Win32 and x64)
        - Microsoft Visual Studio 2013 (12.0) (Win32 and x64)
        - Microsoft Visual Studio 2015 (14.0) (Win32 and x64)
        - Microsoft Visual Studio 2017 (14.1) (Win32 and x64)

        Warning: The fixed-point datatypes are not working as defined on
                 MSVC 2015/2017 (x64) in Release mode.  See RELEASENOTES.

      o Windows Server 2008 (WoW64), Msys 1.0.17(0.48/3/2)
        - MinGW-w64 GNU C++ compiler version 4.9.2 (x86_64)


    This release has not yet been tested or is known not to work as expected
    on the following formerly supported platforms:

      o GNU C++ compiler versions prior to 4.2.x (all platforms)
      o FreeBSD 9.0 or later (x86, x86_64) with GNU C++ compiler
      o HP-UX 11.00 or later with GNU C++ or HP C++ compiler
      o Sun/Oracle Solaris, with GNU C++ or Sun/Solaris Studio compiler
      o Mac OS X prior to 10.12 (Sierra) and/or on the x86, PowerPC architectures
      o Microsoft Visual C++ versions prior to 10.0 (2010)
      o Cygwin 1.7 or later (x86, x86_64) with GNU C++ compiler
      o Msys/MinGW32 GNU C++ compiler

Sauf si vous avez un compilateur C++ extraterrestre, vous devriez pouvoir utiliser 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
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++ :

L’exécution donne :

  SystemC 2.3.2-Accellera --- Dec 14 2017 09:24:39
  Copyright (c) 1996-2017 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