#include <systemc>

using namespace sc_core;
using namespace sc_dt;
using namespace std;

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); // the consumer is a bit slower than the producer
            c = fifo.read();
            cout << "Read: " << c << " number of characters in buffer: " << fifo.num_available() << endl;
        } while (c != 'Z');
    }
    sc_fifo<char> fifo;
};

int sc_main(int argc, char *argv[]) {
    Top top("top");
    sc_start();
    cin.get();
    return 0;
}
