SystemC ist keine eigene Programmiersprache, sondern eine C++-Klassenbibliothek und Simulationsumgebung für die Modellierung von Hardware und eingebetteten Systemen. Sie ist als IEEE-Standard 1666 genormt (2005, 2011, 2023) und wird von der Accellera Systems Initiative gepflegt. Mit SystemC beschreiben Entwickler Prozessoren, Speicher, Busse und ganze System-on-Chip-Designs auf einer höheren Abstraktionsebene als mit klassischen Hardwarebeschreibungssprachen wie VHDL oder Verilog.

Grundlagen

Ein SystemC-Modell besteht aus Modulen (SC_MODULE), die über Ports und Signale miteinander verbunden werden. Der Einstiegspunkt ist die Funktion sc_main, die Simulation startet man mit sc_start():

#include "systemc.h"

SC_MODULE(Zaehler) {
  sc_in<bool> clk;
  sc_out<unsigned> wert;
  sc_uint<8> reg;

  void tick() { reg = reg + 1; wert.write(reg); }

  SC_CTOR(Zaehler) {
    SC_METHOD(tick);
    sensitive << clk.pos();
  }
};

int sc_main(int argc, char* argv[]) {
  sc_clock clk("clk", 10, SC_NS);
  sc_signal<unsigned> w;
  Zaehler z("z");
  z.clk(clk); z.wert(w);
  sc_start(100, SC_NS);
  return 0;
}

Wichtige Konstrukte

  • SC_METHOD – ereignisgesteuerter Prozess ohne eigenen Stack (schnell, aber zustandslos)
  • SC_THREAD / SC_CTHREAD – Thread-Prozesse mit eigenem Stack; CTHREAD für taktsynchrone Abläufe
  • sc_signal, sc_in, sc_out, sc_inout – Verbindungselemente und Ports
  • sc_clock, sc_time – Takt- und Zeitmodellierung
  • sc_uint, sc_bv – Bitvektoren und Ganzzahltypen fester Breite

Transaction Level Modeling (TLM)

Der TLM-2.0-Standard ergänzt SystemC um eine abstrakte Transaktionsmodellierung: Kommunikationspartner tauschen Transaktionen (Generic Payload) über Sockets aus, ohne Signale im Detail zu modellieren. Dadurch laufen Simulationen von virtuellen Prototypen um Größenordnungen schneller als RTL-Simulationen.

Verwandte Grundlagen: C/C++-Befehle, VHDL-Befehle, Chisel-Befehle (Hardware-Konstruktionssprache), SpinalHDL-Befehle.