Download de presentatie
De presentatie wordt gedownload. Even geduld aub
GepubliceerdDries Bauwens Laatst gewijzigd meer dan 9 jaar geleden
1
HM-ES-th1 Les 12 Hardware/Software Codesign with SystemC
2
sc_fifo Een sc_fifo kan gebruikt worden om modules met elkaar te laten communiceren (en synchroniseren). Dit kan dan later als een hardware fifo of als een software fifo worden geïmplementeerd. 71 producerconsumersc_fifo sc_fifo_out sc_fifo_in
3
Untimed voorbeeld sc_fifo (1 van 4) 72 SC_MODULE(Top) { SC_CTOR(Top): consumer("consumer"), producer("producer"), fifo("fifo", 4) { producer.out(fifo); consumer.in(fifo); } private: sc_fifo fifo; Producer producer; Consumer consumer; };
4
Untimed voorbeeld sc_fifo (2 van 4) 73 SC_MODULE(Producer) { sc_fifo_out out; SC_CTOR(Producer) { SC_THREAD(main); } private: void main() { for (char c = 'A'; c <= 'Z'; ++c) { out.write(c); } };
5
Untimed voorbeeld sc_fifo (3 van 4) 74 SC_MODULE(Consumer) { sc_fifo_in in; SC_CTOR(Consumer) { SC_THREAD(main); } private: void main() { char c; do { c = in.read(); cout << "Read: " << c << " number of characters in buffer: " << in.num_available() << endl; } while (c != 'Z'); } };
6
Untimed voorbeeld sc_fifo (4 van 4) 75
7
Timed voorbeeld sc_fifo (1 van 4) 76 SC_MODULE(Top) { SC_CTOR(Top): consumer("consumer"), producer("producer"), fifo("fifo", 4) { producer.out(fifo); consumer.in(fifo); } private: sc_fifo fifo; Producer producer; Consumer consumer; };
8
Timed voorbeeld sc_fifo (2 van 4) 77 SC_MODULE(Producer) { sc_fifo_out out; SC_CTOR(Producer) { SC_THREAD(main); } private: void main() { for (char c = 'A'; c <= 'Z'; ++c) { wait(5, SC_NS); out.write(c); } };
9
Timed voorbeeld sc_fifo (3 van 4) 78 SC_MODULE(Consumer) { sc_fifo_in in; SC_CTOR(Consumer) { SC_THREAD(main); } private: void main() { char c; do { wait(6, SC_NS); // the consumer is a bit slower than the producer c = in.read(); cout << "Read: " << c << " number of characters in buffer: " << in.num_available() << endl; } while (c != 'Z'); } };
10
Timed voorbeeld sc_fifo (4 van 4) 79
11
sc_fifo Een sc_fifo kan ook gebruikt worden om SC_THREADS binnen een module met elkaar te laten communiceren (en synchroniseren). Dit kan dan later als een software fifo worden geïmplementeerd. Bijvoorbeeld als een POSIX message queue. 80
12
Timed voorbeeld sc_fifo (1 van 2) 81 SC_MODULE(Top) { SC_CTOR(Top): fifo("fifo", 4) { SC_THREAD(producer); SC_THREAD(consumer); } private: void producer() { for (char c = 'A'; c <= 'Z'; ++c) { wait(5, SC_NS); fifo.write(c); } void consumer() { char c; do { wait(6, SC_NS); c = fifo.read(); cout << "Read: " << c << " number of characters in buffer: " << fifo.num_available() << endl; } while (c != 'Z'); } sc_fifo fifo; };
13
Timed voorbeeld sc_fifo (2 van 2) 82
14
Channel zelf definiëren Huiswerk: Definieer zelf een channel genaamd 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: Definieer zelf een channel genaamd fifo die zich net zo gedraagt als een sc_fifo. 83
15
FIFO zelf definiëren Wat moeten we doen om zelf een FIFO channel te definiëren (zie SystemC standaard): We moeten een read en een write interface definiëren. Deze interfaces moeten virtual overerven van sc_interface. We moeten een module afleiden van sc_channel. Deze module moet de interfaces implementeren. Waar bewaren we de data? Wat te doen als de fifo vol is? Wat te doen als de fifo leeg is? 84
16
Voorbeeld fifo (1 van 7) 85 template class fifo_write_if : virtual public sc_interface { public: virtual void write(const element&) = 0; }; template class fifo_read_if : virtual public sc_interface { public: virtual element read() = 0; virtual int num_available() const = 0; };
17
Voorbeeld fifo (2 van 7) 86 template class fifo: public sc_channel, public fifo_write_if, public fifo_read_if { private: list data; const int max_elements; sc_event write_event, read_event; bool empty() const { return data.size() == 0; } bool full() const { return data.size() == max_elements; } public: fifo(sc_module_name name, int n): sc_channel(name), max_elements(n) { } virtual ~fifo() { }
18
Voorbeeld fifo (3 van 7) 87 virtual void write(const element& c) override { if (full()) { wait(read_event); } data.push_back(c); write_event.notify(); } virtual element read() override { if (empty()) { wait(write_event); } element c = data.front(); data.pop_front(); read_event.notify(); return c; } virtual int num_available() const override { return data.size(); } };
19
Voorbeeld fifo (4 van 7) 88 SC_MODULE(Top) { SC_CTOR(Top): consumer("consumer"), producer("producer"), fifo("fifo", 4) { producer.out(fifo); consumer.in(fifo); } private: fifo fifo; Producer producer; Consumer consumer; };
20
Voorbeeld fifo (5 van 7) 89 SC_MODULE(Producer) { sc_port > out; SC_CTOR(Producer) { SC_THREAD(main); } private: void main() { for (char c = 'A'; c <= 'Z'; ++c) { wait(5, SC_NS); out->write(c); } };
21
Voorbeeld fifo (6 van 7) 90 SC_MODULE(Consumer) { sc_port > in; SC_CTOR(Consumer) { SC_THREAD(main); } private: void main() { char c; do { wait(6, SC_NS); c = in->read(); cout << "Read: " << c << " number of characters in buffer: " num_available() << endl; } while (c != 'Z'); } };
22
Voorbeeld fifo (7 van 7) 91
23
Huiswerk pq (1 van 7) 92 template class pq_write_if : virtual public sc_interface { public: virtual void write(const element&) = 0; }; template class pq_read_if : virtual public sc_interface { public: virtual element read() = 0; virtual int num_available() const = 0; };
24
Huiswerk pq (2 van 7) 93 template class pq: public sc_channel, public pq_write_if, public pq_read_if { private: priority_queue data; const int max_elements; sc_event write_event, read_event; bool empty() const { return data.size() == 0; } bool full() const { return data.size() == max_elements; } public: pq(sc_module_name name, int n): sc_channel(name), max_elements(n) { } virtual ~pq() { }
25
Huiswerk pq (3 van 7) 94 virtual void write(const element& c) override { if (full()) { wait(read_event); } data.push(c); write_event.notify(); } virtual element read() override { if (empty()) { wait(write_event); } element c = data.top(); data.pop(); read_event.notify(); return c; } virtual int num_available() const override { return data.size(); } };
26
Huiswerk pq (4 van 7) 95 SC_MODULE(Top) { SC_CTOR(Top): consumer("consumer"), producer("producer"), pq("pq", 4) { producer.out(pq); consumer.in(pq); } private: pq pq; Producer producer; Consumer consumer; };
27
Huiswerk pq (5 van 7) 96 SC_MODULE(Producer) { sc_port > out; SC_CTOR(Producer) { SC_THREAD(main); } private: void main() { for (char c = 'A'; c <= 'Z'; ++c) { wait(5, SC_NS); out->write(c); } };
28
Huiswerk pq (6 van 7) 97 SC_MODULE(Consumer) { sc_port > in; SC_CTOR(Consumer) { SC_THREAD(main); } private: void main() { char c; for (int i = 0; i < 26; ++i) { wait(6, SC_NS); c = in->read(); cout << "Read: " << c << " number of characters in buffer: " num_available() << endl; } };
29
Huiswerk pq (7 van 7) 98
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.