From 48fe0c484d50073bd5d12bdb7fef5b7ea257e006 Mon Sep 17 00:00:00 2001 From: Chih-Min Chao Date: Thu, 6 Jun 2019 02:54:46 -0700 Subject: [PATCH] rvv: add varch option parser and initialize vector unit the default vector parameters are defined in configuration time but can be changed throught command-line option Signed-off-by: Dave Wen --- riscv/processor.cc | 71 +++++++++++++++++++++++++++++++++++++--- riscv/processor.h | 4 ++- riscv/sim.cc | 8 ++--- riscv/sim.h | 4 +-- spike_main/spike-dasm.cc | 2 +- spike_main/spike.cc | 2 +- 6 files changed, 78 insertions(+), 13 deletions(-) diff --git a/riscv/processor.cc b/riscv/processor.cc index 4118825e..5b8369d3 100644 --- a/riscv/processor.cc +++ b/riscv/processor.cc @@ -14,19 +14,21 @@ #include #include #include +#include #include #undef STATE #define STATE state -processor_t::processor_t(const char* isa, simif_t* sim, uint32_t id, - bool halt_on_reset) +processor_t::processor_t(const char* isa, const char* varch, simif_t* sim, + uint32_t id, bool halt_on_reset) : debug(false), halt_request(false), sim(sim), ext(NULL), id(id), halt_on_reset(halt_on_reset), last_pc(1), executions(1) { + VU.p = this; parse_isa_string(isa); + parse_varch_string(varch); register_base_instructions(); - mmu = new mmu_t(sim, this); disassembler = new disassembler_t(max_xlen); @@ -58,6 +60,66 @@ static void bad_isa_string(const char* isa) abort(); } +static void bad_varch_string(const char* varch) +{ + fprintf(stderr, "error: bad --varch option %s\n", varch); + abort(); +} + +static int parse_varch(std::string &str){ + int val; + if(!str.empty()){ + std::string sval = str.substr(1); + val = std::stoi(sval); + if ((val & (val - 1)) != 0) // val should be power of 2 + bad_varch_string(str.c_str()); + }else{ + bad_varch_string(str.c_str()); + } + return val; +} + +void processor_t::parse_varch_string(const char* s) +{ + std::string str, tmp; + for (const char *r = s; *r; r++) + str += std::tolower(*r); + + std::string delimiter = ":"; + + size_t pos = 0; + int vlen = 0; + int elen = 0; + int slen = 0; + std::string token; + while (!str.empty() && token != str) { + pos = str.find(delimiter); + if (pos == std::string::npos){ + token = str; + }else{ + token = str.substr(0, pos); + } + if (token[0] == 'v'){ + vlen = parse_varch(token); + }else if (token[0] == 'e'){ + elen = parse_varch(token); + }else if (token[0] == 's'){ + slen = parse_varch(token); + }else{ + bad_varch_string(str.c_str()); + } + str.erase(0, pos + delimiter.length()); + } + + if (!(vlen >= 32 || vlen <= 4096) && !(slen >= vlen || slen <= vlen) && !(elen >= slen || elen <= slen)){ + bad_varch_string(s); + } + + VU.VLEN = vlen; + VU.ELEN = elen; + VU.SLEN = slen; +} + void processor_t::parse_isa_string(const char* str) { std::string lowercase, tmp; @@ -65,7 +127,7 @@ void processor_t::parse_isa_string(const char* str) lowercase += std::tolower(*r); const char* p = lowercase.c_str(); - const char* all_subsets = "imafdqc"; + const char* all_subsets = "imafdqcv"; max_xlen = 64; state.misa = reg_t(2) << 62; @@ -180,6 +242,7 @@ void processor_t::reset() state.dcsr.halt = halt_on_reset; halt_on_reset = false; set_csr(CSR_MSTATUS, state.mstatus); + VU.reset(); if (ext) ext->reset(); // reset the extension diff --git a/riscv/processor.h b/riscv/processor.h index cd4355d9..8e68fb37 100644 --- a/riscv/processor.h +++ b/riscv/processor.h @@ -282,7 +282,8 @@ static int cto(reg_t val) class processor_t : public abstract_device_t { public: - processor_t(const char* isa, simif_t* sim, uint32_t id, bool halt_on_reset=false); + processor_t(const char* isa, const char* varch, simif_t* sim, uint32_t id, + bool halt_on_reset=false); ~processor_t(); void set_debug(bool value); @@ -446,6 +447,7 @@ private: friend class clint_t; friend class extension_t; + void parse_varch_string(const char* isa); void parse_isa_string(const char* isa); void build_opcode_map(); void register_base_instructions(); diff --git a/riscv/sim.cc b/riscv/sim.cc index 0bfdc8b3..2eb623aa 100644 --- a/riscv/sim.cc +++ b/riscv/sim.cc @@ -24,8 +24,8 @@ static void handle_signal(int sig) signal(sig, &handle_signal); } -sim_t::sim_t(const char* isa, size_t nprocs, bool halted, reg_t start_pc, - std::vector> mems, +sim_t::sim_t(const char* isa, const char* varch, size_t nprocs, bool halted, + reg_t start_pc, std::vector> mems, const std::vector& args, std::vector const hartids, const debug_module_config_t &dm_config) @@ -45,7 +45,7 @@ sim_t::sim_t(const char* isa, size_t nprocs, bool halted, reg_t start_pc, if (hartids.size() == 0) { for (size_t i = 0; i < procs.size(); i++) { - procs[i] = new processor_t(isa, this, i, halted); + procs[i] = new processor_t(isa, varch, this, i, halted); } } else { @@ -54,7 +54,7 @@ sim_t::sim_t(const char* isa, size_t nprocs, bool halted, reg_t start_pc, exit(1); } for (size_t i = 0; i < procs.size(); i++) { - procs[i] = new processor_t(isa, this, hartids[i], halted); + procs[i] = new processor_t(isa, varch, this, hartids[i], halted); } } diff --git a/riscv/sim.h b/riscv/sim.h index 6b9fad55..3345da29 100644 --- a/riscv/sim.h +++ b/riscv/sim.h @@ -21,8 +21,8 @@ class remote_bitbang_t; class sim_t : public htif_t, public simif_t { public: - sim_t(const char* isa, size_t _nprocs, bool halted, reg_t start_pc, - std::vector> mems, + sim_t(const char* isa, const char* varch, size_t _nprocs, bool halted, + reg_t start_pc, std::vector> mems, const std::vector& args, const std::vector hartids, const debug_module_config_t &dm_config); ~sim_t(); diff --git a/spike_main/spike-dasm.cc b/spike_main/spike-dasm.cc index 1161825c..044f220c 100644 --- a/spike_main/spike-dasm.cc +++ b/spike_main/spike-dasm.cc @@ -25,7 +25,7 @@ int main(int argc, char** argv) parser.option(0, "isa", 1, [&](const char* s){isa = s;}); parser.parse(argv); - processor_t p(isa, 0, 0); + processor_t p(isa, DEFAULT_VARCH, 0, 0); if (extension) p.register_extension(extension()); diff --git a/spike_main/spike.cc b/spike_main/spike.cc index 5da6210c..ef9a014a 100644 --- a/spike_main/spike.cc +++ b/spike_main/spike.cc @@ -191,7 +191,7 @@ int main(int argc, char** argv) if (!*argv1) help(); - sim_t s(isa, nprocs, halted, start_pc, mems, htif_args, std::move(hartids), + sim_t s(isa, varch, nprocs, halted, start_pc, mems, htif_args, std::move(hartids), dm_config); std::unique_ptr remote_bitbang((remote_bitbang_t *) NULL); std::unique_ptr jtag_dtm(