Browse Source

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 <dave.wen@sifive.com>
pull/303/head
Chih-Min Chao 7 years ago
parent
commit
48fe0c484d
  1. 71
      riscv/processor.cc
  2. 4
      riscv/processor.h
  3. 8
      riscv/sim.cc
  4. 4
      riscv/sim.h
  5. 2
      spike_main/spike-dasm.cc
  6. 2
      spike_main/spike.cc

71
riscv/processor.cc

@ -14,19 +14,21 @@
#include <assert.h>
#include <limits.h>
#include <stdexcept>
#include <string>
#include <algorithm>
#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

4
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();

8
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<std::pair<reg_t, mem_t*>> mems,
sim_t::sim_t(const char* isa, const char* varch, size_t nprocs, bool halted,
reg_t start_pc, std::vector<std::pair<reg_t, mem_t*>> mems,
const std::vector<std::string>& args,
std::vector<int> 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);
}
}

4
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<std::pair<reg_t, mem_t*>> mems,
sim_t(const char* isa, const char* varch, size_t _nprocs, bool halted,
reg_t start_pc, std::vector<std::pair<reg_t, mem_t*>> mems,
const std::vector<std::string>& args, const std::vector<int> hartids,
const debug_module_config_t &dm_config);
~sim_t();

2
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());

2
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_t> remote_bitbang((remote_bitbang_t *) NULL);
std::unique_ptr<jtag_dtm_t> jtag_dtm(

Loading…
Cancel
Save