blob: f6c6046cbe5f9c9b05e1d9b4f2c7c8c2070eadb9 [file] [log] [blame]
#include "systemc.h"
#include "specialized_signals/scx_signal_int.h"
#include "specialized_signals/scx_signal_signed.h"
#include "specialized_signals/scx_signal_uint.h"
#include "specialized_signals/scx_signal_unsigned.h"
SC_MODULE(up_down)
{
sc_in_clk clk;
sc_in<sc_uint<1> > up;
sc_in<sc_uint<1> > down;
sc_in<sc_uint<9> > data_in;
sc_inout<sc_uint<1> > parity_out;
sc_inout<sc_uint<1> > carry_out;
sc_inout<sc_uint<1> > borrow_out;
sc_inout<sc_uint<9> > count_out;
sc_uint<10> cnt_dn;
sc_uint<10> cnt_up;
sc_uint<9> count_nxt;
sc_uint<1> load;
SC_CTOR(up_down)
{
SC_METHOD(run);
sensitive << clk.pos();
}
void run()
{
cnt_dn = count_out - 5;
cnt_up = count_out + 3;
load = 1;
switch( (unsigned int )(up,down) ) {
case(0):
count_nxt = data_in;
break;
case(1):
count_nxt = cnt_dn;
break;
case(2):
count_nxt = cnt_up;
break;
case(3):
load = 0;
break;
}
if( load) {
parity_out = count_nxt.xor_reduce();
carry_out = up&cnt_up[9];
borrow_out = down&cnt_dn[9];
count_out = count_nxt;
}
}
};
#define UP_DOWN(up, down) up, down
struct stimulus {
int up;
int down;
int data_in;
} s[] = {
{ UP_DOWN(0, 0), 200 }, /* load 200 */
{ UP_DOWN(1, 0), 0 }, /* inc */
{ UP_DOWN(1, 0), 0 }, /* inc */
{ UP_DOWN(0, 1), 0 }, /* dec */
{ UP_DOWN(0, 1), 0 }, /* dec */
{ UP_DOWN(0, 1), 0 }, /* dec */
{ UP_DOWN(1, 1), 0 }, /* hold */
{ UP_DOWN(1, 1), 0 }, /* hold */
{ UP_DOWN(1, 1), 0 }, /* hold */
{ UP_DOWN(0, 0), 200 }, /* load 200 */
{ UP_DOWN(1, 1), 0 }, /* hold */
{ UP_DOWN(1, 1), 0 }, /* hold */
{ UP_DOWN(0, 1), 0 }, /* dec */
{ UP_DOWN(0, 0), 2 }, /* load 2 */
{ UP_DOWN(0, 1), 0 }, /* dec */
{ UP_DOWN(0, 0), 0x1ff},/* load 0x1ff */
{ UP_DOWN(1, 0), 0 }, /* inc */
};
int sc_main(int argc, char* argv[])
{
sc_signal<sc_uint<1> > borrow_out;
sc_signal<sc_uint<1> > carry_out;
sc_clock clock;
sc_signal<sc_uint<9> > count_out;
sc_signal<sc_uint<9> > data_in;
sc_signal<sc_uint<1> > down;
unsigned int i;
sc_signal<sc_uint<1> > parity_out;
sc_signal<sc_uint<1> > up;
up_down up_down_0("up_down_0");
up_down_0.borrow_out(borrow_out);
up_down_0.carry_out(carry_out);
up_down_0.data_in(data_in);
up_down_0.clk(clock);
up_down_0.count_out(count_out);
up_down_0.down(down);
up_down_0.parity_out(parity_out);
up_down_0.up(up);
printf("%5s %2s %4s %7s %10s %8s %10s %9s\n",
"clock", "up", "down", "data_in", "parity_out",
"carry_out", "borrow_out", "count_out");
for( i = 0; i < sizeof s/sizeof(struct stimulus); i++) {
up = s[i].up;
down = s[i].down;
data_in = s[i].data_in;
sc_start(1, SC_NS);
printf("%5d %2d %4d %7d %10d %8d %10d %9d\n",
(int)sc_time_stamp().to_double()/1000, (int)up, (int)down,
(int)data_in, (int)parity_out, (int)carry_out, (int)borrow_out,
(int)count_out);
}
/* get last register values */
printf("%5d %2d %4d %7d %10d %8d %10d %9d\n",
(int)sc_time_stamp().to_double()/1000, (int)up, (int)down,
(int)data_in, (int)parity_out, (int)carry_out, (int)borrow_out,
(int)count_out);
return 0;
}