Introduction à SystemC

Simulation et signaux

Tarik Graba

P4 2018-2019

Le simulateur

Le simulateur événementiel

Le simulateur événementiel fait partie de la bibliothèque SystemC.

L’implémentation de référence fournie contient donc tout le nécessaire pour faire des simulations.

Faire avancer la simulation

En SystemC on contrôle l’avancée de la simulation dans le code lui-même.

La fonction principale pour lancer le simulateur est sc_start.

  • Elle ne peut être appelée qu’à partir de sc_main (ou dans une fonction appelée dans sc_main)
  • Elle peut prendre en argument un temps
    • dans ce cas, la simulation avance du temps indiqué
  • Sans argument, la simulation est lancée indéfiniment
    • tant qu’il y a de l’activité,
    • tant que sc_stop n’a pas été appelé.

Visualisation

Il est souvent intéressant de visualiser l’état de la simulation au cours du temps. On peut toujours utiliser les fonctions d’impression standard de C++ car les objets de la bibliothèque SystemC les supportent.

Pour une visualisation graphique, SystemC fournit les fonctions nécessaires à la génération de chronogrammes au format VCD.

Traces VCD en SystemC

Les éléments principaux définis dans la bibliothèque pour générer des traces sont :

  • Le type sc_trace_file pour gérer le fichier de trace
  • La fonction sc_create_vcd_trace_file pour créer le fichier
  • La fonction sc_trace pour ajouter un objet aux objets à tracer
  • La fonction sc_close_vcd_trace_file pour fermer le fichier

La génération des traces se fait ensuite automatiquement durant une simulation. On peut ensuite les voir avec un outil dédié.

Les signaux

Au-delà de simples signaux

Dans une simulation événementielle, pour garantir le déterminisme, nous avons besoin de signaux. Les signaux permettent les affectations différées.

Un signal, possède deux valeurs :

  • la valeur actuelle,
  • la valeur à la fin du cycle de simulation.

Le type sc_signal<T>

SystemC définit le type templaté sc_signal. Le paramètre de template est un type, permettant ainsi de créer des signaux transportant tout type de donnée.

L’implémentation sc_signal<T>

  • 2 valeurs : courante et future
  • 3 méthodes read, write et update
Un sc_signal
Un sc_signal

Quels types peut-on transporter ?

Le type T peut être :

  • Un type standard de C++ (bool, int, …)
  • Un des types définis par SystemC (sc_logic, sc_int, …)
  • Tout type respectant certaines conditions

Un signal d’horloge avec sc_clock

Le type sc_clock est une spécialisation de sc_signal<bool>. Quand la simulation avance, la valeur d’une sc_clock change cycliquement en fonction des paramètres qui lui ont été passés.

On ne peut pas écrire dans un objet de type sc_clock.

Résolution de conflits

Pour modéliser un bus 3 états on doit utiliser des signaux particuliers :

  • sc_signal_resolved équivalent à un sc_signal<sc_logic>
  • sc_signal_rv<N> équivalent à un sc_signal<sc_lv<N> >

Ces signaux supportent plusieurs écrivains et contient des fonctions de résolution.