SystemC reprezintă o bibliotecă de clase a limbajului C++ ce dă facilitatea simulării aplicațiilor bazate pe evenimente și a proceselor paralele. Limbajul oferă posibilitatea inginerilor să simuleze procese paralele și concurente folosind un mediu simulat ce beneficiază de toate facilitățile limbajului de programare C++(tipuri de date, librării, programare orientată pe obiecte, template, e.t.c. ). Limbajul SystemC este folosit în special pentru modelarea comportamentală a sistemelor software sau hardware ce conțin evenimente paralele, modelarea performanțelor sistemelor cu evenimente paralele, medii automate de verificare pentru circuite digitale sau mixt-signal. SystemC este un limbaj asemanator cu limbajele HDL Verilog sau VHDL, ce sunt folosite pentru proiectarea sistemelor hardware digitale, dar spre deosebire de aceste limbaje, limbajul SystemC este folosit pentru a descrie și valida un concept de sistem ce conține evenimente paralele (cum sunt toate sistemele hardware), și nu pentru a proiecta efectiv sistemul.

SystemC este definit și promovat de către OSCI (Open System C Initiative) împreună cu organizația de standardizare Accellera [1], și a fost aprobat de către IEEE Standards Association, ca IEEE 1666 Standard SystemC Language Reference Manual [2]. SystemC LRM(Language Reference Manual) descrie sintaxa standard a limbajului SystemC. Pentru utilizarea SystemC, OSCI pune la dispozitie un simulator open-source, disponibil pentru a fi utilizat într-un mediu bazat pe eclipse și cygwin, sau un mediu bazat pe Visual Studio .NET [3]. De altfel OSCI a lăsat liberă utilizarea comercială a standardului, și astfel toate companiile producatoare de software pentru simulare (MentorGraphics, Cadence, Synopsys) au implementat standardul IEEE 1666 în propriile medii.

Componentele limbajului modificare

Module modificare

Modulul este componentă de baza a limbajului SystemC. Este similar cu o simplă clasa, dar are elemente necesare pentru modelarea comportamentului hardware. Un model comportamental SystemC, în general, conține mai multe module ce comunică între ele prin porturi.

Semnale modificare

Un semnal modelează comportamentul unui “fir” într-un circuit electronic.

Porturi modificare

Porturile au rolul de a transmite informația din interiorul unui modul în exteriorul său, la un alt modul, la care este conectat.

Procese modificare

Procesele sunt poate cele mai importante elemente ale limbajului. Sunt entități ce sunt executate în paralel, de către simulator. Cu ajutorul lor se pot modela evenimentele paralele și concurente.

Canale modificare

Canalele reprezintă sistemele de comunicație între procese ale limbajului SystemC. Pot fi simple fire sau mecanisme de comunicație și control mai complexe, cum ar fi mecanismele pentru comunicația între procese concurente (semafor, mailbox, FIFO, buffer, e.t.c.).

Evenimente modificare

Sunt folosite la sincronizarea proceselor.

Tipuri de date modificare

SystemC suportă toata gama de tipuri de date a limbajului C++ dar în plus sunt introduse anumite tipuri de date speciale pentru modelarea hardware:

  1. Tipuri logice:
    • sc_bit - tip pentru modelarea unui singur bit; poate lua ca valori 1,0;
    • sc_logic - tip pentru modelarea reala a unui bit; poate lua ca valori 1,0,X,Z;
    • sc_bv<> - tip pentru modelarea unui vector de tip sc_bit;
    • sc_lv<> - tip pentru modelarea unui vector de tip sc_logic;
  2. Tipuri pentru virgula fixa:
    • sc_fixed<> - template pentru date în virgulă fixă cu semn;
    • sc_ufixed<> - template pentru date în virgulă fixă fără semn;
    • sc_fix - date în virgulă fixă cu semn;
    • sc_ufix - date în virgulă fixă fără semn;

Exemplu modificare

Exemplu de modelare a doua sumatoare ce funcționează în paralel, independent unul fața de altul

#include "systemc.h"

SC_MODULE(adunare) 		// declarare modul adunare
{
  sc_in<int> a1, b1, a2, b2;            // porturi de intrare in modul
  sc_out<int> suma1, suma2;		// porturi de iesire din modul
 
  void adunare_1()           		// proces adunare 1
  {
    suma1.write(a1.read() + b1.read());
  }

  void adunare_2()           		// proces adunare 2
  {
    suma2.write(a2.read() + b2.read());
  }

 
  SC_CTOR(adder)                        // constructor
  {
        SC_METHOD(adunare_1);           // inregistreaza procesul adunare_1 in kernel-ul SystemC
        sensitive << a1 << b1;          // lista de senzitivitati pentru procesul adunare_1

        SC_METHOD(adunare_2);           // integistreaza procesul adunare_2 in kernel-ul SystemC    
        sensitive << a2 << b2;          // lista de senzitivitati pentru procesul adunare_2
  }

};

Note modificare

  1. ^ Open SystemC Initiative website
  2. ^ IEEE 1666 Standard SystemC Language Reference Manual
  3. ^ Kim Bjerge „Guide for getting started with SystemC”, Danish technological institute, 2007