Introduction au langage System-C
Introduction au langage System-C
2 Le langage System-C
3 Exploration Architecturale
4 Raffinement et Implantation
2
1- Conception des SoC
Définition
Enjeux
Time to market
Coût de réalisation
Domaines d’application des SoC
Exemples
Automobile, Aviation, Téléphonie, …
Méthodologie
Flot de conception
Outils disponibles
3
2- Le langage System-C
Introduction à System-C
Niveaux d’abstraction
Modèles de calcul
Interfaces et canaux
Vérification fonctionnelle
Exemple de plate-forme
4
2- Le langage System-C
Introduction à System-C
Niveaux d’abstraction
Modèles de calcul
Interfaces et canaux
Vérification fonctionnelle
Exemple de plate-forme
5
2- Le langage System-C
Introduction à System-C
Bibliothèque de classes C++ pour la modélisation
de systèmes numériques mixtes
Pleinement compatible avec C++
6
2- Le langage System-C
7
2- Le langage System-C
Téléchargement
Site web: [Link]
Inscription gratuite
Système d’exploitation
Linux
Mac OSX
Windows (avec Visual C++)
Stations Sun ou HP
8
2- Le langage System-C
Documentation
Disponible avec le code source
Language Reference Manual
User Guide
Functional Specification
Application Notes
9
2- Le langage System-C
Téléchargement du logiciel
Commencer par télécharger Microsoft Visual
Studio 2005 or 2008 depuis le site web :
[Link]
Aller à [Link]
Créer un nouveau compte d’utilisateur
Télécharger la bibliothèque SystemC
Aller à “Downloads->OSCI Standards,”
Choisir la section “Current Releases”
Télécharger SystemC 2.2.0 ([Link])
10
2- Le langage System-C
11
2- Le langage System-C
12
2- Le langage System-C
13
2- Le langage System-C
14
2- Le langage System-C
16
2- Le langage System-C
17
2- Le langage System-C
18
2- Le langage System-C
19
2- Le langage System-C
20
2- Le langage System-C
21
2- Le langage System-C
22
2- Le langage System-C
23
2- Le langage System-C
Premier exemple
Compiler et exécuter le compteur fourni
A l’aide de GTKWave, ouvrir le fichier .vcd généré
24
2- Le langage System-C
Premier exemple
Rechercher les signaux à visualiser avec GTKWave
25
2- Le langage System-C
Premier exemple
Rechercher les signaux à visualiser avec GTKWave
26
2- Le langage System-C
Premier exemple
27
2- Le langage System-C
Éléments du langage
28
02/01/2023
29
02/01/2023
SystemC approbation ?
30
02/01/2023
Histoire du SystemC
31
02/01/2023
SystemC 2.0
32
02/01/2023
33
02/01/2023
Exemple de systèmes
34
02/01/2023
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.
35
02/01/2023
Développement en SystemC ()
36
02/01/2023
Principe
37
02/01/2023
Module en interne
38
02/01/2023
Un premier exemple
Voir encore: [Link]/
39
02/01/2023
40
Environnement de Vérification d’un module
02/01/2023
41
02/01/2023
1
INTRODUCTION
42
2- Le langage System-C
43
2- Le langage System-C
44
2- Le langage System-C
45
2- Le langage System-C
Processus
Chaque processus possède une liste de sensibilité
Lorsqu’un port sur cette liste est activé, le processus
en question s’ordonnance pour une exécution
Chaque port décrit son type entre < >
• Exemple: sc_out<int> my_port;
• Exemple d’un tableau de ports :
sc_out<bool> my_array_port[32];
46
2- Le langage System-C
Processus
Il décrit le comportement du module
Pour fins d’initialisation, chaque processus est
exécuté une fois au moment du démarrage, sauf si
on spécifie dont_initialize() dans sa définition
Il existe 3 types de processus:
• SC_METHOD :
– Ce processus se termine toujours
– Ce n’est pas un thread : pas de wait ou de boucle infinie, pas de
suspension d’exécution
– Une procédure ou une routine qui s’exécute en entier lorsqu’un
changement sur la liste de sensibilité survient
47
2- Le langage System-C
Processus
SC_THREAD :
• Peut être suspendu et réactivé, avec un wait
• Contrôle par boucle infinie (le SC_THREAD ne peut pas se
terminer où il ne se réordonnancera pas)
• Possibilité de communications bloquantes telles que la
lecture et écriture dans un FIFO
48
2- Le langage System-C
Processus
SC_CTHREAD
• Cas particulier du SC_THREAD
• La liste de sensibilité n’est constituée que des fronts
montants ou descendants d’une horloge
• Notion de temps: wait(n) (n = nombre de cycles)
• Utilisation classique : machine à états finis
• Les signaux d’entrée sont disponibles immédiatement
49
2- Le langage System-C
50
2- Le langage System-C
Opérateurs
Opérateurs
• Bit ~ & | ^ >> <<
• Arithmétique + - * / %
• Assignation += -= *= /= %= &= |= ^= =
Égalité == !=
Comparaisons < <= > >=
Incrém./Décrém. ++ --
Sélection [] .range(,)
Concaténation (,)
51
2- Le langage System-C
Horloges
Le sc_clock est un objet particulier de SystemC
servant à la synchronisation des événements
Plusieurs horloges sont possibles
Configurable selon:
• Période
• % de temps haut
• Moment et type du premier front
Les processus SC_CTHREAD ont besoin de
l’horloge et utilisent les ports particuliers comme le
sc_in_clk
52
2- Le langage System-C
Canaux de communication
Pour relier les modules entre-eux
Des canaux élémentaires sont déjà inclus
• sc_signal
• sc_buffer
• sc_fifo
• sc_mutex
53
02/01/2023
2
ELÉMENTS DU LANGAGE
SYSTEMC
54
02/01/2023
55
02/01/2023
56
02/01/2023
57
02/01/2023
Le Type Bit
Peut prendre deux valeurs '0‘ ou '1‘.
Utilisé quand modéliser des modules où Z (hi
impedance) or X (unknown) ne sont pas
nécessaires.
Il y a un nombre d’opérateurs logiques que nous
pouvons utiliser
58
02/01/2023
Exemple SC_BIT
59
Simulation de l’exemple sur 02/01/2023
sc_bit
60
02/01/2023
Le type SC_LOGIC
Le type SC_LOGIC
62
02/01/2023
Exemple d’utilisation de
SC_LOGIC
63
02/01/2023
Simulation de SC_LOGIC
25
64
02/01/2023
Exemple d’opérateurs en
SC_LOGIC
65
02/01/2023
Simulation des opérateurs sur
SC_LOGIC
66
Opérations logiques sur X et 02/01/2023
67
02/01/2023
69
02/01/2023
70
02/01/2023
s
eur ion ?
val t
les ula
ont sim
s s après
elle
Qu hées
c
affi
Exemples d’utilisation de sc_bv
71
02/01/2023
72
02/01/2023
Vecteur de sc_logic
(sc_lv)
sc_lv<n>
73
02/01/2023
s
eur ion ?
val t
les ula
ont sim
s s après
elle
Qu hées
c
affi
d’utilisation de sc_lv
Exemples
74
Exemples 02/01/2023
d’utilisation de sc_lv
75
02/01/2023
Le type sc_int
76
02/01/2023
Le type sc_int
Bitwise operators work on operands. The not(~) operator will invert all
bits, and the shift operators will shift left(<<) or right(>>) an operand by
the specified number of bits. Type sc_int can be used with C++ integer
types without restriction.
77
02/01/2023
Le type sc_int
78
02/01/2023
Le type sc_int
79
02/01/2023
Le type sc_int
80
02/01/2023
s
eur ion ?
val t
les ula
ont sim
s s après
elle
Qu hées
c
affi
Exemple sc_int
81
02/01/2023
Exemple sc_int
Interpréter les
résultats !!!!!!!!!!
82
02/01/2023
Le type sc_uint
sc_uint is unsigned integer, and it is fixed
precision integer of size 64 bits.
The underlying operations use 64 bits, but the
result size is determined at object declaration.
Operands of type sc_uint can be converted to
type sc_int and vice versa by using assignment
statements.
When assigning an integer to an unsigned operand, the integer
value in 2's complement form is interpreted as an unsigned
number.
When assigning an unsigned to a signed operand, the unsigned
is expanded to a 64 bit unsigned number and then
truncated to get the signed value.
sc_uint has rich operators as in the case of
sc_int. Look at sc_int for details.
83
02/01/2023
s
eur ion ?
val t
les ula
ont sim
s s après
elle
Qu hées
c
affi
Exemple sc_uint
84
02/01/2023
simulation sc_uint
Interpréter les
résultats
85 !!!!!!!!!!
02/01/2023
Le type sc_bigint
There are time when operands need to be larger than
64 bits. For these types of designs sc_int will not
work. For these cases SystemC provides type
sc_bigint (arbitrary sized signed integer).
sc_bigint allows the designer to work on integers of
any size, limited only by underlying system
limitations. Arithmetic and other operators also use
arbitrary precision when performing operations.
SystemC define's MAX_NBITS in sc_constants.h to
limit the max size of the bits for sc_bigint to 512.
Type sc_bigint is a 2's complement signed integer of
any size.
sc_bigint has rich operators as in the case of sc_int.
Look at sc_int for details.
86
02/01/2023
Le type sc_bigint
87
02/01/2023
Le type sc_biguint
sc_biguint is same as sc_bigint, only difference is
sc_biguint is unsigned.
sc_biguint allows the designer to work on
integers of any size, limited only by underlying
system limitations.
Arithmetic and other operators also use
arbitrary precision when performing operations.
SystemC defines MAX_NBITS in sc_constants.h
to limit the max size of the bits for sc_biguint to
512.
sc_biguint has rich operators as in the case of
sc_int. Look at sc_int for details.
88
02/01/2023
Le type sc_biguint
89
02/01/2023
Module
Un module (SC_MODULE) est
un container. C’est le block
basique du SystemC.
Comme entity en VHDL/module en
Verilog
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
90
02/01/2023
Syntaxe du module
91
02/01/2023
92
02/01/2023
94
02/01/2023
95
02/01/2023
96
02/01/2023
97
02/01/2023
98
02/01/2023
Exemple ports-signaux
99
02/01/2023
100
02/01/2023
Les Variables
101
02/01/2023
Le constructeur
102
Exemple de Constructeur 02/01/2023
103
02/01/2023
104
Processus (avant propos)
02/01/2023
105
02/01/2023
Principes de base
Les événements sont les objets sur lesquels se base toute la
synchronisation des processus. Ils déterminent quand est-ce qu'un
processus doit être déclenché ou réveillé.
Il peuvent représenter des événements concrets (changement d'état
d'un signal), ou abstraits.
Les événements sont des objets très simples, disposant de très peu de
méthodes. Tout ce qu'on peut en faire c'est :les mettre dans les listes
de sensibilité des processus, et, quand on le souhaite, les déclencher
(on dit "notifier"). Un processus qui avait ces événement dans sa liste
de sensibilité est alors réveillé.on peut aussi les annuler...
En fait, ce que fait la méthode sensitive (et ses dérivés), c'est
récupérer un événement associé au signal en question, et c'est cet
événement qui est placé dans la liste de sensibilité. L'événement par
défaut des signaux est inactif a plupart du temps, mais se trouve
activé (on dit "notifié) lors d'un changement d'état du signal.
Autrement dit, quand un signal change d'état, son événement associé
est notifié, et cela réveille le processus qui l'a dans sa liste de
sensibilité.
106
02/01/2023
PROCESSUS
Les processus de SystemC se comportent comme les processus de
Verilog ou VHDL. Ils décrivent la fonctionnalité d'un module.
Ce sont des fonctions membres des modules, de type void f(void). On
ne les appelle pas directement, c'est le scheduler SystemC qui se
charge de les appeler en se basant sur leur liste de sensibilité. Un
processus peut appeler une méthode membre de son module, mais pas
un autre processus.
Les processus utilisent les événements et les canaux pour
communiquer entre eux. Il est possible de faire communiquer des
processus par des variables, mais c'est fortement déconseillé : les
variables sont affectées immédiatement. L'ordre d'exécution des
processus étant indéterminé, cela peut conduire à des conditions de
course (race condition), de l'indéterminisme, des comportements
erratiques, etc.
107
02/01/2023
SC_METHOD (1)
sont, du point de vue du scheduler, des fonctions normales
ils sont appelés par le scheduler à chaque notification d'événement de
leur liste de sensibilité
ils s'exécutent en entier, dans le contexte du scheduler, puis exécutent
un return(), qui redonne la main au scheduler.
Ceci est très important : le scheduler SystemC est multi-thread. Mais les
SC_METHOD ne sont pas des threads. Ce sont des fonctions normales,
que le scheduler appelle les unes après les autres, quand un événement
de leur liste de sensiblité est notifié. Quand le SC_METHOD se termine (
return() ), il redonne la main au scheduler. Si, pour une raison ou pour
une autre, le SC_METHOD ne retourne pas (s'il est bloqué, s'il est dans
une boucle infinie), le scheduler est bloqué, la simulation n'avance
plus !
Les variables locales des SC_METHOD sont donc ré-initialisées à chaque
entrée dans le processus (à moins de les avoir déclarées statiques). Si
le SC_METHOD a besoin de sauvegarder des informations, cela doit être
fait dans des variables ou signaux membre du processus.
Création des SC_METHOD Comme tous les processus, leur création se
fait en 4 étapes :
Déclaration , EnregistrementDéclaration de la liste de sensibilité par
défaut
Implémentation
109
02/01/2023
SC_METHOD (2)
110
02/01/2023
SC_METHOD: sensitivité
111
Exemple de SC_METHOD 02/01/2023
1 //-----------------------------------------------------
2 //
3 // Design Name : first_counter
4 // File Name : first_counter.cpp
5 // Function : This is a 4 bit up-counter with
6 // Synchronous active high reset and
7 // with active high enable signal
8 //-----------------------------------------------------
112
113
02/01/2023
114
02/01/2023
115
02/01/2023
la liste de sensibilité d'un SC_METHOD spécifie quand est-ce qu'il doit être exécuté
la liste de sensibilité d'un SC_THREAD spécifie quand est-ce qu'il doit être réveillé.
Un SC_THREAD est mis en veille par la fonction wait(). Le scheduler SystemC ne fait
avancer les delta_cycle que lorsque tous les SC_THREAD sont en veille. Si un
SC_THREAD se termine (return() ), il ne s'exécute plus. Donc s'il doit ête exécuté de
façon cyclique, à chaque coup d'hologe par exemple, il faut l'implémenter sous forme
d'une boucle infinie (while(1) {...} ), et exécuter wait(clk) là où c'est nécessaire dans
cette boucle.
Lorsqu'un SC_THREAD exécute wait(), il est mis en veille. Il est réveillé sur
notification de sa liste de sensibilité et reprend son exécution là où il en était. Ses
variables locales ont bien entendu gardé leur valeur.
116
02/01/2023
117
02/01/2023
118
02/01/2023
La fonction wait()
119
Exemple SC_THREAD 02/01/2023
120
02/01/2023
121
Mode d’exécution d’une 02/01/2023
SC_THREAD
122
02/01/2023
SC_THREAD exemple
123
02/01/2023
Exemple de SC_CTHREAD
Même exemple: compteur avec
SC_CTHREAD
In this example the positive edge of
the clock is specified so process
incr_count will execute on every
positive edge of the clock.
125
02/01/2023
126
02/01/2023
128
2- Le langage System-C
Exemple : ½ Additionneur
129
2- Le langage System-C
130
2- Le langage System-C
131
2- Le langage System-C
Rappel
Une description SystemC est construite à partir d’une
hiérarchie de modules
Le module (SC_MODULE) contient un ou plusieurs
processus qui implantent son comportement
Hiérarchie structurelle : un module peut contenir
d’autres modules
Le module communique avec l’extérieur grâce à ses
ports d’entrée (sc_in), de sortie (sc_out) et
bidirectionnel (sc_inout)
133
2- Le langage System-C
Processus
Chaque processus possède une liste de sensibilité
Lorsqu’un port sur cette liste est activé, le processus
en question s’ordonnance pour une exécution
Chaque port décrit son type entre < >
• Exemple: sc_out<int> my_port;
• Exemple d’un tableau de ports :
sc_out<bool> my_array_port[32];
134
2- Le langage System-C
Processus
Il décrit le comportement du module
Pour fins d’initialisation, chaque processus est
exécuté une fois au moment du démarrage, sauf si
on spécifie dont_initialize() dans sa définition
Il existe 3 types de processus:
• SC_METHOD :
– Ce processus se termine toujours
– Ce n’est pas un thread : pas de wait ou de boucle infinie, pas de
suspension d’exécution
– Une procédure ou une routine qui s’exécute en entier lorsqu’un
changement sur la liste de sensibilité survient
135
2- Le langage System-C
Processus
SC_THREAD :
• Peut être suspendu et réactivé, avec un wait
• Contrôle par boucle infinie (le SC_THREAD ne peut pas se
terminer où il ne se réordonnancera pas)
• Possibilité de communications bloquantes telles que la
lecture et écriture dans un FIFO
136
2- Le langage System-C
Processus
SC_CTHREAD
• Cas particulier du SC_THREAD
• La liste de sensibilité n’est constituée que des fronts
montants ou descendants d’une horloge
• Notion de temps: wait(n) (n = nombre de cycles)
• Utilisation classique : machine à états finis
• Les signaux d’entrée sont disponibles immédiatement
137
2- Le langage System-C
139
2- Le langage System-C
Exemple 4 : L’additionneur
140
2- Le langage System-C
141