perilus

RISC-V processor built with Chisel
git clone https://git.bradleygannon.com/perilus.git
Log | Files | Refs | Submodules | README

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 }