1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
#include "systemc.h"
// Ce module représente un composant software pour l'affichage
SC_MODULE(SOFTWARE)
{
SC_CTOR(SOFTWARE)
{
SC_CTHREAD(software,m_clk.pos());
reset_signal_is(m_reset,false);
}
void software()
{
cout << sc_time_stamp() << ": reset" << endl;
while (1)
{
m_ready = true;
do { wait(); } while ( !m_valid);
cout << sc_time_stamp() << ": " << m_value.read() << endl;
}
}
sc_in_clk m_clk;
sc_inout<bool> m_ready;
sc_in<bool> m_reset;
sc_in<bool> m_valid;
sc_in<int> m_value;
};
// Ce module représente le composant hardware d'un compteur
SC_MODULE(HARDWARE)
{
SC_CTOR(HARDWARE)
{
SC_CTHREAD(hardware,m_clk.pos());
reset_signal_is(m_reset,false);
}
void hardware()
{
m_value = 0;
while (1)
{
m_valid = true;
do { wait(); } while (!m_ready);
m_value = m_value + 1;
}
}
sc_in_clk m_clk;
sc_in<bool> m_ready;
sc_in<bool> m_reset;
sc_inout<bool> m_valid;
sc_inout<int> m_value;
};
// Ce module représente le système embarqué!
SC_MODULE(EMBEDDED)
{
SC_CTOR(EMBEDDED) : m_software("software"), m_hardware("hardware")
{
SC_CTHREAD(embedded,m_clk.pos());
m_software.m_clk(m_clk);
m_software.m_ready(m_ready);
m_software.m_reset(m_reset);
m_software.m_valid(m_valid);
m_software.m_value(m_value);
m_hardware.m_clk(m_clk);
m_hardware.m_ready(m_ready);
m_hardware.m_reset(m_reset);
m_hardware.m_valid(m_valid);
m_hardware.m_value(m_value);
}
void embedded()
{
for ( int state = 0; state < 100; state++ )
{
m_reset = ( state%20 == 12 ) ? false : true;
wait();
}
sc_stop();
}
sc_in_clk m_clk;
SOFTWARE m_software;
HARDWARE m_hardware;
sc_signal<bool> m_ready;
sc_signal<bool> m_reset;
sc_signal<bool> m_valid;
sc_signal<int> m_value;
};
// la fonction main
int sc_main(int argc, char * argv[])
{
sc_clock clock;
EMBEDDED embedded("embedded");
embedded.m_clk(clock);
sc_start(5000, SC_NS);
cout << "Done" << endl;
int a;
cin>>a;
return 0;
} |
Partager