© Harry Broeders.
Deze pagina is bestemd voor studenten van de Haagse Hogeschool - Faculteit Technologie, Innovatie & Samenleving groep E-EMSYS = minor Embedded Systems.
Let op! Deze pagina bevat mogelijk verouderde informatie, kijk op Blackboard voor de meest recente informatie!
Studiemateriaal | Sheets | Practicumopdrachten: 0 1 2 |
---|
sc_module
. Channels worden in SystemC
geïmplementeerd met verschillende classes uit de SystemC library
afhankelijk van het abstactieniveau.Abstractieniveau | modules modelleren: | channels modelleren: | SystemC class(es) voor channel(s) |
---|---|---|---|
Gate Level (poort niveau). Dit is het laagste abstractieniveau dat in SystemC beschreven kan worden. Het wordt gebruikt voor het modelleren van hardware. | Het systeem bestaat op dit abstractieniveau uit logische poorten (and, or, inverter, enz). | Elektrische verbinding (metaalspoortje of draadje) | sc_signal<sc_logic> sc_signal<bool> sc_buffer<sc_logic> |
Register Transfer Level (RTL). Dit abstactieniveau wordt vaak gebruikt voor het modelleren van hardware maar kan ook gebruikt worden om software op een heel laag abstractieniveau (assembler) te beschrijven. | Het systeem bestaat op dit abstractieniveau uit registers, optellers, vermenigvuldigers, schuifregisters, tellers, multiplexers enz. | Elektrische verbinding of groepjes van deze verbindingen (bussen). | sc_signal<...> sc_buffer<...> |
Behavioural Level. Dit is een abstractieniveau boven RTL waarin de nadruk ligt op het beschrijven van het gedrag (en niet op het beschrijven van de structuur). Dit kan zowel gebruikt worden voor het modelleren van hardware als voor het modelleren van software. | Het systeem bestaat op dit abstractieniveau uit modules boven het RTL niveau. De onderliggende structuur van deze modules wordt niet gemodelleerd. | Op dit niveau kunnen allerlei soorten channels gebruikt worden. De SystemC library bevat een aantal zogenoemde primitive channels maar het is ook mogelijk om zelf andere soorten primitieve channels of om zelf zogenoemde hierarchical channels te implementeren. | sc_signal<...> |
Transaction Level Modelling. Op dit abstractieniveau wordt de architectuur van de hardware beschreven. | Het systeem bestaat op dit abstractieniveau uit processing elements, geheugens en I/O devices die via één of meerdere bussen met elkaar zijn verbonden. De informatieoverdracht over deze bussen wordt beschreven met behulp van transacties. | In de SystemC standaard is een speciaal deel opgenomen voor het modelleren van dit soort modellen: SystemC TLM2 | simple_initiator_socket<...> |
Functional Level: Asynchronous Message Passing. Op dit abstratieniveau wordt het systeem beschreven als een verzameling processen die met elkaar communiceren via ongelimiteerde FIFO's. Dit kan zowel gebruikt worden voor het modelleren van hardware als voor het modelleren van software. | Het systeem bestaat op dit abstractieniveau uit processen. Deze kunnen later in software worden geïmplementeerd als processen/threads/tasks in een operating systeem of als processoren/processing elements in hardware. | FIFO's. Dezen kunnen later in software geïmplementeerd worden als pipes/message channels/TCP verbindingen enz .of in hardware als hardware FIFO's. | sc_fifo<...> |
Functional Level: Algorithm Description. Dit is het hoogste abstractieniveau waarin alleen de functionaliteit van de hard- en/of software wordt beschreven. | Op dit abstractieniveau bestaat het hele systeem uit één module. | Er zijn op dit abstractieniveau geen channels | - |
Het gedrag van een module wordt beschreven in SystemC processen.
Deze processen moeten bij de simulatiekern van SystemC geregistreerd
worden (call backs). Bij deze registratie moeten ook de events worden
opgegeven waarop het proces moet reageren. Deze events zijn afkomstig
van de channels waarmee de poorten van de modules verbonden zijn.
Sheet 1 t/m 10 van de TUDelft.
In de traditionele manier van het ontwikkelen van embedded systems werd
eerst de hardware ontworpen.
Sheet 11 t/m 21 van de TUDelft slaan we over omdat ik ervan uitga dat
jullie C++ kennis voldoende is. Zie anders Object Georiënteerd Programmeren in
C++.
Sheet 11 t/m 21 bevatten bovendien enkele foutjes:
Sheet 12: #include <assert.h>
moet zijn
#include <cassert>
.
Sheet 14: De constructor en destructor kunnen netter worden
gecodeerd:
Image(): width(0), height(0), data(nullptr) { /* use initialisation list */
}
~Image() {
delete[] data; /* it is safe to call delete[] on a null pointer */
}
Sheet 16: De constructor kan netter worden
gecodeerd:
Image(int w, int h): width(w), height(h), data(new Vec3f[w*h]) {
}
Sheet 16: Image myImage = Image(10,
10);
moet zijn Image myImage(10, 10);
.
Sheet 17: Het prototype van de copy constructor is niet
Image(Image *img)
maar Image(const Image&
img)
. Alle pijlen (->
) moeten punten
(.
) zijn. Ook kan het netter door de initialisatielijst
van de constructor te gebruiken:
Image(const Image& img): width(img.width), height(img.height), data(new Vec3f[img.width * img.height]) {
for (int i = 0; i < width * height; ++i)
data[i] = new data[i];
}
Sheet 17: "usually" moet zijn "sometimes". Zie
paragraaf 5.7 van het dictaat: Objectgeoriënteerd Programmeren in C++:
Dictaat_OGPiCpp.pdf.
Sheet 20: De default constructor van de basisklasse wordt automatisch
aangeroepen in de constructor van een afgeleide klasse. De constructor
van Sphere
kan dus netter als volgt worden gecodeerd:
Sphere::Sphere() : radius(1.0) {
}
De SystemC processen die in deze sheets gebruikt worden om het
gedrag van de modules te beschrijven zijn SC_METHOD
en
SC_THREAD
. Deze worden later (hoofdstuk 4 van de sheets
van de TUDelft) nog uitgebreid behandeld. Voor nu is het voldoende om
te weten dat een als SC_MODULE
geregistreerde
memberfunctie telkens opnieuw, door de SystemC simulatiekern, wordt
aangeroepen als een event optreedt dat in de bijbehorende sensitivity
list is gespecificeerd. Het uitvoeren van deze memberfunctie kan
niet onderbroken worden door de SystemC simulatiekern. Een als
SC_THREAD
geregistreerde memberfunctie daarintegen wordt
slechts één maal, door de SystemC simulatiekern, aangeroepen. In deze
memberfunctie is het mogelijk om de uitvoering tijdelijk te onderbreken
(suspend) door de simulatiekern aan te roepen via de wait
functie. Er bestaan diverse overloaded versies van deze functie waarmee
je op verschillende soorten events kunt wachten. De memberfunctie die
wait
heeft aangeroepen wordt weer vervolgd (resumed) als
het event, waarop gewacht wordt, is opgetreden. In de voorbeelden wordt
dit gebruikt om een bepaalde tijd te wachten.
SystemC voorbeelden:
SC_METHOD(add)
.
SC_METHOD(add)
. Ik raad het gebruik van deze stijl af
omdat het naar mijn idee het verschil tussen variabelen en in- of
uitgangen maskeerd. sc_logic
datatype kun je hier vinden:
http://www.asic-world.com/systemc/data_types2.html.
Daar kun je ook vinden hoe de logische operatoren (and, or en not) voor
dit datatype gedefinieerd zijn. SystemC voorbeelden:
operator()
of class
sc_sensitive
is deprecated. Use
operator<<
instead". De regel
sensitive(fillup_request);
moet dus vervangen worden
door sensitive << fillup_request;
"Calculated"
moet zijn
"Calculated "
en mytime
moet zijn
my_time
. Het doel van de voorbeeldcode is mij niet
duidelijk.wait
"triggers an
event". Dat moet natuurlijk zijn: "waits for an event". Het voorbeeld
is erg vreemd. Er staat // assume previous slide
maar op
de sheet ervoor komt helemaal geen my_event
voor.
SystemC voorbeelden:
SystemC voorbeelden:
sc_fifo
besproken. Een sc_fifo
kan gebruikt worden om modules met
elkaar te laten communiceren. Dit kan dan later als een hardware fifo
of als een software fifo worden geïmplementeerd. We kunnen een
sc_fifo
ook gebruiken om threads met elkaar te laten
communiceren. Dit kan dan later als software geïmplementeerd worden
(b.v. als een message
queue in een POSIX compatible Real-Time OS of als een Queue
in FreeRTOS). Tot slot wordt in deze les uitgelegd hoe je zelf een
channel kunt definiëren en gebruiken. Om zelf een channel te
definieren moet je:
sc_interface
. Zie de SystemC standaard pagina 117 en
118:sc_interface
but not derived from class
sc_object
. An interface proper contains a set of pure
virtual functions that shall be defined in one or more channels
derived from that interface proper. An interface proper shall obey
the following rules:sc_interface
sc_interface
, it
shall use the virtual
specifiersc_channel
. Deze module moet
de interfaces implementeren. De typenaam sc_channel
is
slechts een andere naam voor het type sc_module
. Het
type sc_channel
is in de SystemC library als volgt
gedefinieerd: typedef sc_module sc_channel;
sc_port<read interface>
de functies die
gedefinieerd zijn in de read interface en geïmplementeerd zijn in
de channel aanroepen. Bijvoorbeeld out->read(c)
.
Let op: out.read(c)
is niet
correct (de class sc_port
heeft helemaal geen
read
functie) en geeft een compilatiefout. De
operator->
is overloaded in de class
sc_port<read interface>
en geeft een
pointer terug naar de read interface van de channel waar de port
mee verbonden is. sc_port<write interface>
de functies
die gedefinieerd zijn in de write interface en geïmplementeerd
zijn in de channel aanroepen. Bijvoorbeeld
out->write(c)
. Let op: out.write(c)
is
niet correct (de class
sc_port
heeft helemaal geen write
functie) en geeft een compilatiefout. De operator->
is overloaded in de class sc_port<write
interface>
en geeft een pointer terug naar de write
interface van de channel waar de port mee verbonden is. SystemC voorbeelden:
sc_fifo
. In dit
voorbeeld is geen timing gebruikt. De fifo wordt dus steeds
helemaal volgeschreven en daarna helemaal leeggelezen. Zie fifo_output.png. sc_fifo
.
In dit
voorbeeld is wel timing gebruikt. De producer is net een beetje
sneller dan de consumer. De fifo loopt dus langzaam vol. Zie fifo_tim_output.png.
SC_THREAD
(binnen dezelfde module) met elkaar communiceren (en
synchroniseren) via een sc_fifo
. In dit voorbeeld is
timing gebruikt. De producer is net een beetje sneller dan de
consumer. De fifo loopt dus langzaam vol. Zie fifo_tim_proc_output.png.
fifo
. In dit voorbeeld is timing gebruikt. De producer is
net een beetje sneller dan de consumer. De fifo loopt dus langzaam
vol. Zie my_fifo_tim_output.png.
pq
die zich net zo gedraagt als een
sc_fifo
maar waarbij bij een read het grootste element
(dat zich in de queue bevindt) wordt teruggegeven. Voorbeeld van een timed model waarin
een producer en een consumer module met elkaar communiceren (en
synchroniseren) via de zelfgemaakte class pq
. De producer is
net een beetje sneller dan de consumer. De fifo loopt dus langzaam
vol. Zie pq_output.png.
Opdrachten: