Programmierbare Logik

SystemC

aus Wikipedia, der freien Enzyklopädie

Wechseln zu: Navigation, Suche

SystemC ist eine Modellierungs- und Simulationssprache insbesondere für die Entwicklung von komplexen elektronischen Systemen, die sowohl Hardware- als auch Softwarekomponenten enthalten.

Im Gegensatz zu reinen Hardwarebeschreibungssprachen (wie VHDL und Verilog-HDL) wird SystemC vorrangig zur Modellierung auf noch höheren Abstraktionsebenen eingesetzt, womit Simulationen um den Faktor 100 bis 1000 schneller werden können und selbst längere Programme, die auf der beschriebenen Hardware ablaufen, mitsimuliert werden können. Aber auch die Modellierung von synthetisierbaren Schaltungen auf dem sogenannten Register Transfer Level sind mit SystemC als Substitut für VHDL oder Verilog möglich. Weitere treibende Vorteile von SystemC sind daneben einerseits die freie Verfügbarkeit als Open Source und andererseits die Verwandtschaft zu der verbreiteten Programmiersprache C++.

SystemC ist keine eigenständige Sprache, sondern eine (Klassen-)Bibliothek für C++. Sie erweitert die Sprache mittels Makros und Funktionen um die notwendigen Mittel, um zusätzlich typische Eigenschaften von Hardware modellieren zu können wie Synchronisation, Parallelität und Interprozesskommunikation. Dieses bringt SystemC den Nachteil eines syntaktischen Overheads ein, den Hardwarebeschreibungssprachen nicht haben. Dafür ist der Entwickler deutlich freier im Ausdruck.

SystemC eignet sich, wie z.B. auch die Modellierungssprache E, für die Modellierung von Protokollen und Peripherie, um anhand dieser die Fehlerfreiheit einer digitalen Schaltung zu überprüfen. Einige Simulationstools wie Modelsim unterstützen SystemC.

Viele Universitäten arbeiten an effizienten Programmen zur Schaltungssynthese aus SystemC-Modellen heraus. Einige Unternehmen bieten Lösungen an, die aus bestimmten SystemC-Codes Netzlisten für ASICs oder FPGAs generieren können. 2005 wurde die Version 2.1 der SystemC-Referenzbeschreibung von der internationalen Ingenieursvereinigung IEEE als Standard ratifiziert.

Inhaltsverzeichnis

[Bearbeiten] Syntax

Da SystemC eine Klassenbibliothek für C++ ist werden hier nur die für SystemC typischen Konstrukte angegeben.

[Bearbeiten] Module

Module dienen dazu, um komplexere Systeme in überschaubare Teile zu gliedern. Sie bilden Bausteine, sind nach außen über Ports zugänglich und können wiederum Module enthalten. Die Syntax lautet

SC_MODULE (Modulname) {
// Modulinhalt
};

Eine Instanz des Moduls wird durch den Konstruktor

SC_CTOR (Modulname) {. . . }

realisiert.

[Bearbeiten] Signale und Ports

Ports bilden die Schnittstelle des Moduls nach außen. Es gibt drei Arten von Ports und als vierten Typ Signale:

sc_in<Porttyp> PortInName; // Eingang
sc_out<Porttyp> PortOutName; // Ausgang
sc_inout<Porttyp> PortInOutName; // Bidirektional
sc_signal<Signaltyp> SigName; // Signal

[Bearbeiten] Prozesse

Die Funktionalität der Module wird durch Prozesse gebildet. Es gibt drei Arten von Prozessen.

Methode-Prozesse werden aufgerufen, wenn sich ein Signal aus der Sensitivitätsliste ändert und übergeben nach ihrer Ausführung die Kontrolle wieder an den Simulator zurück. Durch

SC_METHOD (Funktionsname); 

wird eine bestimmte Funktion, die zuvor im Modul deklariert werden muss, installiert. Die Sensitivitätsliste wird durch

sensitive << Signal1 << Signal2 . . .

erzeugt.

Im Gegensatz zu Methode-Prozessen werden Thread-Prozesse nur einmal gestartet und durchlaufen immer wieder die gleiche Schleife, in der wait()-Kommandos zur vorübergehenden Unterbrechung dienen.

SC_THREAD (Funktionsname);

Clocked-Thread-Prozesse sind synchrone Thread-Prozesse, deren Aktionen erst zur nächsten Taktflanke sichtbar werden. Im Unterschied zu den Thread-Prozessen erfolgt keine Angabe der Sensitivitätsliste sondern das zweite Argument im Aufruf

SC_CTHREAD (Funktionsname, Taktflanke);

spezifiziert, welche Flanke des Taktsignals den Prozess triggert.

[Bearbeiten] Beispiel

Ein Addierer in SystemC:

#include "systemc.h"

SC_MODULE(adder) // Moduldeklaration (eine Art Klasse)
{
  sc_in<int> a, b;        // Ein Eingang, Port genannt
  sc_out<int> sum;        // Ein Ausgangs-Port

  SC_CTOR(adder)
  {
     SC_THREAD(doit);
     sensitive <<a <<b;
  }
     void doit()
     {
       while(true)
       {
         sum.write(a.read() + b.read());
         wait();
       }
     }
};

[Bearbeiten] Siehe auch

[Bearbeiten] Weblinks

Copyright © 2005-2010 Hardware-Aktuell. Alle Rechte vorbehalten.