SystemC

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ładni języka C++.

Struktura

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

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.

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) można znaleźć na stronie OSCI.

Cechy języka

Moduły

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

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

Procesy

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

Kanały

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

Podstawowe kanały:

Interfejs

Wykorzystywany przez porty do komunikacji z kanałami.

Zdarzenia

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

Typy danych

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

Logic types:

Fixed point types:

Przykład

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:

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.

Przypisy

  1. ↑ http://www.systemc.org/

Linki zewnętrzne