wrapper.cpp (2635B)
1 #include <VPerilus.h> 2 #include <VPerilus___024root.h> 3 #include <verilated.h> 4 #include <verilated_vcd_c.h> 5 6 static VerilatedContext* ctx = nullptr; 7 static VerilatedVcdC* vcd = nullptr; 8 static VPerilus* perilus = nullptr; 9 10 extern "C" { 11 void perilus_init() { 12 ctx = new VerilatedContext; 13 ctx->debug(0); 14 ctx->threads(1); 15 ctx->randReset(0); 16 ctx->randSeed(1); 17 ctx->traceEverOn(false); 18 perilus = new VPerilus(ctx); 19 } 20 void perilus_eval() { 21 perilus->eval(); 22 if (vcd != nullptr) { 23 vcd->dump(ctx->time()); 24 } 25 } 26 void perilus_drop() { 27 perilus->final(); 28 if (vcd != nullptr) { 29 vcd->close(); 30 } 31 delete perilus; 32 delete ctx; 33 delete vcd; 34 perilus = nullptr; 35 ctx = nullptr; 36 vcd = nullptr; 37 } 38 void perilus_increment_time() { 39 ctx->timeInc(1); 40 } 41 void start_vcd(const char* filename) { 42 Verilated::traceEverOn(true); 43 vcd = new VerilatedVcdC; 44 perilus->trace(vcd, 99); 45 vcd->open(filename); 46 } 47 void stop_vcd() { 48 if (vcd != nullptr) { 49 vcd->close(); 50 } 51 vcd = nullptr; 52 } 53 54 // clock 55 void perilus_set_clock(uint32_t new_clock) { 56 perilus->clock = new_clock; 57 } 58 59 // pc 60 uint32_t perilus_get_pc() { 61 return perilus->rootp->Perilus__DOT__pc; 62 } 63 void perilus_set_pc(uint32_t new_pc) { 64 perilus->rootp->Perilus__DOT__pc = new_pc; 65 } 66 67 // reset 68 void perilus_set_reset(uint32_t new_reset) { 69 perilus->reset = new_reset; 70 } 71 72 // control unit state 73 uint32_t perilus_get_control_unit_state() { 74 return perilus->rootp->Perilus__DOT__controlUnit__DOT__state; 75 } 76 void perilus_set_control_unit_state(uint32_t new_control_unit_state) { 77 perilus->rootp->Perilus__DOT__controlUnit__DOT__state = new_control_unit_state; 78 } 79 80 // register file 81 const uint32_t* perilus_get_register_file() { 82 return &perilus->rootp->Perilus__DOT__io_registerFile__DOT__registerFile_ext__DOT__Memory[0]; 83 } 84 void perilus_set_register(uint32_t reg, uint32_t value) { 85 perilus->rootp->Perilus__DOT__io_registerFile__DOT__registerFile_ext__DOT__Memory[reg] = value; 86 } 87 88 // memory 89 const uint32_t* perilus_get_memory() { 90 return &perilus->rootp->Perilus__DOT__io_memory__DOT__memory_ext__DOT__Memory[0]; 91 } 92 void perilus_set_memory(uint32_t address, uint32_t value) { 93 perilus->rootp->Perilus__DOT__io_memory__DOT__memory_ext__DOT__Memory[address] = value; 94 } 95 }