SystemC

Un article de Wikipédia, l'encyclopédie libre.

Sommaire

[modifier] Introduction

SystemC est souvent présenté comme un langage de description de matériel, au même titre que VHDL ou verilog. En fait, SystemC est un langage de description de plus haut niveau, puisqu'il permet une modélisation de systèmes au niveau comportemental. SystemC n'est pas un langage à part entière mais un ensemble de classes C++ qui introduisent les concepts nécessaires à la modélisation du matériel (par exemple la notion de processus concurrents). Conservant les fonctionnalités du C++, il reste possible de décrire des fonctions purement logicielles. SystemC permet donc de modéliser des systèmes matériels, logiciels, mixtes ou même non-partitionnés. Il est donc particulièrement approprié à la conception de systèmes de type SoC. SystemC intègre également la possibilité de simuler le modèle conçu, puis, par raffinements successifs, d'aboutir à une représentation implémentable.

SystemC a été développé en commun par plusieurs entreprises. A cette fin, l'OSCI (Open SystemC Initiative) a été créé, chargé de diffuser, promouvoir et rédiger les spécifications de SystemC. Depuis Décembre 2005, systemC est standardisé auprès de l'IEEE sous le nom de IEEE 1666™-2005.

[modifier] Structure d'un modèle SystemC

Les différents composants structurels de SystemC seront étudiés en détail plus tard. Mais voici d'ores et déjà un aperçu rapide de la façon dont est construit un modèle SystemC d'un système numérique.

[modifier] Hiérarchie

Comme en Verilog ou VHDL, un système est une hiérarchie d'objets. Généralement, ce sont des modules imbriqués et/ou des processus. Les modules communiquent entre eux par des canaux. Le plus haut de la hiérarchie d'un système complet (module à tester + testbench) n'est pas un module top (comme on en a l'habitude en Verilog/VHDL), mais la fonction SystemC sc_main (l'équivalent du main des programmes en C).

[modifier] Modules

Un module en SystemC est composé d'autres modules, de canaux de communication entre ces modules (signaux, ou canaux plus abstraits), et éventuellement de processus.

[modifier] Ports

Un module possède un ou plusieurs ports. Les ports sont juste des points d'entrée ou de sortie, qui ne font rien de particulier. Par contre, les ports doivent déclarer les fonctions qui seront utilisées pour communiquer à travers eux.

Exemples :

  • un port en entrée destiné à être relié à un signal normal déclare qu'il utilise la fonction read des signaux.
  • un port similaire mais bidirectionnel déclare qu'il utilisera les fonctions read et write
  • un port destiné à être relié à une fifo (un canal de communication abstrait, de haut niveau), déclarera selon le côté de la fifo où il est censé se trouver, qu'il utilisera les fonction read, nb_read (read non bloquant), num_available, write, nb_write, num_free...

La déclaration des fonctions qu'il va utiliser est appelée interface.

[modifier] Interfaces

Une interface est une déclaration des fonctions (ou méthodes, pour prendre la terminologie C++) qui pourront être utilisées à travers les ports d'un module. Une interface ne contient pas de code, c'est seulement une déclaration de fonction. Elle permettent au compilateur de détecter très tôt le branchement d'un port à un canal qui ne lui est pas adapaté.

[modifier] Canaux

Les canaux sont les moyens de communication entre les modules. Ils peuvent être basique et concrets (signaux), ou plus évolués / plus abstraits (fifo, réseau ethernet, ...). Ils peuvent aussi contenir d'autres canaux, voire des modules si ce sont des canaux de très haut niveau.

Les canaux contiennent (entre autres) l'implémentation du code C++ déclaré dans les interfaces. On dit qu'ils implémentent une interface.

On branche un canal à un module par un port, ce port devant déclarer l'interface implémentée par ce canal. Le port est alors lié au canal par une interface, et le contenu du module peut accéder au canal par l'intermédiaire des fonctions déclarées dans l'interface, ce qui est symbolisé dans le schéma ci-dessous par l'image (qui combine port et interface). Tout ce dont a besoin un module pour utiliser un port est l'interface à laquelle il est lié. Autrement dit, on peut modifier à loisir le contenu d'un canal, le raffiner progressivement, sans avoir à toucher quoi que ce soit d'autre. Il suffit que son interface reste la même.

[modifier] Processus

Les processus en SystemC sont similaires à ceux de Verilog et VHDL. Il décrivent une fonctionnalité, un comportement. Un processus ne doit pas être appelé directement; c'est le moteur de simulation SystemC qui se charge de l'appeler (le déclencher) sur certains événements particuliers : ceux qui sont dans sa liste de sensibilité.

Les processus peuvent éventuellement communiquer directement avec les canaux. Ils n'ont pas besoin de port pour cela, ils appellent directement les méthodes du canal.

[modifier] Résumé

En résumé, l'architecture d'un module en SystemC ressemble à ceci :

[modifier] Exemple de code en SystemC

Voici un exemple de code en SystemC (une porte combinatoire AND à trois entrées)

#include "systemc.h"

SC_MODULE(and3)
{
  sc_in<bool> e1;
  sc_in<bool> e2;
  sc_in<bool> e3;
  sc_out<bool> s;

  void compute_and()
  {
    s = e1 & e2 & e3;
  };

  SC_CTOR(and3)
  {
    SC_METHOD(compute_and);
    sensitive << e1 << e2 << e3;
  }
};

[modifier] Liens externes