#include #include "../include/Environment.h" using namespace std; using namespace environment; using namespace morpheo; #define _TEST_IMEMORY_ true #define _TEST_DMEMORY_ true #define _TEST_TTY_ true #define _TEST_RAMLOCK_ true #define _TEST_SIM2OS_ true #define TEST(x,y) \ { \ cout << "Line " << __LINE__ << " : "; \ if (x==y) \ { \ cout << "Test OK" << endl; \ } \ else \ { \ cout << "Test KO" << endl; \ exit (EXIT_FAILURE); \ } \ } while (0) int sc_main (int argc, char * argv[]) { cout << "
Begin" << endl; { uint32_t nb_entity = 2; uint32_t * iaccess_nb_context = new uint32_t [nb_entity]; uint32_t * iaccess_nb_instruction= new uint32_t [nb_entity]; uint32_t * iaccess_nb_packet = new uint32_t [nb_entity]; uint32_t * iaccess_size_address = new uint32_t [nb_entity]; uint32_t * iaccess_size_data = new uint32_t [nb_entity]; uint32_t * daccess_nb_context = new uint32_t [nb_entity]; uint32_t * daccess_nb_packet = new uint32_t [nb_entity]; uint32_t * daccess_size_address = new uint32_t [nb_entity]; uint32_t * daccess_size_data = new uint32_t [nb_entity]; uint32_t * buffer_irsp_size = new uint32_t [nb_entity]; uint32_t * buffer_drsp_size = new uint32_t [nb_entity]; for (uint32_t i=0; isetMSBNumber (8); segtable->setDefaultTarget(0,0); //shared data segment const int TEXT_BASE = 0x00000000; const int DATA_CACHED_BASE = 0x10000000; const int DATA_UNCACHED_BASE = 0x40000000; const int TEXT_SIZE = 0x4000; const int DATA_CACHED_SIZE = 0x4000; const int DATA_UNCACHED_SIZE = 0x4000; // Add a segment ,name ,address of base ,size ,global index,local index,uncache segtable->addSegment("text" ,TEXT_BASE ,TEXT_SIZE ,0 ,0 ,false); segtable->addSegment("data" ,DATA_CACHED_BASE ,DATA_CACHED_SIZE ,0 ,0 ,false); segtable->addSegment("data_unc",DATA_UNCACHED_BASE,DATA_UNCACHED_SIZE,0 ,0 ,true ); Parameters * param = new Parameters (nb_entity, iaccess_nb_context, iaccess_nb_instruction, iaccess_nb_packet, iaccess_size_address, iaccess_size_data, daccess_nb_context, daccess_nb_packet, daccess_size_address, daccess_size_data, buffer_irsp_size, buffer_drsp_size, icache_nb_level , icache_nb_port , icache_nb_line , icache_size_line , icache_size_word , icache_associativity, icache_hit_latence , icache_miss_penality, dcache_nb_level , dcache_nb_port , dcache_nb_line , dcache_size_line , dcache_size_word , dcache_associativity, dcache_hit_latence , dcache_miss_penality, 1 , // cache_shared_nb_port , cache_shared_nb_line , cache_shared_size_line , cache_shared_size_word , cache_shared_associativity , cache_shared_hit_latence , cache_shared_miss_penality , nb_component_tty, tty_address, nb_tty, name_tty, false, // don't execute xtty nb_component_ramlock, ramlock_address, nb_lock, sim2os_address, sim2os_size, segtable ); segtable->print(); Environment * env = new Environment ("environment",param); const char * filename = "Data/selftest/data/soft.x"; const char * sections_text [] = {".text",NULL}; const char * sections_data [] = {".data",".rodata",".bss",".sdata",".sbss", NULL}; env->init("text" , filename, sections_text); env->init("data" , filename, sections_data); // cout << "
Press to stop the test" << endl; // getchar(); //============================================================================== //===== [ DECLARATION ]========================================================= //============================================================================== sc_clock * CLOCK = new sc_clock ("clock", 1.0, 0.5); sc_signal * NRESET = new sc_signal ("NRESET"); sc_signal *** ICACHE_REQ_VAL = new sc_signal ** [nb_entity]; sc_signal *** ICACHE_REQ_ACK = new sc_signal ** [nb_entity]; sc_signal *** ICACHE_REQ_CONTEXT_ID = new sc_signal ** [nb_entity]; sc_signal *** ICACHE_REQ_PACKET_ID = new sc_signal ** [nb_entity]; sc_signal *** ICACHE_REQ_ADDRESS = new sc_signal ** [nb_entity]; sc_signal *** ICACHE_REQ_TYPE = new sc_signal ** [nb_entity]; sc_signal *** ICACHE_RSP_VAL = new sc_signal ** [nb_entity]; sc_signal *** ICACHE_RSP_ACK = new sc_signal ** [nb_entity]; sc_signal *** ICACHE_RSP_CONTEXT_ID = new sc_signal ** [nb_entity]; sc_signal *** ICACHE_RSP_PACKET_ID = new sc_signal ** [nb_entity]; sc_signal **** ICACHE_RSP_INSTRUCTION= new sc_signal *** [nb_entity];//[nb_instruction] sc_signal *** ICACHE_RSP_ERROR = new sc_signal ** [nb_entity]; sc_signal *** DCACHE_REQ_VAL = new sc_signal ** [nb_entity]; sc_signal *** DCACHE_REQ_ACK = new sc_signal ** [nb_entity]; sc_signal *** DCACHE_REQ_CONTEXT_ID = new sc_signal ** [nb_entity]; sc_signal *** DCACHE_REQ_PACKET_ID = new sc_signal ** [nb_entity]; sc_signal *** DCACHE_REQ_ADDRESS = new sc_signal ** [nb_entity]; sc_signal *** DCACHE_REQ_TYPE = new sc_signal ** [nb_entity]; sc_signal *** DCACHE_REQ_WDATA = new sc_signal ** [nb_entity]; sc_signal *** DCACHE_RSP_VAL = new sc_signal ** [nb_entity]; sc_signal *** DCACHE_RSP_ACK = new sc_signal ** [nb_entity]; sc_signal *** DCACHE_RSP_CONTEXT_ID = new sc_signal ** [nb_entity]; sc_signal *** DCACHE_RSP_PACKET_ID = new sc_signal ** [nb_entity]; sc_signal *** DCACHE_RSP_RDATA = new sc_signal ** [nb_entity]; sc_signal *** DCACHE_RSP_ERROR = new sc_signal ** [nb_entity]; for (uint32_t i=0; i * [icache_nb_port[i]]; ICACHE_REQ_ACK [i] = new sc_signal * [icache_nb_port[i]]; ICACHE_REQ_CONTEXT_ID [i] = new sc_signal * [icache_nb_port[i]]; ICACHE_REQ_PACKET_ID [i] = new sc_signal * [icache_nb_port[i]]; ICACHE_REQ_ADDRESS [i] = new sc_signal * [icache_nb_port[i]]; ICACHE_REQ_TYPE [i] = new sc_signal * [icache_nb_port[i]]; ICACHE_RSP_VAL [i] = new sc_signal * [icache_nb_port[i]]; ICACHE_RSP_ACK [i] = new sc_signal * [icache_nb_port[i]]; ICACHE_RSP_CONTEXT_ID [i] = new sc_signal * [icache_nb_port[i]]; ICACHE_RSP_PACKET_ID [i] = new sc_signal * [icache_nb_port[i]]; ICACHE_RSP_INSTRUCTION[i] = new sc_signal ** [icache_nb_port[i]];//[nb_instruction] ICACHE_RSP_ERROR [i] = new sc_signal * [icache_nb_port[i]]; for (uint32_t j=0; j (""); ICACHE_REQ_ACK [i][j] = new sc_signal (""); ICACHE_REQ_CONTEXT_ID [i][j] = new sc_signal (""); ICACHE_REQ_PACKET_ID [i][j] = new sc_signal (""); ICACHE_REQ_ADDRESS [i][j] = new sc_signal (""); ICACHE_REQ_TYPE [i][j] = new sc_signal (""); ICACHE_RSP_VAL [i][j] = new sc_signal (""); ICACHE_RSP_ACK [i][j] = new sc_signal (""); ICACHE_RSP_CONTEXT_ID [i][j] = new sc_signal (""); ICACHE_RSP_PACKET_ID [i][j] = new sc_signal (""); ICACHE_RSP_ERROR [i][j] = new sc_signal (""); ICACHE_RSP_INSTRUCTION [i][j] = new sc_signal * [iaccess_nb_instruction[i]]; for (uint32_t k=0; k (""); } DCACHE_REQ_VAL [i] = new sc_signal * [dcache_nb_port[i]]; DCACHE_REQ_ACK [i] = new sc_signal * [dcache_nb_port[i]]; DCACHE_REQ_CONTEXT_ID [i] = new sc_signal * [dcache_nb_port[i]]; DCACHE_REQ_PACKET_ID [i] = new sc_signal * [dcache_nb_port[i]]; DCACHE_REQ_ADDRESS [i] = new sc_signal * [dcache_nb_port[i]]; DCACHE_REQ_TYPE [i] = new sc_signal * [dcache_nb_port[i]]; DCACHE_REQ_WDATA [i] = new sc_signal * [dcache_nb_port[i]]; DCACHE_RSP_VAL [i] = new sc_signal * [dcache_nb_port[i]]; DCACHE_RSP_ACK [i] = new sc_signal * [dcache_nb_port[i]]; DCACHE_RSP_CONTEXT_ID [i] = new sc_signal * [dcache_nb_port[i]]; DCACHE_RSP_PACKET_ID [i] = new sc_signal * [dcache_nb_port[i]]; DCACHE_RSP_RDATA [i] = new sc_signal * [dcache_nb_port[i]]; DCACHE_RSP_ERROR [i] = new sc_signal * [dcache_nb_port[i]]; for (uint32_t j=0; j (""); DCACHE_REQ_ACK [i][j] = new sc_signal (""); DCACHE_REQ_CONTEXT_ID [i][j] = new sc_signal (""); DCACHE_REQ_PACKET_ID [i][j] = new sc_signal (""); DCACHE_REQ_ADDRESS [i][j] = new sc_signal (""); DCACHE_REQ_TYPE [i][j] = new sc_signal (""); DCACHE_REQ_WDATA [i][j] = new sc_signal (""); DCACHE_RSP_VAL [i][j] = new sc_signal (""); DCACHE_RSP_ACK [i][j] = new sc_signal (""); DCACHE_RSP_CONTEXT_ID [i][j] = new sc_signal (""); DCACHE_RSP_PACKET_ID [i][j] = new sc_signal (""); DCACHE_RSP_RDATA [i][j] = new sc_signal (""); DCACHE_RSP_ERROR [i][j] = new sc_signal (""); } } //============================================================================== //===== [ INSTANCE ]============================================================ //============================================================================== // instance (*(env->CLOCK )) (*(CLOCK )); (*(env->NRESET)) (*(NRESET)); for (uint32_t i=0; iICACHE_REQ_VAL [i][j])) (*(ICACHE_REQ_VAL [i][j])); (*(env->ICACHE_REQ_ACK [i][j])) (*(ICACHE_REQ_ACK [i][j])); (*(env->ICACHE_REQ_CONTEXT_ID [i][j])) (*(ICACHE_REQ_CONTEXT_ID [i][j])); (*(env->ICACHE_REQ_PACKET_ID [i][j])) (*(ICACHE_REQ_PACKET_ID [i][j])); (*(env->ICACHE_REQ_ADDRESS [i][j])) (*(ICACHE_REQ_ADDRESS [i][j])); (*(env->ICACHE_REQ_TYPE [i][j])) (*(ICACHE_REQ_TYPE [i][j])); (*(env->ICACHE_RSP_VAL [i][j])) (*(ICACHE_RSP_VAL [i][j])); (*(env->ICACHE_RSP_ACK [i][j])) (*(ICACHE_RSP_ACK [i][j])); (*(env->ICACHE_RSP_CONTEXT_ID [i][j])) (*(ICACHE_RSP_CONTEXT_ID [i][j])); (*(env->ICACHE_RSP_PACKET_ID [i][j])) (*(ICACHE_RSP_PACKET_ID [i][j])); (*(env->ICACHE_RSP_ERROR [i][j])) (*(ICACHE_RSP_ERROR [i][j])); for (uint32_t k=0; kICACHE_RSP_INSTRUCTION [i][j][k])) (*(ICACHE_RSP_INSTRUCTION [i][j][k])); } for (uint32_t j=0; jDCACHE_REQ_VAL [i][j])) (*(DCACHE_REQ_VAL [i][j])); (*(env->DCACHE_REQ_ACK [i][j])) (*(DCACHE_REQ_ACK [i][j])); (*(env->DCACHE_REQ_CONTEXT_ID [i][j])) (*(DCACHE_REQ_CONTEXT_ID [i][j])); (*(env->DCACHE_REQ_PACKET_ID [i][j])) (*(DCACHE_REQ_PACKET_ID [i][j])); (*(env->DCACHE_REQ_ADDRESS [i][j])) (*(DCACHE_REQ_ADDRESS [i][j])); (*(env->DCACHE_REQ_TYPE [i][j])) (*(DCACHE_REQ_TYPE [i][j])); (*(env->DCACHE_REQ_WDATA [i][j])) (*(DCACHE_REQ_WDATA [i][j])); (*(env->DCACHE_RSP_VAL [i][j])) (*(DCACHE_RSP_VAL [i][j])); (*(env->DCACHE_RSP_ACK [i][j])) (*(DCACHE_RSP_ACK [i][j])); (*(env->DCACHE_RSP_CONTEXT_ID [i][j])) (*(DCACHE_RSP_CONTEXT_ID [i][j])); (*(env->DCACHE_RSP_PACKET_ID [i][j])) (*(DCACHE_RSP_PACKET_ID [i][j])); (*(env->DCACHE_RSP_RDATA [i][j])) (*(DCACHE_RSP_RDATA [i][j])); (*(env->DCACHE_RSP_ERROR [i][j])) (*(DCACHE_RSP_ERROR [i][j])); } } //============================================================================== //===== [ INIT ]================================================================ //============================================================================== const uint32_t seed = 0; // const uint32_t seed = static_cast(time(NULL)); srand(seed); sc_start(0); // reset NRESET->write(0); sc_start(5); NRESET->write(1); sc_start(1); // cout << *env << endl; //============================================================================== //===== [ ICACHE ]============================================================== //============================================================================== if (_TEST_IMEMORY_) { cout << "Test : ICACHE" << endl; // Test no respons for (uint32_t i = 0; i < param->nb_entity; i++) for (uint32_t j=0; jicache_dedicated_nb_port [i]; j++) { TEST(ICACHE_RSP_VAL [i][j]->read(), 0); ICACHE_RSP_ACK [i][j]->write(0); } for (uint32_t i = 0; i < param->nb_entity; i++) for (uint32_t j=0; jdcache_dedicated_nb_port [i]; j++) { TEST(DCACHE_RSP_VAL [i][j]->read(), 0); DCACHE_RSP_ACK [i][j]->write(0); } const int32_t percent_transaction_icache_req = 75; const int32_t percent_transaction_icache_rsp = 75; uint32_t packet_req = 0; uint32_t packet_rsp = 0; Ticache_address_t addr_max = 0xf0; do { Ticache_packet_t packet_req_next = packet_req; Ticache_address_t addr = (packet_req_next << 2); for (uint32_t i=0; inb_entity; i++) for (uint32_t j=0; jicache_dedicated_nb_port [i]; j++) { ICACHE_REQ_VAL [i][j]->write((addr < addr_max) and ((rand()%100)write(0); ICACHE_REQ_ADDRESS [i][j]->write(addr>>2); ICACHE_REQ_PACKET_ID [i][j]->write(addr>>2); ICACHE_REQ_TYPE [i][j]->write(ICACHE_TYPE_LOAD); packet_req_next++; addr += (param->iaccess_nb_instruction[i]<<2); } for (uint32_t i=0; inb_entity; i++) for (uint32_t j=0; jicache_dedicated_nb_port [i]; j++) { ICACHE_RSP_ACK [i][j]->write((rand()%100)nb_entity; i++) for (uint32_t j=0; jicache_dedicated_nb_port [i]; j++) { cout << "ICACHE_REQ_VALACK (" << ICACHE_REQ_VAL [i][j]->read() << "," << ICACHE_REQ_ACK [i][j]->read() << ")" << endl; if (ICACHE_REQ_VAL [i][j]->read() and ICACHE_REQ_ACK [i][j]->read()) { cout << "packet_req : " << packet_req << endl; packet_req ++; } } for (uint32_t i=0; inb_entity; i++) for (uint32_t j=0; jicache_dedicated_nb_port [i]; j++) { cout << "ICACHE_RSP_VALACK (" << ICACHE_RSP_VAL [i][j]->read() << "," << ICACHE_RSP_ACK [i][j]->read() << ")" << endl; if (ICACHE_RSP_VAL [i][j]->read() and ICACHE_RSP_ACK [i][j]->read()) { cout << "packet_rsp : " << packet_rsp << endl; packet_rsp ++; TEST(ICACHE_RSP_ERROR [i][j]->read(),ICACHE_ERROR_NONE); TEST(ICACHE_RSP_CONTEXT_ID[i][j]->read(),0); Ticache_packet_t packet = ICACHE_RSP_PACKET_ID [i][j]->read(); for (unsigned int k=0; kiaccess_nb_instruction[i]; k++) { Ticache_instruction_t inst = ICACHE_RSP_INSTRUCTION[i][j][k]->read(); cout << "instruction [" << k << "] : " << std::hex << inst << std::dec << endl; TEST((inst>>16) , 0x1500); // copdop nop TEST((inst&0xffff) , ((0xffff ^ (packet+k))+1)); // packet in CA2 } } } } while (((packet_req<<2)< addr_max) or ((packet_rsp<<2)< addr_max)); for (uint32_t i=0; inb_entity; i++) { for (uint32_t j=0; jicache_dedicated_nb_port [i]; j++) ICACHE_REQ_VAL [i][j]->write(0); for (uint32_t j=0; jicache_dedicated_nb_port [i]; j++) ICACHE_RSP_ACK [i][j]->write(1); } sc_start(50); for (uint32_t i=0; inb_entity; i++) for (uint32_t j=0; jicache_dedicated_nb_port [i]; j++) ICACHE_RSP_ACK [i][j]->write(0); cout << "Test : icache - bus error" << endl; // 1) in not valid segment ICACHE_REQ_VAL [0][0]->write(1); ICACHE_REQ_CONTEXT_ID [0][0]->write(0); ICACHE_REQ_ADDRESS [0][0]->write(0xe0000000>>2); ICACHE_REQ_PACKET_ID [0][0]->write(21); ICACHE_REQ_TYPE [0][0]->write(ICACHE_TYPE_LOAD); ICACHE_RSP_ACK [0][0]->write(1); do { sc_start(1); } while (ICACHE_REQ_ACK [0][0]->read() == 0); ICACHE_REQ_VAL [0][0]->write(0); sc_start (9); TEST(ICACHE_RSP_VAL [0][0]->read(), 0); sc_start (1); TEST(ICACHE_RSP_VAL [0][0]->read(), 1); TEST(ICACHE_RSP_CONTEXT_ID [0][0] ->read(), 0); TEST(ICACHE_RSP_PACKET_ID [0][0] ->read(), 21); TEST(ICACHE_RSP_INSTRUCTION [0][0][0]->read(), 0xe0000000); TEST(ICACHE_RSP_ERROR [0][0] ->read(), ICACHE_ERROR_BUS_ERROR); sc_start (1); TEST(ICACHE_RSP_VAL [0][0]->read(), 0); sc_start (10); // 2) in valid segment but not memory ICACHE_REQ_VAL [0][0]->write(1); ICACHE_REQ_CONTEXT_ID [0][0]->write(0); ICACHE_REQ_ADDRESS [0][0]->write(0xa0000000>>2); ICACHE_REQ_PACKET_ID [0][0]->write(21); ICACHE_REQ_TYPE [0][0]->write(ICACHE_TYPE_LOAD); ICACHE_RSP_ACK [0][0]->write(1); do { sc_start(1); } while (ICACHE_REQ_ACK [0][0]->read() == 0); ICACHE_REQ_VAL [0][0]->write(0); sc_start (9); TEST(ICACHE_RSP_VAL [0][0]->read(), 0); sc_start (1); TEST(ICACHE_RSP_VAL [0][0]->read(), 1); TEST(ICACHE_RSP_CONTEXT_ID [0][0] ->read(), 0); TEST(ICACHE_RSP_PACKET_ID [0][0] ->read(), 21); TEST(ICACHE_RSP_INSTRUCTION [0][0][0]->read(), 0xa0000000); TEST(ICACHE_RSP_ERROR [0][0] ->read(), ICACHE_ERROR_BUS_ERROR); sc_start (1); TEST(ICACHE_RSP_VAL [0][0]->read(), 0); ICACHE_RSP_ACK [0][0]->write(0); } //============================================================================== //===== [ TTY ]================================================================= //============================================================================== if (_TEST_TTY_) { cout << "Test : TTY" << endl; for (uint32_t i=0; inb_entity; i++) for (uint32_t j=0; jicache_dedicated_nb_port [i]; j++) { DCACHE_REQ_VAL [i][j]->write(1); DCACHE_REQ_CONTEXT_ID [i][j]->write(0); DCACHE_REQ_PACKET_ID [i][j]->write(0); DCACHE_REQ_ADDRESS [i][j]->write(tty_address[0]+(2<<2)); DCACHE_REQ_TYPE [i][j]->write(DCACHE_TYPE_STORE_32); DCACHE_REQ_WDATA [i][j]->write(0xdeadbeef); } sc_start(1); for (uint32_t i=0; inb_entity; i++) for (uint32_t j=0; jicache_dedicated_nb_port [i]; j++) DCACHE_REQ_VAL [i][j]->write(0); DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_STORE_8); DCACHE_REQ_ADDRESS [0][0]->write(tty_address[0]); char msg1 [] = "kane is back\n"; for (uint32_t i=0; iwrite(msg1[i]); sc_start(1); } while (not DCACHE_REQ_ACK [0][0]->read()); DCACHE_REQ_ADDRESS [0][0]->write(tty_address[0]+(2<<4)); char msg2 [] = "La Technologie au service de la paix\nEt au nom de kane !!!!!!!!!"; for (uint32_t i=0; iwrite(msg2[i]); sc_start(1); } while (not DCACHE_REQ_ACK [0][0]->read()); DCACHE_REQ_VAL [0][0]->write(0); cout << "Test : TTY - bus error" << endl; // 1) bad access : load DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_ADDRESS [0][0]->write(0xa0000000); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_LOAD_32); DCACHE_REQ_WDATA [0][0]->write(0xdeadbeef); DCACHE_RSP_ACK [0][0]->write(1); do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); sc_start (9); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 1); TEST(DCACHE_RSP_CONTEXT_ID [0][0]->read(), 0); TEST(DCACHE_RSP_PACKET_ID [0][0]->read(), 21); TEST(DCACHE_RSP_RDATA [0][0]->read(), 0xa0000000); TEST(DCACHE_RSP_ERROR [0][0]->read(), DCACHE_ERROR_BUS_ERROR); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); DCACHE_RSP_ACK [0][0]->write(0); // 2) bad register DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_ADDRESS [0][0]->write(0xa000000c); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_STORE_8); DCACHE_REQ_WDATA [0][0]->write(0xdeadbeef); DCACHE_RSP_ACK [0][0]->write(1); do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); sc_start (9); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 1); TEST(DCACHE_RSP_CONTEXT_ID [0][0]->read(), 0); TEST(DCACHE_RSP_PACKET_ID [0][0]->read(), 21); TEST(DCACHE_RSP_RDATA [0][0]->read(), 0xa000000c); TEST(DCACHE_RSP_ERROR [0][0]->read(), DCACHE_ERROR_BUS_ERROR); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); DCACHE_RSP_ACK [0][0]->write(0); // 3) bad tty number DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_ADDRESS [0][0]->write(0xa0000040); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_STORE_8); DCACHE_REQ_WDATA [0][0]->write(0xdeadbeef); DCACHE_RSP_ACK [0][0]->write(1); do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); sc_start (9); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 1); TEST(DCACHE_RSP_CONTEXT_ID [0][0]->read(), 0); TEST(DCACHE_RSP_PACKET_ID [0][0]->read(), 21); TEST(DCACHE_RSP_RDATA [0][0]->read(), 0xa0000040); TEST(DCACHE_RSP_ERROR [0][0]->read(), DCACHE_ERROR_BUS_ERROR); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); DCACHE_RSP_ACK [0][0]->write(0); } //============================================================================== //===== [ RAMLOCK ]============================================================= //============================================================================== if (_TEST_RAMLOCK_) { cout << "Test : RAMLOCK" << endl; // Test if lock : no DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_ADDRESS [0][0]->write(0xb0000003); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_LOAD_8); DCACHE_REQ_WDATA [0][0]->write(0xdeadbeef); DCACHE_RSP_ACK [0][0]->write(1); // Wait ack do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); sc_start (9); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 1); TEST(DCACHE_RSP_CONTEXT_ID [0][0]->read(), 0); TEST(DCACHE_RSP_PACKET_ID [0][0]->read(), 21); TEST(DCACHE_RSP_RDATA [0][0]->read(), 0x00000000); TEST(DCACHE_RSP_ERROR [0][0]->read(), DCACHE_ERROR_NONE); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); DCACHE_RSP_ACK [0][0]->write(0); // Test if lock : yes DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_ADDRESS [0][0]->write(0xb0000003); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_LOAD_8); DCACHE_REQ_WDATA [0][0]->write(0xdeadbeef); DCACHE_RSP_ACK [0][0]->write(1); // Wait ack do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); sc_start (9); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 1); TEST(DCACHE_RSP_CONTEXT_ID [0][0]->read(), 0); TEST(DCACHE_RSP_PACKET_ID [0][0]->read(), 21); TEST(DCACHE_RSP_RDATA [0][0]->read(), 0x00000001); TEST(DCACHE_RSP_ERROR [0][0]->read(), DCACHE_ERROR_NONE); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); DCACHE_RSP_ACK [0][0]->write(0); // Test if lock : no DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_ADDRESS [0][0]->write(0xb0000004); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_LOAD_8); DCACHE_REQ_WDATA [0][0]->write(0xdeadbeef); DCACHE_RSP_ACK [0][0]->write(1); // Wait ack do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); sc_start (9); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 1); TEST(DCACHE_RSP_CONTEXT_ID [0][0]->read(), 0); TEST(DCACHE_RSP_PACKET_ID [0][0]->read(), 21); TEST(DCACHE_RSP_RDATA [0][0]->read(), 0x00000000); TEST(DCACHE_RSP_ERROR [0][0]->read(), DCACHE_ERROR_NONE); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); DCACHE_RSP_ACK [0][0]->write(0); // Test if lock : yes DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_ADDRESS [0][0]->write(0xb0000004); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_LOAD_8); DCACHE_REQ_WDATA [0][0]->write(0xdeadbeef); DCACHE_RSP_ACK [0][0]->write(1); // Wait ack do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); sc_start (9); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 1); TEST(DCACHE_RSP_CONTEXT_ID [0][0]->read(), 0); TEST(DCACHE_RSP_PACKET_ID [0][0]->read(), 21); TEST(DCACHE_RSP_RDATA [0][0]->read(), 0x00000001); TEST(DCACHE_RSP_ERROR [0][0]->read(), DCACHE_ERROR_NONE); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); DCACHE_RSP_ACK [0][0]->write(0); DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_ADDRESS [0][0]->write(0xb0000003); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_STORE_8); DCACHE_REQ_WDATA [0][0]->write(0xdeadbeef); sc_start (1); // Test if lock : no DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_ADDRESS [0][0]->write(0xb0000003); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_LOAD_8); DCACHE_REQ_WDATA [0][0]->write(0xdeadbeef); DCACHE_RSP_ACK [0][0]->write(1); // Wait ack do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); sc_start (9); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 1); TEST(DCACHE_RSP_CONTEXT_ID [0][0]->read(), 0); TEST(DCACHE_RSP_PACKET_ID [0][0]->read(), 21); TEST(DCACHE_RSP_RDATA [0][0]->read(), 0x00000000); TEST(DCACHE_RSP_ERROR [0][0]->read(), DCACHE_ERROR_NONE); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); DCACHE_RSP_ACK [0][0]->write(0); // Test if lock : yes DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_ADDRESS [0][0]->write(0xb0000003); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_LOAD_8); DCACHE_REQ_WDATA [0][0]->write(0xdeadbeef); DCACHE_RSP_ACK [0][0]->write(1); // Wait ack do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); sc_start (9); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 1); TEST(DCACHE_RSP_CONTEXT_ID [0][0]->read(), 0); TEST(DCACHE_RSP_PACKET_ID [0][0]->read(), 21); TEST(DCACHE_RSP_RDATA [0][0]->read(), 0x00000001); TEST(DCACHE_RSP_ERROR [0][0]->read(), DCACHE_ERROR_NONE); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); DCACHE_RSP_ACK [0][0]->write(0); sc_start (5); // Bus Error // 1) size access // Test if lock : yes DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_ADDRESS [0][0]->write(0xb0000003); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_LOAD_16); DCACHE_REQ_WDATA [0][0]->write(0xdeadbeef); DCACHE_RSP_ACK [0][0]->write(1); // Wait ack do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); sc_start (9); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 1); TEST(DCACHE_RSP_CONTEXT_ID [0][0]->read(), 0); TEST(DCACHE_RSP_PACKET_ID [0][0]->read(), 21); TEST(DCACHE_RSP_RDATA [0][0]->read(), 0xb0000003); TEST(DCACHE_RSP_ERROR [0][0]->read(), DCACHE_ERROR_BUS_ERROR); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); DCACHE_RSP_ACK [0][0]->write(0); } //============================================================================== //===== [ MEMORY ]============================================================== //============================================================================== if (_TEST_DMEMORY_) { cout << "Test : MEMORY" << endl; DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_ADDRESS [0][0]->write(0x10000100); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_STORE_32); DCACHE_REQ_WDATA [0][0]->write(0xdeadbeef); DCACHE_RSP_ACK [0][0]->write(0); // Wait ack do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_ADDRESS [0][0]->write(0x10000100); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_LOAD_32); DCACHE_REQ_WDATA [0][0]->write(0x77777777); DCACHE_RSP_ACK [0][0]->write(1); // Wait ack do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); while (DCACHE_RSP_VAL [0][0]->read() == 0) sc_start (1); TEST(DCACHE_RSP_CONTEXT_ID [0][0]->read(), 0); TEST(DCACHE_RSP_PACKET_ID [0][0]->read(), 21); TEST(DCACHE_RSP_RDATA [0][0]->read(), 0xdeadbeef); TEST(DCACHE_RSP_ERROR [0][0]->read(), DCACHE_ERROR_NONE); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); DCACHE_RSP_ACK [0][0]->write(0); DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_ADDRESS [0][0]->write(0x10000100); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_LOAD_16); DCACHE_REQ_WDATA [0][0]->write(0x77777777); DCACHE_RSP_ACK [0][0]->write(1); // Wait ack do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); while (DCACHE_RSP_VAL [0][0]->read() == 0) sc_start (1); TEST(DCACHE_RSP_CONTEXT_ID [0][0]->read(), 0); TEST(DCACHE_RSP_PACKET_ID [0][0]->read(), 21); TEST(DCACHE_RSP_RDATA [0][0]->read(), 0xdeaddead); TEST(DCACHE_RSP_ERROR [0][0]->read(), DCACHE_ERROR_NONE); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); DCACHE_RSP_ACK [0][0]->write(0); DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_ADDRESS [0][0]->write(0x10000102); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_LOAD_16); DCACHE_REQ_WDATA [0][0]->write(0x77777777); DCACHE_RSP_ACK [0][0]->write(1); // Wait ack do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); while (DCACHE_RSP_VAL [0][0]->read() == 0) sc_start (1); TEST(DCACHE_RSP_CONTEXT_ID [0][0]->read(), 0); TEST(DCACHE_RSP_PACKET_ID [0][0]->read(), 21); TEST(DCACHE_RSP_RDATA [0][0]->read(), 0xbeefbeef); TEST(DCACHE_RSP_ERROR [0][0]->read(), DCACHE_ERROR_NONE); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); DCACHE_RSP_ACK [0][0]->write(0); } //============================================================================== //===== [ SIM2OS ]============================================================== //============================================================================== if (_TEST_SIM2OS_) { cout << "Test : SIM2OS" << endl; DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_ADDRESS [0][0]->write(0xc0000000); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_STORE_32); DCACHE_REQ_WDATA [0][0]->write(SERVICE_CLOCK); DCACHE_RSP_ACK [0][0]->write(0); // Wait ack do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); DCACHE_REQ_VAL [0][0]->write(1); DCACHE_REQ_CONTEXT_ID [0][0]->write(0); DCACHE_REQ_PACKET_ID [0][0]->write(21); DCACHE_REQ_ADDRESS [0][0]->write(0xc0000004); DCACHE_REQ_TYPE [0][0]->write(DCACHE_TYPE_LOAD_32); DCACHE_REQ_WDATA [0][0]->write(0x77777777); DCACHE_RSP_ACK [0][0]->write(1); // Wait ack do { sc_start(1); } while (DCACHE_REQ_ACK [0][0]->read() == 0); DCACHE_REQ_VAL [0][0]->write(0); while (DCACHE_RSP_VAL [0][0]->read() == 0) sc_start (1); TEST(DCACHE_RSP_CONTEXT_ID [0][0]->read(), 0); TEST(DCACHE_RSP_PACKET_ID [0][0]->read(), 21); TEST(DCACHE_RSP_RDATA [0][0]->read(), 354); // if all test is activate TEST(DCACHE_RSP_ERROR [0][0]->read(), DCACHE_ERROR_NONE); sc_start (1); TEST(DCACHE_RSP_VAL [0][0]->read(), 0); DCACHE_RSP_ACK [0][0]->write(0); } //============================================================================== //===== [ END TEST ]============================================================ //============================================================================== cout << "
Press to stop the test" << endl; getchar(); delete CLOCK ; delete NRESET; for (uint32_t i=0; i End" << endl; return EXIT_SUCCESS; }