SystemC

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

SystemC jest językiem opisu systemów cyfrowych. Na niższych poziomach opisu jest wzorowany na popularnych językach opisu sprzętu (VHDL, Verilog); wyższe poziomy opisu pozwalają używać prawie wszystkie zasoby języka C++. SystemC jest stosowany do modelowania z poziomu systemu (system-level modeling), modelowania wydajności, rozwoju oprogramowania, weryfikacji funkcjonalności. Powiązany jest on zarówno z projektowaniem ESL (Electronic System Level) jak i TLM (Transaction-level modelnig).

Pozwala symulować (odtwarzać fikcyjne) zdarzenia w jądrze. Te udogodnienia pozwalają projektantowi na symulację aktualnych procesów, z których każdy opisany jest przy pomocy prostej składki języka C++.

Struktura[edytuj | edytuj kod]

SystemC jest biblioteką klas i szablonów napisanych w C++, dodającą implementacje współbieżności, czasu symulacji, modularności, kanałów komunikacyjnych, interfejsów i innych elementów niezbędnych w opisach systemów cyfrowych.

Wersje SystemC[edytuj | edytuj kod]

Biblioteka klas SystemC została opracowana w celu wsparcia projektowania na poziomie systemu. Jest ona kompatybilna zarówno z platformą Windows jak i POSIX, jest również w pełni darmowa. System ten wydawany jest w etapach.

  • Wersja 1.0 (28.03.2000 r.) (obecnie 1.0.2) zawiera wszystkie niezbędne ułatwienia modelowania obiektów do opisu systemów podobnych do tych, które można opisać za pomocą języka sprzętu, takich jak VHDL. Zawiera także jądro symulacji, typy danych odpowiednie dla stałych arytmetycznych, kanały komunikacyjne oraz moduły rozbicia projektu na mniejsze części.
  • W wersji 2.0 (01.02.2001 r.) (aktualnie wersja 2.0.1 (03.06.2003 r.) ), biblioteka klas była sukcesywnie ponownie zapisywana, aby zapewnić uaktualnienie projektowania na poziomie systemu. Funkcje, które były wbudowane w wersji 1.0, takie jak sygnały, są obecnie wbudowane w podstawowe struktury kanałów, interfejsów i portów.
  • Wersja 2.1 (06.06.2005 r.) dodaje kilka dodatkowych cech, takich jak zdolność do odradzania procesów po starcie symulacji oraz dodatkowe wywołania zwrotne operacji na jądrze. W 2005 roku język stał się standardem IEEE 1666-2005. Aktualnie dostępna jest wersja 2.2, w pełni kompatybilna ze standardem IEEE.
  • W przyszłości, w wersji 3.0 systemC zostanie rozszerzony o modelowanie systemów operacyjnych, w celu wsparcia rozwoju modeli z wbudowanym oprogramowaniem.

Biblioteka klas SystemC została opracowana przez grupę firm tworzących Open SystemC Initiative (OSCI). Więcej informacji, a także kod źródłowy (całkowicie darmowy) znajdziesz na stronie OSCI[1].

Cechy języka[edytuj | edytuj kod]

Moduły[edytuj | edytuj kod]

Moduły to podstawowe elementy budulcowe hierarchii projektowania języka SystemC. Model ten przeważnie zwiera kilka modułów, które komunikują się między sobą przy pomocy portów.

Porty[edytuj | edytuj kod]

Porty umożliwiają komunikację między wejściem a wyjściem.

Procesy[edytuj | edytuj kod]

Są głównym elementem obliczeń. Wykonywane jednocześnie.

Kanały[edytuj | edytuj kod]

Mogą być one zarówno prostymi połączeniami albo złożonymi mechanizmami komunikacji takimi jak FIFO (First In-First Out).

Podstawowe kanały:

  • signal;
  • buffet;
  • fifo;
  • mutex;
  • semaphore.

Interfejs[edytuj | edytuj kod]

Wykorzystywany przez porty do komunikacji z kanałami.

Zdarzenia[edytuj | edytuj kod]

Muszą być zdefiniowane podczas inicjowania. Umożliwiają synchronizację pomiędzy procesami.

Typy danych[edytuj | edytuj kod]

SystemC wprowadza kilka typów danych, które wspierają modelowanie sprzętu. Extended standard types:

  • sc_int<> 64-bit signed integer
  • sc_uint<> 64-bit unsigned integer
  • sc_bigint<> arbitrary precision signed integer
  • sc_biguint<> arbitrary precision unsigned integer

Logic types:

  • sc_bit 2-valued single bit
  • sc_logic 4-valued single bit
  • sc_bv<> vector of sc_bit
  • sc_lv<> vector of sc_logic

Fixed point types:

  • sc_fixed<> templated signed fixed point
  • sc_ufixed<> templated unsigned fixed point
  • sc_fix untemplated signed fixed point
  • sc_ufix untemplated unsigned fixed point

Przykład[edytuj | edytuj kod]

Poniższy przykład prezentuje implementację bramki EXOR przy pomocy bramek NAND. Należy zwrócić uwagę, iż jest to jeden z prostszych przykładów, lecz jest bardzo przejrzysty i zrozumiały.

Pierwszym krokiem jest stworzenie bramek NAND. Bramki te są kombinacją pętli; elementem wyjściowym są wyłącznie wartości funkcji podawanych na wejściu. Układ nie posiada pamięci oraz nie wymaga licznika. Dzięki temu, zaprezentowany model może użyć najprostszego rodzaju Systemu, czyli SC_METHOD. SC_METHOD to najzwyklejsze funkcje z języka C++, przez co biblioteka klas SystemC zmusza je do zachowywania się jak procesy, w szczególności:

  • biblioteka klas Systemu zawiera jądro symulacji – fragment kodu odpowiedzialny za wzywanie funkcji (wraz z upływem czasu) do obliczania wyników, kiedy dochodzi do zmiany wartości danych wejściowych;
  • funkcja musi być zadeklarowana jako zmienna SC_METHOD i musi reagować na zmianę danych wejścia.


Poniżej znajduje się przykład bramki NAND (zapis do pliku nand.h)

#include "systemc.h"
SC_MODULE(nand2) // declare nand2 sc_module
{
  sc_in<bool> A, B;       // input signal ports
  sc_out<bool> F;         // output signal ports
 
  void do_nand2()         // a C++ function
  {
    F.write( !(A.read() && B.read()) );
  }
 
  SC_CTOR(nand2)          // constructor for nand2
  {
    SC_METHOD(do_nand2);  // register do_nand2 with kernel
    sensitive << A << B;  // sensitivity list
  }
};


Bramka EXOR zbudowana jest z czterech kopii bramki NAND. Zostało to osiągnięte za pomocą konstruktora bramki EXOR łączącego bramki NAND. Bramka EXOR:

#include "systemc.h"
#include "nand2.h"
SC_MODULE(exor2)
{
  sc_in<bool> A, B;
  sc_out<bool> F;
 
  nand2 n1, n2, n3, n4;
 
  sc_signal<bool> S1, S2, S3;
 
  SC_CTOR(exor2) : n1("N1"), n2("N2"), n3("N3"), n4("N4")
  {
    n1.A(A);
    n1.B(B);
    n1.F(S1);
 
    n2.A(A);
    n2.B(S1);
    n2.F(S2);
 
    n3.A(S1);
    n3.B(B);
    n3.F(S3);
 
    n4.A(S2);
    n4.B(S3);
    n4.F(F);
  }
};

Początek deklaracji wygląda bardzo podobnie do bramki NAND, jednak zawiera dodatkowo bibliotekę nand2.h.

Linki zewnętrzne[edytuj | edytuj kod]