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++.
Spis treści |
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.
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) znajdziesz na stronie OSCI[1].
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 umożliwiają komunikację między wejściem a wyjściem.
Są głównym elementem obliczeń. Wykonywane jednocześnie.
Mogą być one zarówno prostymi połączeniami albo złożonymi mechanizmami komunikacji takimi jak FIFO (First In-First Out).
Podstawowe kanały:
Wykorzystywany przez porty do komunikacji z kanałami.
Muszą być zdefiniowane podczas inicjowania. Umożliwiają synchronizację pomiędzy procesami.
SystemC wprowadza kilka typów danych, które wspierają modelowanie sprzętu. Extended standard types:
Logic types:
Fixed point types:
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.