SystemC
SystemC on C++-pohjainen laitteistokuvauskieli, joka mahdollistaa tietokonelaitteiston kuvaamisen perinteisen rekisterisiirtotason (engl. register transfer level, RTL) lisäksi korkeammilla abstraktiotasoilla: järjestelmätasolla (engl. system level) ja transaktiotasolla (engl. transaction level). SystemC sisältää lisäksi simulaatiokernelin, jonka alaisuudessa sille kirjoitettu koodi suoritetaan. SystemC:tä käytetään pääasiassa järjestelmien simulointiin ja verifiointiin, mutta SystemC:llä kirjoitettu koodi voidaan myös syntetisoida tietyin rajoituksin.
Digitaalipiirien suunnittelu monimutkaistuu jatkuvasti transistorien integrointitiheyden kasvaessa Mooren lain tahdissa, josta on syntynyt tarve SystemC:n kaltaisille ilmaisuvoimaisemmille kielille. SystemC on luokkakirjasto joka lisää C++-kieleen laitteistokuvauksessa tarvittavia rakenteita sekä simulaatiokernelin, joka mahdollistaa tarkan rinnakkaisten prosessien ja ajastuksien mallinnuksen. Tämän ansiosta SystemC yhdistää korkean tason ohjelmointikielten suuren ilmaisuvoiman ja olio-ohjelmoinnin tuomat edut perinteisten laitteistokuvauskielten (mm. VHDL, Verilog) tarkkaan laitteiston mallinnukseen. Heikkoutena VHDL:ään ja Verilogiin verrattuna voidaan pitää sitä, että SystemC:llä kirjoitettu koodi ei pääsääntöisesti syntetisoidu yhtä tehokkaasti laitteistoksi.
Ominaisuudet
muokkaaModuulit
muokkaaModuulit ovat SystemC:n vastine järjestelmätason lohkoille jotka suorittavat jonkin tietyn tehtävän. Ohjelmointitekniseltä kannalta moduuli on luokka, joka perii luokalta sc_module tarvitsemansa ominaisuudet toimiakseen simulaatiokernelin alaisuudessa. Moduulit kommunikoivat ulkomaailman kanssa porttien kautta.
Portit
muokkaaPortit ovat moduulien rajapinta ulkomaailmaan silloin kun järjestelmää mallinnetaan RTL-tasolla. Portit voivat olla yksi- (sisään/ulos) tai kaksisuuntaisia, ja niihin voidaan kohdistaa kirjoitus- ja lukuoperaatioita portin tyypistä riippuen. Portti kytketään aina tarkalleen yhteen kanavaan.
Kanavat
muokkaaKanavat välittävät moduulien välistä kommunikaatiota. Yksinkertaisin kanavatyyppi on signaali (sc_signal), joka on yksinkertainen muistiton linja joka vastaa piirilevyllä olevaa johdinta. Jono (sc_fifo) ja puskuri (sc_buffer) –tyyppisillä kanavilla on muistia, joten niihin voidaan kirjoittaa useampia arvoja peräkkäin.
Prosessit
muokkaaProsessit toteuttavat moduulien toiminnallisuuden. Prosesseja on kolmea tyyppiä: metodiprosessit, säieprosessit ja kellotetut säieprosessit. Metodiprosessit ovat funktioita, jotka suoritetaan alusta loppuun silloin kun niiden herkkyyslistaan lisätyllä kanavalla tapahtuu muutos. Säieprosesseja suoritetaan kunnes ne päättyvät tai ne nukuttavat itsensä. Tavallisen säieprosessin herkkyyslistalla voi olla useampia kanavia, kellotettu säieprosessi taas on herkkä vain ja ainoastaan kellosignaalille. Jos järjestelmässä on aktiivisena useita prosesseja kerrallaan, niiden suoritus tapahtuu rinnakkain simulaatiokernelin alaisuudessa, ja niiden aiheuttamat muutokset kanavien tilaan arvioidaan vasta viimeisen prosessin suorituksen päättymisen jälkeen.
Tietotyypit
muokkaaSystemC sisältää myös joukon uusia laitteistoläheisiä perustietotyyppejä normaalien C/C++ -tietotyyppien lisäksi.
Kokonaislukutyypit
- sc_int<>: 1 – 64 –bittinen etumerkillinen kokonaisluku
- sc_uint<>: 1-64 –bittinen etumerkitön kokonaisluku
- sc_bigint<>: yli 64 –bittinen etumerkillinen kokonaisluku
- sc_biguint<>: yli 64 –bittinen etumerkitön kokonaisluku
Logiikkatyypit:
- sc_bit: kaksiarvoinen bitti (tosi (’1’) tai epätosi (’0’))
- sc_logic: neliarvoinen bitti (tosi (’1’), epätosi (’0’), korkea impedanssi (’Z’) tai määrittelemätön (’X’))
- sc_bv<>: vektori kaksiarvoisia bittejä
- sc_lv<>: vektori neliarvoisia bittejä
Kiinteän pisteen tyypit
- sc_fixed<>: etumerkillinen kiinteän pisteen luku
- sc_ufixed<>: etumerkitön kiinteän pisteen luku
- sc_fix: etumerkillinen kiinteän pisteen luku
- sc_ufix: etumerkitön kiinteän pisteen luku
Esimerkki
muokkaaEsimerkki yksinkertaisesta asynkronisesta summaimesta:
#include "systemc.h"
#define WIDTH 32
SC_MODULE(Adder)
{
sc_in<sc_int<WIDTH> > a, b; // sisään tulevat portit
sc_out<sc_int<WIDTH> > sum; // ulos menevä portti
// toiminnallisuuden toteuttava prosessi
void do_add()
{
sum.write(a.read() + b.read());
}
SC_CTOR(Adder)
{
SC_METHOD(do_add); // rekisteröi metodiprosessi simulaatiokernelille
sensitive << a << b; // herkkyyslista prosessille
}
};
Sama esimerkki C++ -tyylisenä ja säieprosessia käyttäen:
#include "systemc.h"
#define WIDTH 32
class Adder : public sc_module
{
sc_in<sc_int<WIDTH> > a, b; // sisään tulevat portit
sc_out<sc_int<WIDTH> > sum; // ulos menevä portti
// toiminnallisuuden toteuttava prosessi
void do_add()
{
while(true)
{
sum.write(a.read() + b.read());
wait();
}
}
SC_HAS_PROCESS(Adder);
Adder(const sc_module_name& name): sc_module(name)
{
SC_THREAD(do_add); // rekisteröi säieprosessi simulaatiokernelille
sensitive << a << b; // herkkyyslista prosessille
}
};
Lähteet
muokkaaTähän artikkeliin tai sen osaan on merkitty lähteitä, mutta niihin ei viitata. Älä poista mallinetta ennen kuin viitteet on lisätty. Voit auttaa Wikipediaa lisäämällä artikkelille asianmukaisia viitteitä. Lähteettömät tiedot voidaan kyseenalaistaa tai poistaa. |
- The IEEE 1666-2005 Standard SystemC Language Reference Manual, The Institute of Electrical and Electronics Engineers, Inc., 2006.
- SystemC Version 2.0 User's Guide, Open SystemC Initiative, 2002.
Aiheesta muualla
muokkaa- Open SystemC Initiative
- IEEE 1666™ Standard SystemC Language Reference Manual (Arkistoitu – Internet Archive)