Modélisation TLM en SystemC : Différence entre versions

De Ensiwiki
Aller à : navigation, rechercher
(lien vers kiosk)
(Installer les outils sur une machine personnelle)
 
(47 révisions intermédiaires par 5 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
 
<!-- {{Maintenance par enseignants}} -->
 
<!-- {{Maintenance par enseignants}} -->
== Sur le Kiosk ==
+
__TOC__
  
* http://intranet.ensimag.fr/KIOSK/Telecom/3A/ACE/SystemC/ : la page du Kiosk sur SystemC/TLM
+
<span id="git"></span>
 +
== Supports de cours (Git) ==
 +
 
 +
Les supports de cours (transparents, exemples de code, ...) sont disponibles sous la forme d'un dépôt Git. Le dépôt est hébergé sur github. Vous pouvez consulter le contenu en ligne à l'URL http://github.com/fpetrot/cours-tlm
 +
 
 +
Pour récupérer l'ensemble des fichiers (à faire une fois, au début du cours) :
 +
 
 +
<nowiki>git clone git@gitlab.ensimag.fr:petrotf/cours-tlm.git</nowiki>
 +
 
 +
Pour récupérer la dernière version (le contenu évoluera au fur et à
 +
mesure du cours) :
 +
 
 +
git pull
 +
 
 +
Plus d'information sur Git : [[Git]].
 +
 
 +
Pour utiliser Git entre vous (pour travailler à plusieurs sur vos TPs), voir la page : [[Dépôt Git partagé et dépôt en lecture seule]].
 +
 
 +
== Supports pour la partie HLS ==
 +
* Transparents du cours : [[media:coursHLS.pdf‎|coursHLS.pdf]]
 +
 
 +
* TP : [[media:tpHLS.pdf|Sujet]] et [[media:tpHLS.tgz|sources]]
  
 
== Ressources sur le web ==
 
== Ressources sur le web ==
  
* http://www.systemc.org : le site de SystemC et TLM
+
* http://www.accellera.org/downloads/standards/systemc : le site du consortium Accellera, qui agit pour la standardisation de SystemC et TLM
 
* http://www.doulos.com/knowhow/systemc/tlm2/ : tutorial abordable sur TLM-2
 
* http://www.doulos.com/knowhow/systemc/tlm2/ : tutorial abordable sur TLM-2
 +
* http://standards.ieee.org/getieee/1666/download/1666-2011.pdf : Le standard IEEE pour SystemC
  
== FAQ sur l'utilisation de TLM/SystemC ==
+
== Anales d'examens ==
 +
 
 +
Des anales avec corrigés partiels sont disponibles dans le répertoire {{Url Git tlm|basedir=exam}} de l'archive Git.
 +
 
 +
== FAQ sur l'utilisation de SystemC/TLM ==
 +
 
 +
=== Installer les outils sur une machine personnelle ===
 +
 
 +
* Pour les TPs en général : [[Installer SystemC et TLM]]
 +
 
 +
* Pour le TP1 : Bibliothèque X11 et en-têtes (libx11-dev sous Debian et Ubuntu)
 +
 
 +
* Pour le T2 :
 +
** [[Installer une chaine de cross-compilation RISC-V]]
 +
** Bibliothèque SDL2 (libsdl2-dev sous Debian ou Ubuntu)
 +
 
 +
Pour tester que l'installation est complète :
 +
 
 +
./TPs/test-install/test-install.sh
 +
 
 +
=== Utilisation de SystemC et TLM sur les machines de l'Ensimag ===
 +
 
 +
Les bibliothèques SystemC et TLM sont installées dans <code>/matieres/5MMMTSP/tlm/</code>. Pour les utiliser, faites simplement :
 +
 
 +
source /matieres/5MMMTSP/tlm/setup-ensimag.sh
 +
 
 +
ceci définira une variable <code>$SYSTEMCROOT</code> qui pointe sur le répertoire où SystemC et TLM sont installés, et place la chaine de cross-compilation MicroBlaze dans votre <code>$PATH</code>. Ces variables sont utilisées dans les Makefiles fournis pour les TPs et les exemples. Par exemple, pour compiler le petit exemple de rendez-vous (<code>cours-tlm</code> est un clone du [[#git|dépôt Git du cours]]) :
 +
 
 +
<pre>
 +
cd cours-tlm
 +
cd code/rendezvous/
 +
source /matieres/5MMMTSP/tlm/setup-ensimag.sh
 +
make
 +
./run.x
 +
</pre>
  
 
=== Messages d'erreur de G++ ===
 
=== Messages d'erreur de G++ ===
  
 
; <nowiki>error: `sc_time' has not been declared</nowiki>:
 
; <nowiki>error: `sc_time' has not been declared</nowiki>:
Vous vouliez probablement dire <code>sc_core::sc_time</code> (ou bien utiliser "<code>using namespace sc_core;</code>")
+
; <nowiki>error: expected class-name before ',' token</nowiki>:
 +
; <nowiki>error: expected class-name before ‘{’ token</nowiki>:
 +
; <nowiki>error: expected ‘)’ before ‘name’</nowiki>:
 +
Vous vouliez probablement dire <code>sc_core::sc_time</code> ou <code>sc_core::sc_module</code>(ou bien utiliser "<code>using namespace sc_core;</code>")
  
; <nowiki>error: no matching function for call to `tlm_utils::simple_target_socket<...>::register_b_transport(...)'</nowiki>:
+
; <nowiki>target_socket.h:66: error: ‘struct Memory’ has no member named ‘read’</nowiki>:
Vous avez probablement déclaré la méthode b_transport du mauvais type (attention, le moindre <code>const</code> compte !)
+
Vous avez probablement déclaré la méthode <code>read</code> du mauvais type (attention, le moindre <code>const</code> compte !)
  
; <nowiki>simple_target_socket.h:173: error: invalid use of undefined type `struct sc_core::sc_spawn_options'</nowiki>:
+
; <nowiki>error: ‘SC_CURRENT_USER_MODULE’ has not been declared</nowiki>:
Avez-vous bien pensé à mettre <code>#define SC_INCLUDE_DYNAMIC_PROCESSES</code> avant ''toutes'' les occurences de <code>#include <systemc></code> ? (si vous utilisez <code>#include <basic.h></code>, c'est fait pour vous).
+
Il manque la macro <code>SC_HAS_PROCESS(nom-du-module)</code> dans la déclaration du module.
 +
 
 +
; Numéro de ligne incorrect dans les messages d'erreur
 +
Il arrive, vraisemblablement à cause d'un bug de GCC, que les messages d'erreurs utilisent des numéros de ligne fantaisistes (par exemple, un numéro de ligne plus grand que le nombre de ligne du fichier). On peut contourner ce bug en ajoutant <code>-no-internal-preprocessor</code> aux <code>CXXFLAGS</code> dans le Makefile.
  
 
; autre:
 
; autre:
Voir la page [[Les Erreurs de GCC]].
+
Voir la page [[Les Erreurs de GCC]]. N'hésitez pas à ajouter d'autres messages ici.
 +
 
 +
=== Erreurs à l'exécution ===
 +
 
 +
<pre>
 +
Error: (E115) sc_signal<T> cannot have more than one driver:
 +
signal `IRQ' (sc_signal)
 +
first driver `Generator1.compute' (sc_thread_process)
 +
second driver `LCDC.compute' (sc_thread_process)
 +
</pre>
 +
 
 +
Cette erreur arrive lorsque plusieurs composants tentent d'écrire sur le même <code>sc_signal</code> (dans le cas ci-dessus, un composant a levé un signal d'interruption, et le processeur, via une transaction sur le bus, va exécuter un morceau de code qui redescend le signal. Ce dernier morceau de code se trouve dans le composant LDCD, mais il est exécuté dans le contexte de Generator1, d'où l'erreur).
 +
 
 +
La solution est d'instancier le <code>sc_signal</code> comme ceci :
 +
 
 +
  sc_signal<bool,SC_MANY_WRITERS> irq_signal("IRQ");
 +
 
 +
pour autoriser explicitement cet accès.
 +
 
 +
=== <systemc.h> ou <systemc> ? ===
 +
 
 +
Certains programme utilisent
 +
 
 +
  #include <systemc.h>
 +
 
 +
d'autres
 +
 
 +
  #include <systemc>
 +
 
 +
En fait, <code>systemc.h</code> est la forme obsolète, qui fait à peu près la même chose que <code>systemc</code>-sans-le-point-h, mais aussi des <code>using namespace ...;</code> qui facilitent la vie, mais qui sont reconnus universellement comme étant une mauvaise pratique dans les fichiers <code>.h</code>.
 +
 
 +
== Erreurs fréquentes dans les TPs ==
 +
 
 +
=== <div id="tabs"></div>Indentation avec des mélanges de tabs et d'espaces ===
 +
 
 +
Cf. [[Écrire du code de qualité#tabs]].
 +
 
 +
=== <div id="commentaires"></div>Trop de commentaires ===
 +
 
 +
cf. [[Écrire du code de qualité#commentaires]].
 +
 
 +
=== <div id="lignes-longues"></div>Lignes trop longues ===
 +
 
 +
cf. [[Écrire du code de qualité#lignes-longues]].
  
 
[[Catégorie:Informatique]]
 
[[Catégorie:Informatique]]
 
[[Catégorie:Troisième Année]]
 
[[Catégorie:Troisième Année]]
 
[[Catégorie:SLE]]
 
[[Catégorie:SLE]]
 +
[[Catégorie:Modélisation TLM en SystemC]]

Version actuelle en date du 22 novembre 2019 à 08:29

Supports de cours (Git)

Les supports de cours (transparents, exemples de code, ...) sont disponibles sous la forme d'un dépôt Git. Le dépôt est hébergé sur github. Vous pouvez consulter le contenu en ligne à l'URL http://github.com/fpetrot/cours-tlm

Pour récupérer l'ensemble des fichiers (à faire une fois, au début du cours) :

git clone git@gitlab.ensimag.fr:petrotf/cours-tlm.git

Pour récupérer la dernière version (le contenu évoluera au fur et à mesure du cours) :

git pull

Plus d'information sur Git : Git.

Pour utiliser Git entre vous (pour travailler à plusieurs sur vos TPs), voir la page : Dépôt Git partagé et dépôt en lecture seule.

Supports pour la partie HLS

Ressources sur le web

Anales d'examens

Des anales avec corrigés partiels sont disponibles dans le répertoire exam/ de l'archive Git.

FAQ sur l'utilisation de SystemC/TLM

Installer les outils sur une machine personnelle

  • Pour le TP1 : Bibliothèque X11 et en-têtes (libx11-dev sous Debian et Ubuntu)

Pour tester que l'installation est complète :

./TPs/test-install/test-install.sh

Utilisation de SystemC et TLM sur les machines de l'Ensimag

Les bibliothèques SystemC et TLM sont installées dans /matieres/5MMMTSP/tlm/. Pour les utiliser, faites simplement :

source /matieres/5MMMTSP/tlm/setup-ensimag.sh

ceci définira une variable $SYSTEMCROOT qui pointe sur le répertoire où SystemC et TLM sont installés, et place la chaine de cross-compilation MicroBlaze dans votre $PATH. Ces variables sont utilisées dans les Makefiles fournis pour les TPs et les exemples. Par exemple, pour compiler le petit exemple de rendez-vous (cours-tlm est un clone du dépôt Git du cours) :

cd cours-tlm
cd code/rendezvous/
source /matieres/5MMMTSP/tlm/setup-ensimag.sh
make
./run.x

Messages d'erreur de G++

error: `sc_time' has not been declared
error: expected class-name before ',' token
error: expected class-name before ‘{’ token
error: expected ‘)’ before ‘name’

Vous vouliez probablement dire sc_core::sc_time ou sc_core::sc_module(ou bien utiliser "using namespace sc_core;")

target_socket.h:66: error: ‘struct Memory’ has no member named ‘read’

Vous avez probablement déclaré la méthode read du mauvais type (attention, le moindre const compte !)

error: ‘SC_CURRENT_USER_MODULE’ has not been declared

Il manque la macro SC_HAS_PROCESS(nom-du-module) dans la déclaration du module.

Numéro de ligne incorrect dans les messages d'erreur

Il arrive, vraisemblablement à cause d'un bug de GCC, que les messages d'erreurs utilisent des numéros de ligne fantaisistes (par exemple, un numéro de ligne plus grand que le nombre de ligne du fichier). On peut contourner ce bug en ajoutant -no-internal-preprocessor aux CXXFLAGS dans le Makefile.

autre

Voir la page Les Erreurs de GCC. N'hésitez pas à ajouter d'autres messages ici.

Erreurs à l'exécution

Error: (E115) sc_signal<T> cannot have more than one driver: 
 signal `IRQ' (sc_signal)
 first driver `Generator1.compute' (sc_thread_process)
 second driver `LCDC.compute' (sc_thread_process)

Cette erreur arrive lorsque plusieurs composants tentent d'écrire sur le même sc_signal (dans le cas ci-dessus, un composant a levé un signal d'interruption, et le processeur, via une transaction sur le bus, va exécuter un morceau de code qui redescend le signal. Ce dernier morceau de code se trouve dans le composant LDCD, mais il est exécuté dans le contexte de Generator1, d'où l'erreur).

La solution est d'instancier le sc_signal comme ceci :

 sc_signal<bool,SC_MANY_WRITERS> irq_signal("IRQ");

pour autoriser explicitement cet accès.

<systemc.h> ou <systemc> ?

Certains programme utilisent

 #include <systemc.h>

d'autres

 #include <systemc>

En fait, systemc.h est la forme obsolète, qui fait à peu près la même chose que systemc-sans-le-point-h, mais aussi des using namespace ...; qui facilitent la vie, mais qui sont reconnus universellement comme étant une mauvaise pratique dans les fichiers .h.

Erreurs fréquentes dans les TPs

Indentation avec des mélanges de tabs et d'espaces

Cf. Écrire du code de qualité#tabs.

Trop de commentaires

cf. Écrire du code de qualité#commentaires.

Lignes trop longues

cf. Écrire du code de qualité#lignes-longues.