X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=riscv%2Fsim.cc;h=66bebb3b8cbf7bffe61ddba9fd226cf63bd9a7bc;hb=784e9891af88db221b57bdffbea74d1c6bf99971;hp=6534900750547e16dc68f7caeca986cdf613b13a;hpb=a68c33c2a4c6278e7cce58f8a668cb24f636d024;p=riscv-isa-sim.git diff --git a/riscv/sim.cc b/riscv/sim.cc index 6534900..66bebb3 100644 --- a/riscv/sim.cc +++ b/riscv/sim.cc @@ -18,9 +18,10 @@ static void handle_signal(int sig) signal(sig, &handle_signal); } -sim_t::sim_t(size_t _nprocs, size_t mem_mb, const std::vector& args) - : htif(new htif_isasim_t(this, args)), - procs(_nprocs), current_step(0), current_proc(0), debug(false) +sim_t::sim_t(const char* isa, size_t nprocs, size_t mem_mb, + const std::vector& args) + : htif(new htif_isasim_t(this, args)), procs(std::max(nprocs, size_t(1))), + rtc(0), current_step(0), current_proc(0), debug(false) { signal(SIGINT, &handle_signal); // allocate target machine's memory, shrinking it as necessary @@ -34,27 +35,21 @@ sim_t::sim_t(size_t _nprocs, size_t mem_mb, const std::vector& args while ((mem = (char*)calloc(1, memsz)) == NULL) memsz = memsz*10/11/quantum*quantum; - if (memsz != memsz) + if (memsz != memsz0) fprintf(stderr, "warning: only got %lu bytes of target mem (wanted %lu)\n", (unsigned long)memsz, (unsigned long)memsz0); - mmu = new mmu_t(mem, memsz); + debug_mmu = new mmu_t(mem, memsz); - if (_nprocs == 0) - _nprocs = 1; - for (size_t i = 0; i < _nprocs; i++) - procs[i] = new processor_t(this, new mmu_t(mem, memsz), i); + for (size_t i = 0; i < procs.size(); i++) + procs[i] = new processor_t(isa, this, i); } sim_t::~sim_t() { for (size_t i = 0; i < procs.size(); i++) - { - mmu_t* pmmu = &procs[i]->mmu; delete procs[i]; - delete pmmu; - } - delete mmu; + delete debug_mmu; free(mem); } @@ -74,35 +69,38 @@ reg_t sim_t::get_scr(int which) } } -void sim_t::run() +int sim_t::run() { - while (!htif->done()) + if (!debug && log) + set_procs_debug(true); + while (htif->tick()) { if (debug || ctrlc_pressed) interactive(); else - step(INTERLEAVE, false); + step(INTERLEAVE); } + return htif->exit_code(); } -void sim_t::step(size_t n, bool noisy) +void sim_t::step(size_t n) { for (size_t i = 0, steps = 0; i < n; i += steps) { - htif->tick(); - if (!running()) - break; - steps = std::min(n - i, INTERLEAVE - current_step); - procs[current_proc]->step(steps, noisy); + procs[current_proc]->step(steps); current_step += steps; if (current_step == INTERLEAVE) { current_step = 0; - procs[current_proc]->mmu.yield_load_reservation(); - if (++current_proc == procs.size()) + procs[current_proc]->yield_load_reservation(); + if (++current_proc == procs.size()) { current_proc = 0; + rtc += INTERLEAVE / INSNS_PER_RTC_TICK; + } + + htif->tick(); } } } @@ -117,7 +115,32 @@ bool sim_t::running() void sim_t::stop() { - procs[0]->tohost = 1; - while (!htif->done()) - htif->tick(); + procs[0]->state.tohost = 1; + while (htif->tick()) + ; } + +void sim_t::set_debug(bool value) +{ + debug = value; +} + +void sim_t::set_log(bool value) +{ + log = value; +} + +void sim_t::set_histogram(bool value) +{ + histogram_enabled = value; + for (size_t i = 0; i < procs.size(); i++) { + procs[i]->set_histogram(histogram_enabled); + } +} + +void sim_t::set_procs_debug(bool value) +{ + for (size_t i=0; i< procs.size(); i++) + procs[i]->set_debug(value); +} +