2. CoursFondamentalduSystemC
14/05/15
2
PLAN DU COURS
Partie 1Partie 1 Du C au C++: une courte
présentation du langage C++ et ses
différences avec C.
Partie 2Partie 2 Les concepts clés de l’extension du
C++ au SystemC pour la modélisation des
circuits intégrés.
Partie 3Partie 3 Le langage SystemC
3. CoursFondamentalduSystemC
14/05/15
3
Premiers pas:
Déclaration des variables
Les références
Passage des arguments des fonctions par référence
Surcharge des fonctions
Paramètres par défaut
Allocation dynamique de la mémoire
Les streams C++
Partie 1Partie 1 Du C au C++
4. CoursFondamentalduSystemC
14/05/15
4
Les variables peuvent être déclarés n’importe où dans
le code (pas nécessairement au début du code)
ex. 1ex. 1
{
int a=0;
a++;
// not allowed in C// not allowed in C
float b;;
...
}
ex. 2ex. 2
/* the i counter is defined directly inside
the block, and it is visible only inside it. */
for( int i=0; i<20; i++ )
{
...;
}
Du C au C++ premiers pas: déclaration
des variables
5. CoursFondamentalduSystemC
14/05/15
5
Considérer le code suivant:
int a;
int & b = a;
b = 5;
L’opérateur & signifie que « b » est:
- une référence de a, et non une copie de a,
- la meme variable avec un nom différent;
- un changement sur « b » est refleté sur a et viceversa.
Syntaxe:
datatype & var1 = var2;
Note: une variable référence doit toujours être
initialisée à une autre variable lors de la déclaration;
Du C au C++ premiers pas: les
références « & »
6. CoursFondamentalduSystemC
14/05/15
6
Passage des arguments des fonctions
par références
Le passage des variables par
référence est l’application la
plus importante des références.
Dans l’exemple, chaque fois
qu’une variable de type int est
passée à la fonction mult, « a »
devient une référence de
l’argument passé
Un changement quelconque
de cet argument ( a) sera reflété
sur la variable passée (val).
void mult(int & a)
{
a *= 2;
}
void main()
{
int val = 3;
mult(val); // now val = 6
}
7. CoursFondamentalduSystemC
14/05/15
7
Premiers pas: surcharge des fonctions
C++ permet le surcharge des fonctions:
– Plus q’une fonction peut avoir le même nom et le
même cadre.
– Les fonctions doivent différer par au moins un
paramètre
void mult(int &a)
{
a *= 2;
}
void mult(int &a, int n)
{
a *= n;
}
void main()
{
int val = 3;
mult(val); // val = 6;
mult(val,4); // val = 24;
}
9. CoursFondamentalduSystemC
14/05/15
9
Allocation Dynamique
C++ fournit deux opérateurs spéciaux, new et
delete, pour allouer et détruire des objets.
int *p;
p = new int; // p points to an int location;
....
delete p; // destroy the int memory location pointed by p
Ex of dynamic vectors
int *p = new int[num]; // now p points to a vector of num integers
...
delete [ ] p; // needed syntax to destroy a dynamic vector
/* Note: num can be a runtime value, elaborated during the
execution of the code;*/
10. CoursFondamentalduSystemC
14/05/15
10
CIN COUT C++ Streams
<< et >> sont surchargés pour les types natifs du
C.
Il peuvent être surchargé pour tout type définie
par l’utilisateur.
#include <iostream.h>
void main()
{
char * c[20] = “Hello world !”;
float z = 0.8;
int a = 23
cout << “c = “ << c << endl;
cout << “z = “ << z << endl;
cout << “a = “ << a << endl;
}
14. CoursFondamentalduSystemC
14/05/15
14
Objets
OBJECTS – utilisés pour modéliser des entités réelles:
personnes, place vecteur, temps, liste …
Comment définir un objet ?
Chaque objet peut être définie pour contenir des
données et des fonctions manipulant ces données.
15. CoursFondamentalduSystemC
14/05/15
15
Classes
Les classes permettent de modéliser les objets
Les classes contiennent des attributs (données) et des
méthodes
class StudentRecord
{
private:
int SSN; //ATTRIBUTES
char first_name[20]; char last_name[20], int grade;
public:
void get_name(); //Methods :OPERATIONS on
ATTRIBUTES
void print_name();
};
17. CoursFondamentalduSystemC
14/05/15
17
Classes et objets: pointeur « this »
« This » pointe sur l’objet de la classe elle-même.
La fonction membre peut trouver l’adresse de l’objet
auquel elle appartient
/* Function taking an object of type signal as an argument.*/
void bind(signal s);
[…]
class signal
{
void bindme( )
{
bind(*this); // *this is the current object which is of type signal
}
}
18. CoursFondamentalduSystemC
14/05/15
18
Pointeur « this » (suite)
Peut être utilisé pour entre un argument et une variable
de classe:
class A {
int x = 3;
void f(int x) {
cout << "x= " << x << ", this->x= " << this->x << endl;
}
};
int main() {
A instance;
instance.f(1); // x= 1, this->x= 3
}
19. CoursFondamentalduSystemC
14/05/15
19
Les Constructeurs
Quand un objet de classe est créé, leurs membres
peuvent être initialisés par le constructeur de cette
fonction.
Le constructeur est exécuté quand un objet est déclaré
ou créé dynamiquement (utilisant new)
Définir les constructeurs
– A le même nom que la classe elle-même
– Ne retourne pas des valeurs.
– Ne peut pas être appelé explicitement
– Peut passer des arguments.
22. CoursFondamentalduSystemC
14/05/15
22
Polymorphisme de fonction
Exemple de surcharge de la fonction add() suivante:
/* The correct function to be invoked is determined by checking
the number and type of argument*/
//Declarations
int add(int a,int b); //prototype 1
int add(int a,int b,int c); //prototype 2
int add(double a,int b); //prototype 3
//Function calls
cout<<add(5,10) //uses prototype 1
cout<<add(5,10,20) //uses prototype 2
cout<<add(0.72,10) //uses prototype 3
23. CoursFondamentalduSystemC
14/05/15
23
Surcharge des opérateurs
C++ a plusieurs opérateurs:
– +, -, *, /, %, ++, --, =, +=, …
Il est nécessaires d’utiliser ces opérateurs avec des
objets. Exemple: si on veut ajouter deux strings,
utiliser + est plus intuitive d’utiliser la fonction strcat.
Ceci peut se faire en traitant les opérateurs comme
des fonctions.
La définition de ces fonctions peut se faire par:
– a = +(b, c); pour faire a = b+c
24. CoursFondamentalduSystemC
14/05/15
24
Surcharge des opérateurs (suite)
// string.cc
/* This is a memory efficient string class. It allocates just enough
memory to store the string passed to it! It demonstrates overloading the
+= operator. This is overloaded as a MEMBER FUNCTION */
#include <iostream.h>
#include <string.h>
class String {
private:
char *str;
public:
// Constructor
String(char* ptr);
// member functions
void print();
// Overloaded operators
const String& operator+=(const String& a);
};
31. CoursFondamentalduSystemC
14/05/15
31
Généricité « Template »
Templates: utilise la même classe pour
différents types de données.
Exemple:
On peut représenter une pile comme un
tableau d’éléments, un entier indiquant le
sommet de la pile (LIFO), et des méthodes
comme « push et pop ».
33. CoursFondamentalduSystemC
14/05/15
33
Classes templates
Si une classe est entrain d’utiliser « int » pour les opérations de la pile
une autre qui utilise des « strings » alors il n’y a pas besoin de d’utiliser
deux classes différentes mais utiliser des templates.
34. CoursFondamentalduSystemC
14/05/15
34
Classes templates
La classe template qui a été définie utilise un
type paramètre T.
Pour créer une classe on doit spécifier quel
est le type de T. exemple:
– Stack<int> iStack
– Stack<string> fStack;
Mettant ‘int’ dans <> on dit que T est assigné
à un entier ‘int’.
35. CoursFondamentalduSystemC
14/05/15
35
Plus q’un paramètre ?
Il est possible de créer des classes templates
avec plus qu’un seul paramètre.
template <class X, class Y>
class SampleClass
{
// code
};
Dans ce cas X et Y ont besoin d’être
spécifiés lorsque on crée un objet:
SampleClass<int, bool> S;
37. CoursFondamentalduSystemC
14/05/15
37
Exemple d’affichage d’un tableau
Cette fonction template affiche un tableau de types
de données quelconque. Si le tableau doit contenir
des objets définis par l’utilisateur, l’opérateur <<
dot être surchargé correctement.
40. CoursFondamentalduSystemC
14/05/15
40
Besoin des langages de modélisation
mixte logicielle/matérielle
=>Problématique: on veut un langage permettant de modéliser à la
fois du HW et du SW dans les SoCs (systèmes sur puces)!!
Les langages de description du matériel
– Verilog, VHDL
– ne sont pas dédiés à la modélisation du software
Langages de programmation généralistes
– C, Ada, langages Orientés Objet
– Manque de primitives permettant la modélisation du Hardware
– Besoin d’implémenter un cœur de simulation
Permettre une co-simulation hétérogène
Apparition de Langages dédiés au hard basées sur le C
– HardwareC, Hpascal, SpecC, cowareC…
– ce sont des langages propriétaires (académiques, CAD vendeurs)
=>Besoin d’un Langage à la fois pour la modélisation et la
programmation!!
41. CoursFondamentalduSystemC
14/05/15
41
Peut-on utiliser le C++ tel qu’il
est pour le HW-SW?
C++ ne supporte pas:
Communication hardware : Signaux, protocoles, …
Notion de temps : opérations séquencées par le temps
(cycles, délais en ns …)
Concurrences: HW et SW opèrent en parallèle
Réactivité: le HW réponde au stimuli et il a une
interaction constante avec son environnement, ce qui
nécessite le traitement des exceptions.
Types de données HW : Bit, bit-vector, multi-valued
logic (0, 1, « x », « z »), signed et unsigned, integer,
fixed-pointed, float …
Un cœur de simulation intégré!!
45. CoursFondamentalduSystemC
14/05/15
45
Modélisation d’un Système
avec SystemC
Un système est modélisé par:
un ensemble de modules (instances de C++ classes),
organisées de façon hiérarchiques et fonctionnent de
façon concurrente.
un ensemble d’élément de communication (signals,
channels …)
interconnexions (binding) entre des éléments de
communication
Tout est basée sur des objets (POO)
l’ordonnancement (Scheduling) est assuré par le cœur du
SystemC!!
47. CoursFondamentalduSystemC
14/05/15
47
Caractéristiques de SystemC
Haute vitesse de simulation
Plusieurs niveaux d’abstraction
– Haut niveau fonctionnel (algorithmique, TLM, PV, PVT)
– CA (Cycle Accurate)
– RTL
– Classique flow de conception
Protocoles de communication – Channels
– Capacité de raffinement
Support de déboguage
– Approache C++ -> débuggeurs classiques (gdb, …)
– Prendre en compte du paradigme multi-threading pour le
déboguage.
49. CoursFondamentalduSystemC
14/05/15
49
Introduction (1)
SystemC =
Librairie de classe C++ => Approche objet
Initiative OpenSource: http://www.systemc.org
Modélisation du hard et du soft
Méthodologie de conception et raffinement
des modèles de simulation :
untimed => timed => bus cycle accurate => cycle accurate
Steering Group de 13 companies
9 Université et +50 compagnies participent à
l’initiative
50. CoursFondamentalduSystemC
14/05/15
50
SystemC motivation (intro 2)
Un langage de description d’architectures et
de logiciels
Une méthodologie pour affiner les modèles
de simulation jusqu’à des simulateurs précis
au cycle
Un seul langage pour tous les niveaux
d’abstraction : C, C++
58. CoursFondamentalduSystemC
14/05/15
58
Types de données: avant propos
Les types de C++ peuvent être utilisés mais ne sont pas
adéquate pour le hardware:
SystemC fournis d’autres types qui sont nécessaires
pour la modélisation des systèmes hard-soft. Il
commencent par le préfixe « SC_SC_ »:
61. CoursFondamentalduSystemC
14/05/15
61
Module
Un module (SC_MODULE)(SC_MODULE) est un
container. C’est le block basique du
SystemC.
– Comme entityentity en VHDL
L’interface du module est dans le fichier
header (ending.h)
Fonctionnalités dans le CPP
Module Contient:
– Port
– Signaux et variables internes
– Processus de différents types
– Des méthodes C++
– Instances d’autres modules
– Constructeur
64. CoursFondamentalduSystemC
14/05/15
64
Ports (avant propos)
Les ports sont l’interface externe du module
– Passe des information au et à partir du module
– Contient trois types (in, out, et inout)
– Ports sont toujours mappés au signaux (binding,
port-map)
– Ports sont des membres du module ( de la classe
sc_module)
– Chaque port a un type de donnée passé comme un
template
65. CoursFondamentalduSystemC
14/05/15
65
Déclaration des ports
Les ports sont déclarés dans le module
– La direction du port est spécifiée par son type:
Input sc_in<>sc_in<>
Output sc_out<>sc_out<>
Inout sc_inout<>sc_inout<>
Le type de donnée est passé en paramètre template:
66. CoursFondamentalduSystemC
14/05/15
66
Les signaux (avant propos)
Les signaux sont utilisés pour la communication
Echange les données entre les modules et les
processus.
Il y a un seul type de signaux
Les signaux peuvent ne pas être mappées aux ports
Les signaux peuvent être:
– Des données membres du SC_MODULE
– Utilisés au top pour la connexion entre les modules
Les types de données des signaux sont passés en
paramètre.
86. CoursFondamentalduSystemC
14/05/15
86
Les événement spéciaux
(la classe: sc_event)
Events are special objects which can be specified inside a
module and invoked by thread processes of this module to
synchronize those other threads who are waiting on them.
To declare an event, you have just to instantiate it calling its
constructor without arguments:
sc_eventsc_event my_event;my_event;
To notify this event, you call its member function notify:
– examples
sc_time t( 10, sc_ns );
my_event.notify( t ); // notify in 10 ns
– ex 2
my_event.notify(0); // notify on the next delta cycle