Bevezetés A SystemC célja A SystemC alapjai SystemC típusok Modulok Rendszerek Csatornák. Budapesti Műszaki és Gazdaságtudományi Egyetem

Hasonló dokumentumok
Rendszerszintű tervezés: SystemC I.

VII. Tesztkörnyezet felépítése

IV. A SystemC alapelemei

MIKROELEKTRONIKA, VIEEA306

III. Alapfogalmak és tervezési módszertan SystemC-ben

Hardver modellezés SystemC-vel és SDL grafikus könyvtárral Visual Stúdió alatt

A SystemC programok adattípusai

Laborgyakorlat 3 A modul ellenőrzése szimulációval. Dr. Oniga István

5. KOMBINÁCIÓS HÁLÓZATOK LEÍRÁSÁNAK SZABÁLYAI

Budapesti Műszaki és Gazdaságtudományi Egyetem. A Verilog HDL II. Nagy Gergely. Elektronikus Eszközök Tanszéke (BME) szeptember 26.

Hardver leíró nyelvek (HDL)

Mintavételes szabályozás mikrovezérlő segítségével

Occam 1. Készítette: Szabó Éva

8.3. AZ ASIC TESZTELÉSE

C++ programozási nyelv Konstruktorok-destruktorok

Programozás II. 2. Dr. Iványi Péter

és az instanceof operátor

ISA szimulátor objektum-orientált modell (C++)

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Programozás C és C++ -ban

OOP #14 (referencia-elv)

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

SysCVideo: fiktív grafikus kártya SystemC modulként, SDL alapú megjelenítéssel

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

OOP. Alapelvek Elek Tibor

Digitális elektronika gyakorlat

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Digitális technika (VIMIAA02) Laboratórium 5

Digitális technika (VIMIAA02) Laboratórium 5

Java II. I A Java programozási nyelv alapelemei

C++ programozási nyelv

Programozás II. 4. Dr. Iványi Péter

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Elektronika, 5. gyakorlat: algoritmikus C szintézis

Digitális technika (VIMIAA02) Laboratórium 4

Felhasználó által definiált adattípus

Újrakonfigurálható eszközök

Pénzügyi algoritmusok

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Szövegek C++ -ban, a string osztály

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD)

Pénzügyi algoritmusok

C# Szálkezelés. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Szálkezelés / 21

A C# PROGRAMOZÁSI NYELV

Programozás C++ -ban

Apple Swift kurzus 3. gyakorlat

Digitális eszközök típusai

Programozás C++ -ban 2007/4

Kombinációs áramkörök modelezése Laborgyakorlat. Dr. Oniga István

C++ programozási nyelv

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

500. AA Megoldó Alfréd AA 500.

Újrakonfigurálható technológiák nagy teljesítményű alkalmazásai

Pénzügyi algoritmusok

A C# programozási nyelv alapjai

.Net adatstruktúrák. Készítette: Major Péter

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Digitális technika (VIMIAA02) Laboratórium 4

Modellező eszközök, kódgenerálás

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Verilog HDL ismertető 2. hét : 1. hét dia

Labor gyakorlat Mikrovezérlők

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Már megismert fogalmak áttekintése

A modell-ellenőrzés gyakorlata UPPAAL

Perifériák hozzáadása a rendszerhez

Bevezetés a programozásba I.

Digitális technika (VIMIAA02) Laboratórium 1

LOGIKAI TERVEZÉS HARDVERLEÍRÓ NYELVEN. Előadó: Dr. Oniga István

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

Fejlett programozási nyelvek C++ Iterátorok

7. fejezet: Mutatók és tömbök

Tartalom Tervezési egység felépítése Utasítások csoportosítása Értékadás... 38

Digitális technika (VIMIAA02) Laboratórium 1

Az UPPAAL egyes modellezési lehetőségeinek összefoglalása. Majzik István BME Méréstechnika és Információs Rendszerek Tanszék

Bevezetés a programozásba 2

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Mérési jegyzőkönyv. az ötödik méréshez

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Vé V g é r g e r h e a h j a tá t s á i s s z s ál á ak a Runnable, Thread

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Labor gyakorlat Mikrovezérlők

Webprogramozás szakkör

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD)

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

3. Osztályok II. Programozás II

6. hét: A sorrendi hálózatok elemei és tervezése

OOP: Java 8.Gy: Abstract osztályok, interfészek

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

128. AA Megoldó Alfréd AA 128.

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

A Memory Interface Generator (MIG) beállítása a Logsys Kintex-7 FPGA kártyához

Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT

Digitális technika VIMIAA01 9. hét

Informatika terméktervezőknek

S z á m í t ó g é p e s a l a p i s m e r e t e k

Bevezetés, a C++ osztályok. Pere László

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD)

Átírás:

Budapesti Műszaki és Gazdaságtudományi Egyetem SystemC áttekintés Dr. Czirkos Zoltán, Horváth Péter Elektronikus Eszközök Tanszéke 2014. augusztus 18. Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 1 / 54

Miről lesz szó? Miről lesz szó? Magas szintű tervezés programozási nyelvek segítségével HDL leírás (Verilog / VHDL) is emlékeztet egy programra Ne kelljen kézzel előállítani HDL kódot, legyen elég egy ismert programozási nyelven elkészíteni a rendszer leírását Miért programozási nyelv segítségével? Nem kell még eldönteni, mi lesz hardverben, mi lesz szoftverben Együtt tervezhető a hardver és a szoftver Mi a hardvertervezés részre koncentrálunk SystemC C++ osztályok gyűjteménye, amelyekkel lehetőségünk van C++ fejlesztői környezetben a hardvert is reprezentálni Ún. compiled code szimuláció is és hardverszintézis is lehetséges Nyílt megoldás Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 2 / 54

Hardver-szoftver együttes tervezés Hardver-szoftver együttes tervezés ESL: Electronic System Level design HSCD: Hardware-Software Co-Design Lényeg: elsődleges szempontnak tekintjük, hogy az adott rendszert minél magasabb absztrakciós szinten írjuk le. Az ESL szemlélet a rendszerszintű terveknél egyre elterjedtebb. A világ vezető system-on-a-chip (SoC) tervező cégei irányelvüknek tekintik. A hardver-szoftver együttes tervezés céljai: magas absztrakciós szint, könnyebben átlátható terv legyen, hibákat gyorsabban meg lehessen találni, optimalizálni lehessen a hardver/szoftver particionálást, csökkenjen a piacra kerülés átfutási ideje, és hogy csökkenjenek a fejlesztési költségek. SystemC a HSCD jellegzetes eszköze Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 3 / 54

A SystemC A SystemC I. A SystemC nyelv egy C++ könyvtár és metódus gyűjtemény, ami igen hatékonyan használható szoftveres algoritmusok készítésére, hardver architektúrák modellezésére, valamint SoC és rendszer szintű modellek interfészének megvalósítására. A SystemC és a hagyományos C++ fejlesztői környezet használatával rendszer szintű modellek írhatók le, ezek azután gyorsan szimulálhatók és optimalizálhatók. A rendszert leíró modell egy C++ program, ami futtatva ugyanazt a viselkedést produkálja, amit maga a rendszer Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 4 / 54

A SystemC A SystemC II. A SystemC olyan osztályokat tartalmaz, amelyekkel a megszokott nyelv és feljesztő eszközök használatával képesek leszünk hardver leírására A SystemC olyan hardverhez közeli modellezési lehetőségeket biztosít, mint a párhuzamosság, időzítések, késleltetések, hardverközeli kommunikációs csatornák (pl. portok), hardver-megvalósításokban használt adattípusok, melyek a C++-ban nincsenek meg, hiszen az egy szekvenciális programozási nyelv, amely szoftverfejlesztéshez való. Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 5 / 54

A SystemC célja A SystemC célja Rendszerszintű modellek fejlesztése magas absztrakciós szint a működés vizsgálata szimulációval Magasszintű hardverleírásból szintézis szintetizálható kódot kell írni bizonyos nyelvi elemeket pl. pointereket kerülni kell kimenet: Verilog vagy VHDL leírás, ami egy target technológiára valóban szintetizálható Szimulációhoz: SystemC library és egy C++ fordító kell Szintézis: szabad hozzáférésű programokkal megoldható. Pl. SystemC könyvtár CvSDL Waveform Viewer 0.3.1 SystemCrafter SC v2.0.0.3 Xilinx ISE WebPack 8.2i Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 6 / 54

A SystemC célja SystemC alapú szintézis és szimuláció Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 7 / 54

A SystemC komponensei A SystemC komponensei Modul egy container, ami más modulokat és process-eket foglalhat magában (C++ osztály) Process folyamat egy adott funkcionalitás leírására szolgál Signal jel támogatott a 2 (0,1) és 4 (0,1,X,Z) értékű logika is Port jelek csatlakozó pontja Adattípusok sokféle típus, különféle szempontok szerint használhatók. Vigyázat szintetizálhatóság! Órajel az idő modellezésére szolgáló spec. jel Szimulációs kernel lehetővé teszi a gyors (compiled kódú) szimulációt Jelalak-figyelés VCD (Value Change Dump), WIF (Waveform Intermediate Format) és ISDB (Integrated Signal Data Base) formátumú jelalak fájlok támogatása Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 8 / 54

Az idő modellezése Az idő modellezése A SystemC könyvtár egyik legfontosabb komponense a már említett időmodellezés. Ezt a nyelv 64-bites előjel nélküli egész számokkal írja le. Ez a programozó számára az sc_time típus mögé van bújtatva. Ilyen módon történő implementálása miatt az idő nem írható le folytonos, analóg módon, csak diszkrét értékekkel. Ennek következtében van egy legkisebb ábrázolható időkvantum, amit időfelbontásnak nevezünk. Ez a nyelv használója által beállítható. Default egység: ps. 2 64 ps = 213 nap. :) Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 9 / 54

Hardver adattípusok Hardver adattípusok A hardver modellezés céljára a SystemC-ben hasonló adattípusok léteznek, mint a Verilog-ban, pl. sc_logic, sc_lv. Pl. DSP jellegű hardverekhez, számítási algoritmusok implementálására szolgáló típusok a sc_fixed és az sc_int Mivel a SystemC a C++-on alapul, értelemszerűen minden C++ adattípus használható, ha nem szükséges valamit SystemC típussal reprezentálni. Fontos szempontok az adattípusokkal kapcsolatban: Bizonyos adattípusok használata nem teszi lehetővé a hardverszintézist. Minden olyan modulban, amit esetleg hardverként szeretnénk megvalósítani, az ilyen típusokat kerülni kell. A SystemC adattípusok sok memóriát igényelnek, és jelentősen lassíthatják a szimulációt. Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 10 / 54

Modulok és metódusok Modulok és metódusok A modulok egy SystemC terv alapvető építőkövei, hasonlóan a C++ osztályokhoz. Egy modul egy másik modulban példányosítható (pl. több flipflop egy számlálóban) Minden alacsonyabb szintű modul példányosítható magasabb szintű modulokban Az SC_METHOD és az SC_THREAD típusú függvények jelentik a modellezés alapját a SystemC-ben. SC_METHOD nem kerül időbe a végrehajtásuk SC_THREAD egy eseményre várnak (pl. órajel pozitív éle), aztán egy adott ideig futnak Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 11 / 54

Hello world Hello world SystemC-ben modulok szintaxisa # include " systemc.h" SC_MODULE ( hello_world ) { SC_CTOR ( hello_world ) { void say_hello () { cout << " Hello World.\ n"; ; int sc_main ( int argc, char * argv []) { hello_world hello (" hello "); hello. say_hello (); return 0; Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 12 / 54

Inverter és testbench Második példa: inverter I. a modul Az inverter nevű modulnak egy-egy 1 bites bemene és kimenete van. A működést leíró függvény a bement jelszintjének bármely irányú változására lefut. # include " systemc.h" SC_MODULE ( inverter ) { sc_in <bool > be; sc_out <bool > ki; void inverterproc (); SC_CTOR ( inverter ) { SC_METHOD ( inverterproc ); sensitive << be; ; # include " inverter.h" void inverter :: inverterproc () { ki. write (! be. read ()); A működés egyszerű: beolvassuk a bemenetet (read), invertáljuk (felkiáltójel operátor) és kiírjuk a kimenetre (write). Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 13 / 54

Inverter és testbench Második példa: inverter II. a testbench # include " inverter.h" int sc_main ( int argc, char * argv []) { sc_signal <bool > BE, KI; inverter i1 (" i1 "); i1.be(be ); i1.ki(ki ); sc_start (1, SC_NS ); sc_trace_file * tf = sc_create_vcd_trace_file (" out "); sc_trace (tf, BE, "BE "); sc_trace (tf, KI, "KI ");...... BE =0; sc_start (2, SC_NS ); BE =1; sc_start (2, SC_NS ); BE =0; sc_start (2, SC_NS ); BE =1; sc_start (2, SC_NS ); BE =0; sc_start (2, SC_NS ); sc_close_vcd_trace_file ( tf ); return 0; Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 14 / 54

Inverter és testbench Második példa: inverter III. magyarázatok Az inverter i1("i1"); sorban történik a példányosítás, az i1.be(be); pedig azt jelenti, hogy az i1 néven példányosított inverter be nevű portjához kötjük a fent deklarált BE jelet. Az sc_start(1, SC_NS) lépteti 1 ns-mal a szimulációs kernelt (szimulációs órát). A jelalakfigyeléshez létrehozunk egy out.vcd nevű fájlt, amelyre a kód további részében tf néven fogunk hivatkozni. Az ezt követő két sor mondja meg, hogy mely fájlba melyik jel változásait jegyezze fel a SystemC, és milyen néven jelenítse meg azt. Amint az látható, az inverter bemeneti portjához kötött jelnek értéket adunk, majd léptjük a szimulációt 2 egységgel, stb. A végén lezárjuk a jelalakot tartalmazó fájlt. Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 15 / 54

Számláló Harmadik példa: számláló SC_MODULE( f i r s t _ c o u n t e r ) { s c _ i n _ c l k c l o c k ; sc_in <bool > r e s e t ; sc_in <bool > e n a b l e ; sc_out<sc_ uint <4> > counter_ out ; sc_ uint <4> count ; SC_CTOR( f i r s t _ c o u n t e r ) { SC_METHOD( incr_ count ) ; s e n s i t i v e << c l o c k. pos ( ) ; v o i d i n c r _ c o u n t ( ) { i f ( r e s e t. r e a d ( ) == 1) { count = 0 ; c o u n t e r _ o u t. w r i t e ( count ) ; e l s e i f ( e n a b l e. r e a d ( ) == 1) { count = count + 1 ; c o u n t e r _ o u t. w r i t e ( count ) ; cout <<"@"<< sc_time_stamp()<< " : : I n c r e m e n t e d Counter " <<c o u n t e r _ o u t. r e a d ()<< e n d l ; ; Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 16 / 54

Órajelgenerátor Negyedik példa: órajelgenerátor SC_MODULE ( ClockGen ) { sc_out_clk clock_out ; void clockgen () { while ( true ) { clock_out = true ; wait (500, SC_US ); clock_out = false ; wait (500, SC_US ); ; SC_CTOR ( ClockGen ) { SC_THREAD ( clockgen ); Ez nem szintetizálható, tesztelésre (testbench-be) viszont kitűnő. Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 17 / 54

Típusok Típusok áttekintés A SystemC sok, a hardvermodellezést lehetővé tevő típust támogat. Törtek ábrázolása: fix pontos formátumban A C++ minden típusa hozzáférhető Típusok használatánál szempontok: szintetizálhatóság absztrakciós szint szimulációs sebesség Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 18 / 54

Bit típus Bit típus régi SystemC-ben sc_bit a bit típus, két értéket vehet fel 0 -át and 1 -et. Akkor célszerű használni, amikor se nagy impedanciás (Z), se ismeretlen állapotot (X) nem kell modellezni. Bitenkénti műveletek: operátor leírás használat & és expr1 & expr2 vagy expr1 expr2 ^ kizáró vagy expr1 ^ expr2 ~ tagadás ~expr &= és értékadás &= expr = vagy értékadás = expr ^= kizáró vagy értékadás ^= expr == egyenlő-e expr1 == expr2!= nem egyenlő-e expr1!= expr2 Új SystemC-ben egyszerűen bool-t használunk helyette. Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 19 / 54

Bit típus Bit típus példa # include <systemc.h> int sc_main ( int argc, char * argv []) { sc_bit enable ; sc_bit read_en ; enable = 1 ; cout <<" enable : " << enable << endl ; read_en = enable ; cout <<" read_en : " << read_en << endl ; return 0; Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 20 / 54

Logikai típus Logikai típus Az sc_bit csak két értékű (0,1), buszok nem modellezhetőek vele. sc_logic típus: tényleges hardverben előforduló jel állapotok (értékek): 0, 1, X és Z. 0 : hamis 1 : igaz X or x : ismeretlen, definiálatlan Z or z : nagy impedanciás (high-z), lebegő csomópont értéke Ugyanazok a bitműveletek értelmezettek. Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 21 / 54

Logikai típus Logikai típus igazságtáblák ÉS 0 1 X Z 0 0 0 0 0 1 0 1 X X X 0 X X X Z 0 X X X VAGY 0 1 X Z 0 0 1 X X 1 1 1 1 1 X X 1 X X Z X 1 X X NEM 0 1 X Z 1 0 X X Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 22 / 54

Logikai típus Logikai típus példa # include <systemc.h> int sc_main ( int argc, char * argv []) { sc_logic pad ; sc_logic enable ; sc_logic read_en ; pad = z ; cout <<" pad : " << pad << endl ; enable = 0 ; cout <<" enable : " << enable << endl ; read_en = ~ enable ; cout <<" read_en : " << read_en << endl ;... Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 23 / 54

Bit vektor Bit vektor sc_bv<m>: több bitből álló vektor. A méretet kacsacsőrök között, egész számmal kell megadni (sablon paraméter). 0 a jobb szélső, legalsó helyiértékű index, M-1 a legnagyobb helyiértékű. Bitenkénti műveletek mellett a továbbiak: operátor leírás használat [] bit kiválasztás vektor[index] (,) összefűzés (expr1,expr2,expr3).range() rész kiválasztása vektor.range(i1,i2).and_reduce() bitek és-elése vektor.and_reduce().or_reduce() bitek vagy-olása vektor.or_reduce().xor_reduce() bitek kizáró vagy-olása vektor.xor_reduce() Kisebb vektor értékadásakor a felső helyiértékű bitek 0-k lesznek, nagyobbnál eldobja a felsőket. Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 24 / 54

Bit vektor Bit vektor példa # include <systemc.h> int sc_main ( int argc, char * argv []) { sc_bv <8> data_bus ; sc_bv <16> addr_bus ; sc_bit parity ; data_bus = "00001011"; cout <<" data_bus : " << data_bus << endl ; addr_bus. range (7,0) = data_bus ; cout <<" addr_bus : " << addr_bus << endl ; addr_bus. range (0,7) = data_bus ;... Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 25 / 54

Logikai vektor Logikai vektor sc_lv<m>: mint a bit vektor, csak 4 értékű logikával. Ezzel lehet jól pl. buszokat modellezni. Aritmetikai műveleteket nem lehet végezni! Azokat az sc_int és sc_uint típusokon kell. #i n c l u d e <systemc. h> i n t sc_main ( i n t argc, c h a r a r g v [ ] ) { sc_lv <8> data_bus ( s c _ l o g i c ( z ) ) ; sc_ lv <16> addr_bus ; s c _ l o g i c p a r i t y ; cout <<"data_bus : " << data_bus << e n d l ; data_bus = " 0 0 0 0 1 0 1 1 " ; cout <<"data_bus : " << data_bus << e n d l ; addr_bus. r a n g e ( 7, 0 ) = data_bus ; cout <<"addr_bus : " << addr_bus << e n d l ; Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 26 / 54

Aritmetikai típusok Aritmetikai típusok sc_int<m> és sc_uint<m>: max. 64 bites előjeles és előjel nélküli egész szám. sc_bigint<m> és sc_biguint<m>: nagyobb (általában max. 512 bites) számok. Használhatóak rajtuk az aritmetikai műveletek: +, *, /,... Használható a bitkiválasztás [] és az összefűzés (,) is. #i n c l u d e <systemc. h> i n t sc_main ( i n t argc, c h a r a r g v [ ] ) { s c _ i n t <4> n i b b l e _ s i z e = 1 ; s c _ i n t <8> b y t e _ s i z e = 2 ; s c _ i n t <32> dword_size = 3 ; dword_ size++; cout <<"dword_ size : " << dword_ size << e n d l ; b y t e _ s i z e += n i b b l e _ s i z e ; Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 27 / 54

Moduldefiníció Moduldefiníció SC_MODULE makróval: SC_MODULE ( modul_n év) {... ; SC_CTOR ( modul_n év) {... A modul tulajdonképpen egy C++ osztály, amelyet a konstruktor beregisztrál a SystemC szimulációs kernel számára. Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 28 / 54

Portok Portok modulok és külvilág SC_MODULE( f i r s t _ c o u n t e r ) { s c _ i n _ c l k c l o c k ; sc_in <bool > r e s e t ; sc_in <bool > e n a b l e ; sc_out<s c _ u i n t <4> > out ;... ; sc_in<típ> bemeneti port sc_out<típ> kimeneti port sc_inout<típ> ki/be port Portokhoz hozzáférés: read() és write() függvényekkel (mert be van csomagolva egy sc_in<>-be vagy sc_out<>-ba). i f ( r e s e t. r e a d ( ) == 1) { count = 0 ; out. w r i t e ( count ) ; e l s e i f ( e n a b l e. r e a d ( ) == 1) { count = count + 1 ; out. w r i t e ( count ) ; Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 29 / 54

Portok Portok tömbje SC_MODULE ( ports_arrays ) { sc_in <sc_uint <2> > a [4]; sc_in <sc_uint <2> > b [4]; sc_out <sc_uint <3> > o [4]; void body () { for ( int i=0; i <4; i++) o[i]. write (a[i]. read () + b[i]. read ()); SC_CTOR ( ports_arrays ) { SC_METHOD ( body ); for ( int j=0; j <4; j++) sensitive << a[j] << b[j]; ; Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 30 / 54

Belső változók Modul belső változói Tetszőleges SystemC, C++ vagy felhasználó által definiált belső változó létrehozható. SC_MODULE ( first_counter ) { sc_in_clk clock ; sc_in <bool > reset ; sc_in <bool > enable ; sc_out <sc_uint <4> > out ; sc_uint <4> count ;... first_counter clock out enable reset 4 Ezek szintaktikailag tagváltozóként jelennek meg. Ha szintetizálni szeretnénk, akkor vigyázni kell a típusokkal! Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 31 / 54

Folyamatok Folyamatok (process) A folyamatok valósítják meg a tényleges tevékenységeket. Mint Verilogban egy always blokk Lehet szintre érzékeny (kombinációs logika) és élre érzékeny (szekvenciális hálózatok) SC_MODULE ( dff ) { sc_in <bool > din ; sc_in <bool > clk ; sc_out <bool > out ; void implement (); SC_CTOR ( dff ) { SC_METHOD ( implement ); sensitive << clk. pos (); ; A folyamatokat a konstruktorban regisztráljuk. Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 32 / 54

Folyamatok Folyamatok típusai A SystemC-ben 3-féle process van: metódusok (methods) Triggerelő eseményre indulnak. Az eseményeket az ún. érzékenységi listán adjuk meg (sensitive, sensitive_pos) Futás után visszatérés a hívóhoz szálak (threads) Indítás után futnak, pl. amíg egy esemény be nem következik Felfüggeszthetők és újraindíthatóak (az utolsó felfüggesztés helyétől) órajelre indított szálak (clocked threads) Egy ilyen process számára az indító órajelet is definiálni kell (csak 1 bites trigger portja lehet egy ilyen process-nek) Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 33 / 54

Folyamatok Method SC_MODULE ( first_counter ) { sc_in_clk clock ; sc_in <bool > reset ; sc_in <bool > enable ; sc_out <sc_uint <4> > counter_out ; sc_uint <4> count ; SC_CTOR ( first_counter ) { SC_METHOD ( incr_count ); sensitive << reset ; sensitive << clock. pos (); SC_METHOD ( print_count ); sensitive << counter_out ;...... void incr_count () { if ( reset. read () == 1) { count = 0; counter_out. write ( count ); else if ( enable. read () == 1) { count = count + 1; counter_out. write ( count ); void print_count () { cout << sc_time_stamp () << " :: Counter Value " << counter_out. read () << endl ; ; Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 34 / 54

Folyamatok Folyamatok dont_initialize() A folyamatok a konstruktorból indítva egyből lefutnak. Ennek elkerülése: SC_CTOR ( tff_sync_reset ) { SC_METHOD ( tff ); dont_initialize (); sensitive << clk. pos (); Ez SC_METHOD folyamatoknál lehet fontos, hiszen az SC_THREAD-ek elejére/végére könnyű rakni egy wait()-et. Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 35 / 54

Folyamatok Thread SC_MODULE ( first_counter ) { sc_in_clk clock ; sc_in <bool > reset ; sc_in <bool > enable ; sc_out <sc_uint <4> > counter_out ; sc_uint <4> count ; SC_CTOR ( first_counter ) { SC_THREAD ( incr_count ); sensitive << clock. pos (); SC_THREAD ( print_count ); sensitive << counter_out ; void incr_count () { while ( true ) { wait (); if ( reset. read () == 1) { count = 0; counter_out. write ( count ); else if ( enable. read () == 1) { count = count + 1; counter_out. write ( count );... ; Örökké futnak alszanak triggerek között. Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 36 / 54

Folyamatok Clocked thread SC_MODULE ( first_counter ) { sc_in_clk clock ; sc_in <bool > reset ; sc_in <bool > enable ; sc_out <sc_uint <4> > counter_out ; sc_uint <4> count ; SC_CTOR ( first_counter ) { SC_CTHREAD ( incr_count, clock. pos ()); SC_THREAD ( print_count ); sensitive << counter_out ; void incr_count () { while ( true ) { wait (); if ( reset. read () == 1) { count = 0; counter_out. write ( count ); else if ( enable. read () == 1) { count = count + 1; counter_out. write ( count );... ; A triggerelő csak egy bites jel lehet. Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 37 / 54

Folyamatok Folyamatok wait_until() Egy SC_CTHREAD() típusú folyamatban adott feltétel teljesüléséig lehet várni a wait_until() hívással. void incr_count () { while ( true ) { wait_until ( reset. delayed () == true enable. delayed () == true ); if ( reset. read () == 1) { count = 0; counter_out. write ( count ); else if ( enable. read () == 1) { count = count + 1; counter_out. write ( count ); Fontos a.delayed() hiszen különben kiértékelődne az aktuális állapot (C++!), és a wait_until() nem látná a változást! Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 38 / 54

Példányosítás Modul példányosítása Modul és szignálok: first_counter counter1 (" counter1 "); sc_signal <bool > clocksig, resetsig, enablesig ; sc_signal <sc_uint <4> > outsig ; first_counter clocksig enablesig resetsig clock enable reset out 4 outsig counter1 Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 39 / 54

Csatlakoztatás Portok csatlakoztatása Minden portot csatlakoztatni (bind) kell. Lehet név szerint: c o u n t e r 1. e n a b l e ( e n a b l e s i g ) ; c o u n t e r 1. r e s e t ( r e s e t s i g ) ; c o u n t e r 1. c l o c k ( c l o c k s i g ) ; c o u n t e r 1. out ( o u t s i g ) ; Vagy pozíció (modulbeli deklaráció sorrendje) szerint: c o u n t e r 1 ( c l o c k s i g, r e s e t s i g, e n a b l e s i g, o u t s i g ) ; first_counter clocksig enablesig resetsig clock enable reset out 4 outsig counter1 Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 40 / 54

Órajel Órajel objektumok sc_clock osztályból hozható létre: sc_clock cg (" clockgen ", 10, SC_NS, 0.5, 1, SC_NS, true ); clockgen nevű, 10 ns periódusidejű, 50% kitöltési tényezőjű, 1 ns időegységnél, magas (true) szinttel induló. 50% H L 1 10 Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 41 / 54

Komplex példa Komplex példa: háromszöggenerátor TESTBENCH sc_clock ora_be SDDAHaromszog jel_ki sddaki cg Haromszog SDDA ora_be ora_be jel_ki haromszog_ki szazalek_be hsz1 sdda11 sddahsz sc_main() Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 42 / 54

Komplex példa SDDAHaromszog modul SC_MODULE ( SDDAHaromszog ) { sc_in_clk ora_be ; sc_out <bool > jel_ki ; SDDA sdda1 ; Haromszog hsz1 ; sc_signal <sc_uint <7> > jel ; SC_CTOR ( SDDAHaromszog ) : sdda1 (" sdda1 "), hsz1 (" hsz1 ") { hsz1. ora_be ( ora_be ); sdda1. ora_be ( ora_be ); hsz1. haromszog_ki ( jel ); sdda1. szazalek_be ( jel ); ; sdda1. jel_ki ( jel_ki ); Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 43 / 54

Komplex példa Háromszög generátor modul SC_MODULE ( Haromszog ) { // portok sc_in_clk ora_be ; sc_out <sc_uint <7> > haromszog_ki ; bool fel ; int var ; sc_uint <7> mertek ; SC_CTOR ( Haromszog ) { SC_THREAD ( haromszoggen ); sensitive << ora_be. pos (); void haromszoggen () { while ( true ) { var =( var +1)%100; if ( var ==0) { // adott iranyba lép mertek = mertek +( fel?+1: -1); haromszog_ki. write ( mertek ); // irány megfordul? if ( mertek <1) fel = true ; if ( mertek >99) fel = false ; wait (); ; Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 44 / 54

Komplex példa TestBench: sc_main() törzse sc_set_time_resolution (1, SC_NS ); SDDAHaromszog sddahsz (" sddahsz "); sc_clock cg (" cg", 500, SC_NS, 0.5, 10, SC_NS, true ); sc_signal <bool > sddaki ; sddahsz. ora_be (cg ); sddahsz. jel_ki ( sddaki ); sc_trace_file * tf = sc_create_vcd_trace_file (" sdda "); sc_trace (tf, cg, " orajel "); sc_trace (tf, sddahsz. hsz1. haromszog_ki, " haromszog_ki "); sc_trace (tf, sddaki, " sddaki "); sc_start (100, SC_MS ); sc_close_vcd_trace_file ( tf ); Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 45 / 54

Buszok Buszok modellezése I. TriState kimenetek esetén fel kell oldani a portok kimeneteit: 0 1 Z X 0 0 X 0 X 1 X 1 1 X Z 0 1 Z X X X X X X Erre valók az sc_in_rv, sc_out_rv és sc_inout_rv (resolved) típusú portok: SC_MODULE ( module_a ) { sc_in_rv <1> in; sc_out_rv <1 > out ; sc_inout_rv <4 > inout ;... ; Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 46 / 54

Buszok Buszok modellezése II. A _rv típusú portok ilyen szignálokra köthetők: SC_MODULE ( resolve ) { sc_in_rv <1> in; sc_out_rv <1 > out ; sc_inout_rv <4 > inout ;... ; int sc_main ( int argc, char * argv []) { sc_signal_rv <1 > in1 ; sc_signal_rv <1 > out ; sc_signal_rv <4 > inout ; resolve rs1 (" RESOLVE1 "); rs1 (in1, out, inout );... Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 47 / 54

Fogalmak, létrehozás Csatornák: fogalmak Termelő (Producer) Csatorna (channel) Fogyasztó (Consumer) FIFO írás / olvasás interfész (r/w interface) Kommunikáció absztrakciója A csatlakozás interfészeken (interface) keresztül valósul meg Események (events) zajlanak le Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 48 / 54

Fogalmak, létrehozás Csatornák: deklaráció struct write_if : public sc_interface { virtual void write ( char ) = 0; virtual void reset () = 0; ; struct read_if : public sc_interface { virtual void read ( char &) = 0; virtual int num_available () = 0; ; Létrehozzuk az írás és az olvasás interfészét. Tisztán virtuális függvényként megadjuk a műveleteket. Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 49 / 54

FIFO példa Csatornák: FIFO implementáció class fifo : public sc_channel, public write_if, public read_if { private : enum { max_elements =10; char data [ max_elements ]; int num_elements, first ; sc_event write_event, read_event ; bool fifo_empty () {...; bool fifo_full () {...; public : fifo () : num_elements (0), first (0) { ; void write ( char c) { if ( fifo_full ()) wait ( read_event ); data [...] = c; ++ num_elements ; write_event. notify (); void read ( char &c) { if ( fifo_empty ()) wait ( write_event ); c = data [ first ]; -- num_elements ; first =...; read_event. notify ();... Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 50 / 54

FIFO példa Csatornák: tudnivalók A csatornák: Az sc_channel osztályból kell öröklődjenek És további osztályokból, amelyek az sc_interface-t megvalósítják Meg kell valósítaniuk az összes tisztán virtuális függvényt A wait() hívások: wait(sc_event) eseményig wait(time) wait(time_out, sc_event) Események a szinkronizációhoz: Bekövetkezés jelzése:.notify() Felébred hatásukra a folyamat a wait()-ből a másik oldalon Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 51 / 54

Termelő, fogyasztó Csatornák: termelő-fogyasztó példa SC_MODULE ( termelo ) { public : sc_port <write_if > out ; ; SC_CTOR ( termelo ) { SC_THREAD ( main ); void main () { char c; while ( true ) { out. write (c); if (...) out. reset (); SC_MODULE ( fogyaszto ) { public : sc_port <read_if > in; ; SC_CTOR ( fogyaszto ) { SC_THREAD ( main ); void main () { char c; while ( true ) { in. read (c); cout << in. num_available (); Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 52 / 54

Termelő, fogyasztó Csatornák: összekapcsolás Termelő FIFO Fogyasztó SC_MODULE ( top ) { public : fifo fi; termelo term ; fogyaszto fogy ; ; SC_CTOR ( top ) { term. out ( fi ); fogy. in( fi ); Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 53 / 54

Előnyök Csatornák: előnyök Interfészek: Előnyök: Termelőben: sc_port<write_if> out; írható Fogyasztóban: sc_port<read_if> in; olvasható Egyik sem tudja, hogyan működik a csatorna A kommunikáció módja rejtve van a modulok elől A kommunikáció módját és a funkcionalitást elválasztjuk Kipróbálhatók különféle csatornák! Szoftveres FIFO, okos sorba állítással Hardveres FIFO A csatorna további modulokat tartalmaz... Dr. Czirkos Zoltán, Horváth Péter SystemC áttekintés 54 / 54