112855Sgabeblack@google.com#include "systemc.h" 212855Sgabeblack@google.com#include "specialized_signals/scx_signal_int.h" 312855Sgabeblack@google.com#include "specialized_signals/scx_signal_signed.h" 412855Sgabeblack@google.com#include "specialized_signals/scx_signal_uint.h" 512855Sgabeblack@google.com#include "specialized_signals/scx_signal_unsigned.h" 612855Sgabeblack@google.com 712855Sgabeblack@google.comSC_MODULE(up_down) 812855Sgabeblack@google.com{ 912855Sgabeblack@google.com sc_in_clk clk; 1012855Sgabeblack@google.com sc_in<sc_uint<1> > up; 1112855Sgabeblack@google.com sc_in<sc_uint<1> > down; 1212855Sgabeblack@google.com sc_in<sc_uint<9> > data_in; 1312855Sgabeblack@google.com sc_inout<sc_uint<1> > parity_out; 1412855Sgabeblack@google.com sc_inout<sc_uint<1> > carry_out; 1512855Sgabeblack@google.com sc_inout<sc_uint<1> > borrow_out; 1612855Sgabeblack@google.com sc_inout<sc_uint<9> > count_out; 1712855Sgabeblack@google.com 1812855Sgabeblack@google.com sc_uint<10> cnt_dn; 1912855Sgabeblack@google.com sc_uint<10> cnt_up; 2012855Sgabeblack@google.com sc_uint<9> count_nxt; 2112855Sgabeblack@google.com sc_uint<1> load; 2212855Sgabeblack@google.com 2312855Sgabeblack@google.com SC_CTOR(up_down) 2412855Sgabeblack@google.com { 2512855Sgabeblack@google.com SC_METHOD(run); 2612855Sgabeblack@google.com sensitive << clk.pos(); 2712855Sgabeblack@google.com } 2812855Sgabeblack@google.com 2912855Sgabeblack@google.com void run() 3012855Sgabeblack@google.com { 3112855Sgabeblack@google.com cnt_dn = count_out - 5; 3212855Sgabeblack@google.com cnt_up = count_out + 3; 3312855Sgabeblack@google.com 3412855Sgabeblack@google.com load = 1; 3512855Sgabeblack@google.com switch( (unsigned int )(up,down) ) { 3612855Sgabeblack@google.com case(0): 3712855Sgabeblack@google.com count_nxt = data_in; 3812855Sgabeblack@google.com break; 3912855Sgabeblack@google.com case(1): 4012855Sgabeblack@google.com count_nxt = cnt_dn; 4112855Sgabeblack@google.com break; 4212855Sgabeblack@google.com case(2): 4312855Sgabeblack@google.com count_nxt = cnt_up; 4412855Sgabeblack@google.com break; 4512855Sgabeblack@google.com case(3): 4612855Sgabeblack@google.com load = 0; 4712855Sgabeblack@google.com break; 4812855Sgabeblack@google.com } 4912855Sgabeblack@google.com 5012855Sgabeblack@google.com if( load) { 5112855Sgabeblack@google.com parity_out = count_nxt.xor_reduce(); 5212855Sgabeblack@google.com carry_out = up&cnt_up[9]; 5312855Sgabeblack@google.com borrow_out = down&cnt_dn[9]; 5412855Sgabeblack@google.com count_out = count_nxt; 5512855Sgabeblack@google.com } 5612855Sgabeblack@google.com } 5712855Sgabeblack@google.com}; 5812855Sgabeblack@google.com 5912855Sgabeblack@google.com 6012855Sgabeblack@google.com#define UP_DOWN(up, down) up, down 6112855Sgabeblack@google.com 6212855Sgabeblack@google.comstruct stimulus { 6312855Sgabeblack@google.com int up; 6412855Sgabeblack@google.com int down; 6512855Sgabeblack@google.com int data_in; 6612855Sgabeblack@google.com} s[] = { 6712855Sgabeblack@google.com { UP_DOWN(0, 0), 200 }, /* load 200 */ 6812855Sgabeblack@google.com { UP_DOWN(1, 0), 0 }, /* inc */ 6912855Sgabeblack@google.com { UP_DOWN(1, 0), 0 }, /* inc */ 7012855Sgabeblack@google.com { UP_DOWN(0, 1), 0 }, /* dec */ 7112855Sgabeblack@google.com { UP_DOWN(0, 1), 0 }, /* dec */ 7212855Sgabeblack@google.com { UP_DOWN(0, 1), 0 }, /* dec */ 7312855Sgabeblack@google.com { UP_DOWN(1, 1), 0 }, /* hold */ 7412855Sgabeblack@google.com { UP_DOWN(1, 1), 0 }, /* hold */ 7512855Sgabeblack@google.com { UP_DOWN(1, 1), 0 }, /* hold */ 7612855Sgabeblack@google.com { UP_DOWN(0, 0), 200 }, /* load 200 */ 7712855Sgabeblack@google.com { UP_DOWN(1, 1), 0 }, /* hold */ 7812855Sgabeblack@google.com { UP_DOWN(1, 1), 0 }, /* hold */ 7912855Sgabeblack@google.com { UP_DOWN(0, 1), 0 }, /* dec */ 8012855Sgabeblack@google.com { UP_DOWN(0, 0), 2 }, /* load 2 */ 8112855Sgabeblack@google.com { UP_DOWN(0, 1), 0 }, /* dec */ 8212855Sgabeblack@google.com { UP_DOWN(0, 0), 0x1ff},/* load 0x1ff */ 8312855Sgabeblack@google.com { UP_DOWN(1, 0), 0 }, /* inc */ 8412855Sgabeblack@google.com}; 8512855Sgabeblack@google.com 8612855Sgabeblack@google.com 8712855Sgabeblack@google.comint sc_main(int argc, char* argv[]) 8812855Sgabeblack@google.com{ 8912855Sgabeblack@google.com sc_signal<sc_uint<1> > borrow_out; 9012855Sgabeblack@google.com sc_signal<sc_uint<1> > carry_out; 9112855Sgabeblack@google.com sc_clock clock; 9212855Sgabeblack@google.com sc_signal<sc_uint<9> > count_out; 9312855Sgabeblack@google.com sc_signal<sc_uint<9> > data_in; 9412855Sgabeblack@google.com sc_signal<sc_uint<1> > down; 9512855Sgabeblack@google.com unsigned int i; 9612855Sgabeblack@google.com sc_signal<sc_uint<1> > parity_out; 9712855Sgabeblack@google.com sc_signal<sc_uint<1> > up; 9812855Sgabeblack@google.com 9912855Sgabeblack@google.com up_down up_down_0("up_down_0"); 10012855Sgabeblack@google.com up_down_0.borrow_out(borrow_out); 10112855Sgabeblack@google.com up_down_0.carry_out(carry_out); 10212855Sgabeblack@google.com up_down_0.data_in(data_in); 10312855Sgabeblack@google.com up_down_0.clk(clock); 10412855Sgabeblack@google.com up_down_0.count_out(count_out); 10512855Sgabeblack@google.com up_down_0.down(down); 10612855Sgabeblack@google.com up_down_0.parity_out(parity_out); 10712855Sgabeblack@google.com up_down_0.up(up); 10812855Sgabeblack@google.com 10912855Sgabeblack@google.com printf("%5s %2s %4s %7s %10s %8s %10s %9s\n", 11012855Sgabeblack@google.com "clock", "up", "down", "data_in", "parity_out", 11112855Sgabeblack@google.com "carry_out", "borrow_out", "count_out"); 11212855Sgabeblack@google.com 11312855Sgabeblack@google.com for( i = 0; i < sizeof s/sizeof(struct stimulus); i++) { 11412855Sgabeblack@google.com up = s[i].up; 11512855Sgabeblack@google.com down = s[i].down; 11612855Sgabeblack@google.com data_in = s[i].data_in; 11712855Sgabeblack@google.com 11812855Sgabeblack@google.com sc_start(1, SC_NS); 11912855Sgabeblack@google.com 12012855Sgabeblack@google.com printf("%5d %2d %4d %7d %10d %8d %10d %9d\n", 12112855Sgabeblack@google.com (int)sc_time_stamp().to_double()/1000, (int)up, (int)down, 12212855Sgabeblack@google.com (int)data_in, (int)parity_out, (int)carry_out, (int)borrow_out, 12312855Sgabeblack@google.com (int)count_out); 12412855Sgabeblack@google.com } 12512855Sgabeblack@google.com 12612855Sgabeblack@google.com /* get last register values */ 12712855Sgabeblack@google.com printf("%5d %2d %4d %7d %10d %8d %10d %9d\n", 12812855Sgabeblack@google.com (int)sc_time_stamp().to_double()/1000, (int)up, (int)down, 12912855Sgabeblack@google.com (int)data_in, (int)parity_out, (int)carry_out, (int)borrow_out, 13012855Sgabeblack@google.com (int)count_out); 13112855Sgabeblack@google.com 13212855Sgabeblack@google.com return 0; 13312855Sgabeblack@google.com} 13412855Sgabeblack@google.com 135