add support to RaiseExecption to all instructions

This commit is contained in:
mariusmonton 2018-11-24 23:46:47 +01:00
parent 4114f482d6
commit 0f291016c5
2 changed files with 295 additions and 153 deletions

View File

@ -42,99 +42,99 @@ public:
/* Quick & dirty way to publish a socket though modules */
tlm_utils::simple_initiator_socket<Execute> data_bus;
void LUI(Instruction &inst);
void AUIPC(Instruction &inst);
bool LUI(Instruction &inst);
bool AUIPC(Instruction &inst);
void JAL(Instruction &inst, bool c_extension = false, int m_rd = 1);
void JALR(Instruction &inst, bool c_extension = false);
bool JAL(Instruction &inst, bool c_extension = false, int m_rd = 1);
bool JALR(Instruction &inst, bool c_extension = false);
void BEQ(Instruction &inst);
void BNE(Instruction &inst);
void BLT(Instruction &inst);
void BGE(Instruction &inst);
void BLTU(Instruction &inst);
void BGEU(Instruction &inst);
bool BEQ(Instruction &inst);
bool BNE(Instruction &inst);
bool BLT(Instruction &inst);
bool BGE(Instruction &inst);
bool BLTU(Instruction &inst);
bool BGEU(Instruction &inst);
void LB(Instruction &inst);
void LH(Instruction &inst);
void LW(Instruction &inst, bool c_extension = false);
void LBU(Instruction &inst);
void LHU(Instruction &inst);
bool LB(Instruction &inst);
bool LH(Instruction &inst);
bool LW(Instruction &inst, bool c_extension = false);
bool LBU(Instruction &inst);
bool LHU(Instruction &inst);
void SB(Instruction &inst);
void SH(Instruction &inst);
void SW(Instruction &inst, bool c_extension = false);
void SBU(Instruction &inst);
void SHU(Instruction &inst);
bool SB(Instruction &inst);
bool SH(Instruction &inst);
bool SW(Instruction &inst, bool c_extension = false);
bool SBU(Instruction &inst);
bool SHU(Instruction &inst);
void ADDI(Instruction &inst, bool c_extension = false);
void SLTI(Instruction &inst);
void SLTIU(Instruction &inst);
void XORI(Instruction &inst);
void ORI(Instruction &inst);
void ANDI(Instruction &inst);
bool ADDI(Instruction &inst, bool c_extension = false);
bool SLTI(Instruction &inst);
bool SLTIU(Instruction &inst);
bool XORI(Instruction &inst);
bool ORI(Instruction &inst);
bool ANDI(Instruction &inst);
bool SLLI(Instruction &inst);
void SRLI(Instruction &inst);
void SRAI(Instruction &inst);
bool SRLI(Instruction &inst);
bool SRAI(Instruction &inst);
void ADD(Instruction &inst);
void SUB(Instruction &inst);
void SLL(Instruction &inst);
void SLT(Instruction &inst);
void SLTU(Instruction &inst);
bool ADD(Instruction &inst);
bool SUB(Instruction &inst);
bool SLL(Instruction &inst);
bool SLT(Instruction &inst);
bool SLTU(Instruction &inst);
void XOR(Instruction &inst);
void SRL(Instruction &inst);
void SRA(Instruction &inst);
void OR(Instruction &inst);
void AND(Instruction &inst);
bool XOR(Instruction &inst);
bool SRL(Instruction &inst);
bool SRA(Instruction &inst);
bool OR(Instruction &inst);
bool AND(Instruction &inst);
void FENCE(Instruction &inst);
void ECALL(Instruction &inst);
bool FENCE(Instruction &inst);
bool ECALL(Instruction &inst);
bool EBREAK(Instruction &inst);
void CSRRW(Instruction &inst);
void CSRRS(Instruction &inst);
void CSRRC(Instruction &inst);
void CSRRWI(Instruction &inst);
void CSRRSI(Instruction &inst);
void CSRRCI(Instruction &inst);
bool CSRRW(Instruction &inst);
bool CSRRS(Instruction &inst);
bool CSRRC(Instruction &inst);
bool CSRRWI(Instruction &inst);
bool CSRRSI(Instruction &inst);
bool CSRRCI(Instruction &inst);
/*********************** Privileged Instructions ******************************/
void MRET(Instruction &inst);
void WFI(Instruction &inst);
bool MRET(Instruction &inst);
bool WFI(Instruction &inst);
/* C Extensions */
void C_JR(Instruction &inst);
void C_MV(Instruction &inst);
void C_LWSP(Instruction &inst);
bool C_JR(Instruction &inst);
bool C_MV(Instruction &inst);
bool C_LWSP(Instruction &inst);
bool C_ADDI4SPN(Instruction &inst);
void C_SLLI(Instruction &inst);
void C_ADDI16SP(Instruction &inst);
void C_SWSP(Instruction &inst);
void C_BEQZ(Instruction &inst);
void C_BNEZ(Instruction &inst);
void C_LI(Instruction &inst);
void C_SRLI(Instruction &inst);
void C_SRAI(Instruction &inst);
void C_ANDI(Instruction &inst);
void C_ADD(Instruction &inst);
void C_SUB(Instruction &inst);
void C_XOR(Instruction &inst);
void C_OR(Instruction &inst);
void C_AND(Instruction &inst);
bool C_SLLI(Instruction &inst);
bool C_ADDI16SP(Instruction &inst);
bool C_SWSP(Instruction &inst);
bool C_BEQZ(Instruction &inst);
bool C_BNEZ(Instruction &inst);
bool C_LI(Instruction &inst);
bool C_SRLI(Instruction &inst);
bool C_SRAI(Instruction &inst);
bool C_ANDI(Instruction &inst);
bool C_ADD(Instruction &inst);
bool C_SUB(Instruction &inst);
bool C_XOR(Instruction &inst);
bool C_OR(Instruction &inst);
bool C_AND(Instruction &inst);
/* M Extensinos */
void M_MUL(Instruction &inst);
void M_MULH(Instruction &inst);
void M_MULHSU(Instruction &inst);
void M_MULHU(Instruction &inst);
void M_DIV(Instruction &inst);
void M_DIVU(Instruction &inst);
void M_REM(Instruction &inst);
void M_REMU(Instruction &inst);
bool M_MUL(Instruction &inst);
bool M_MULH(Instruction &inst);
bool M_MULHSU(Instruction &inst);
bool M_MULHU(Instruction &inst);
bool M_DIV(Instruction &inst);
bool M_DIVU(Instruction &inst);
bool M_REM(Instruction &inst);
bool M_REMU(Instruction &inst);
void NOP(Instruction &inst);
bool NOP(Instruction &inst);
private:
uint32_t readDataMem(uint32_t addr, int size);

View File

@ -10,7 +10,7 @@ Execute::Execute(sc_module_name name
log = Log::getInstance();
}
void Execute::LUI(Instruction &inst) {
bool Execute::LUI(Instruction &inst) {
int rd;
uint32_t imm = 0;
@ -20,9 +20,10 @@ void Execute::LUI(Instruction &inst) {
log->SC_log(Log::INFO) << "LUI x" << dec
<< rd << " <- 0x" << hex << imm << endl;
return true;
}
void Execute::AUIPC(Instruction &inst) {
bool Execute::AUIPC(Instruction &inst) {
int rd;
uint32_t imm = 0;
int new_pc;
@ -36,9 +37,11 @@ void Execute::AUIPC(Instruction &inst) {
log->SC_log(Log::INFO) << "AUIPC x" << dec
<< rd << " <- 0x" << hex << imm << " + PC (0x"
<< new_pc << ")" << endl;
return true;
}
void Execute::JAL(Instruction &inst, bool c_extension, int m_rd) {
bool Execute::JAL(Instruction &inst, bool c_extension, int m_rd) {
int32_t mem_addr = 0;
int rd;
int new_pc, old_pc;
@ -71,9 +74,11 @@ void Execute::JAL(Instruction &inst, bool c_extension, int m_rd) {
<< rd << " <- 0x" << hex << old_pc << dec
<< ". PC + 0x" << hex << mem_addr << " -> PC (0x"
<< new_pc << ")" << endl;
return true;
}
void Execute::JALR(Instruction &inst, bool c_extension) {
bool Execute::JALR(Instruction &inst, bool c_extension) {
uint32_t mem_addr = 0;
int rd, rs1;
int new_pc, old_pc;
@ -109,9 +114,11 @@ void Execute::JALR(Instruction &inst, bool c_extension) {
<< rd << " <- 0x" << hex << old_pc + 4
<< " PC <- 0x" << hex << new_pc << endl;
}
return true;
}
void Execute::BEQ(Instruction &inst) {
bool Execute::BEQ(Instruction &inst) {
int rs1, rs2;
int new_pc = 0;
@ -130,9 +137,11 @@ void Execute::BEQ(Instruction &inst) {
<< rs1 << "(0x" << hex << regs->getValue(rs1) << ") == x" << dec
<< rs2 << "(0x" << hex << regs->getValue(rs2) << ")? -> PC (0x"
<< hex << new_pc << ")" << dec << endl;
return true;
}
void Execute::BNE(Instruction &inst) {
bool Execute::BNE(Instruction &inst) {
int rs1, rs2;
int new_pc = 0;
uint32_t val1, val2;
@ -155,9 +164,11 @@ void Execute::BNE(Instruction &inst) {
<< rs1 << "(0x" << hex << val1 << ") == x" << dec
<< rs2 << "(0x" << hex << val2 << ")? -> PC (0x"
<< hex << new_pc << ")" << dec << endl;
return true;
}
void Execute::BLT(Instruction &inst) {
bool Execute::BLT(Instruction &inst) {
int rs1, rs2;
int new_pc = 0;
@ -175,9 +186,11 @@ void Execute::BLT(Instruction &inst) {
<< rs1 << "(0x" << hex << (int32_t)regs->getValue(rs1) << ") < x" << dec
<< rs2 << "(0x" << hex << (int32_t)regs->getValue(rs2) << ")? -> PC (0x"
<< hex << new_pc << ")" << dec << endl;
return true;
}
void Execute::BGE(Instruction &inst) {
bool Execute::BGE(Instruction &inst) {
int rs1, rs2;
int new_pc = 0;
@ -195,9 +208,11 @@ void Execute::BGE(Instruction &inst) {
<< rs1 << "(0x" << hex << (int32_t)regs->getValue(rs1) << ") > x" << dec
<< rs2 << "(0x" << hex << (int32_t)regs->getValue(rs2) << ")? -> PC (0x"
<< hex << new_pc << ")" << dec << endl;
return true;
}
void Execute::BLTU(Instruction &inst) {
bool Execute::BLTU(Instruction &inst) {
int rs1, rs2;
int new_pc = 0;
@ -216,9 +231,11 @@ void Execute::BLTU(Instruction &inst) {
<< rs1 << "(0x" << hex << regs->getValue(rs1) << ") < x" << dec
<< rs2 << "(0x" << hex << regs->getValue(rs2) << ")? -> PC (0x"
<< hex << new_pc << ")" << dec << endl;
return true;
}
void Execute::BGEU(Instruction &inst) {
bool Execute::BGEU(Instruction &inst) {
int rs1, rs2;
int new_pc = 0;
@ -236,9 +253,11 @@ void Execute::BGEU(Instruction &inst) {
<< rs1 << "(0x" << hex << regs->getValue(rs1) << ") > x" << dec
<< rs2 << "(0x" << hex << regs->getValue(rs2) << ")? -> PC (0x"
<< hex << new_pc << ")" << dec << endl;
return true;
}
void Execute::LB(Instruction &inst) {
bool Execute::LB(Instruction &inst) {
uint32_t mem_addr = 0;
int rd, rs1;
int32_t imm = 0;
@ -255,9 +274,11 @@ void Execute::LB(Instruction &inst) {
log->SC_log(Log::INFO) << "LB: x"
<< rs1 << " + " << imm << " (@0x"
<< hex << mem_addr << dec << ") -> x" << rd << endl;
return true;
}
void Execute::LH(Instruction &inst) {
bool Execute::LH(Instruction &inst) {
uint32_t mem_addr = 0;
int rd, rs1;
int32_t imm = 0;
@ -274,9 +295,11 @@ void Execute::LH(Instruction &inst) {
log->SC_log(Log::INFO) << "LH: x"
<< rs1 << " + " << imm << " (@0x"
<< hex << mem_addr << dec << ") -> x" << rd << endl;
return true;
}
void Execute::LW(Instruction &inst, bool c_extension) {
bool Execute::LW(Instruction &inst, bool c_extension) {
uint32_t mem_addr = 0;
int rd, rs1;
int32_t imm = 0;
@ -301,9 +324,11 @@ void Execute::LW(Instruction &inst, bool c_extension) {
log->SC_log(Log::INFO) << dec << "C.LW: x"
<< rs1 << " + " << imm << " (@0x" << hex
<< mem_addr << dec << ") -> x" << rd << endl;
return true;
}
void Execute::LBU(Instruction &inst) {
bool Execute::LBU(Instruction &inst) {
uint32_t mem_addr = 0;
int rd, rs1;
int32_t imm = 0;
@ -320,9 +345,11 @@ void Execute::LBU(Instruction &inst) {
log->SC_log(Log::INFO) << "LBU: x"
<< rs1 << " + " << imm << " (@0x"
<< hex << mem_addr << dec << ") -> x" << rd << endl;
return true;
}
void Execute::LHU(Instruction &inst) {
bool Execute::LHU(Instruction &inst) {
uint32_t mem_addr = 0;
int rd, rs1;
int32_t imm = 0;
@ -340,9 +367,11 @@ void Execute::LHU(Instruction &inst) {
<< rs1 << " + " << imm << " (@0x"
<< hex << mem_addr << dec << ") -> x"
<< rd << "(0x" << hex << data << ")"<< endl;
return true;
}
void Execute::SB(Instruction &inst) {
bool Execute::SB(Instruction &inst) {
uint32_t mem_addr = 0;
int rs1, rs2;
int32_t imm = 0;
@ -360,9 +389,11 @@ void Execute::SB(Instruction &inst) {
log->SC_log(Log::INFO) << "SB: x" << dec
<< rs2 << " -> x" << rs1 << " + 0x" << hex << imm
<< " (@0x" << hex << mem_addr << dec << ")" << endl;
return true;
}
void Execute::SH(Instruction &inst) {
bool Execute::SH(Instruction &inst) {
uint32_t mem_addr = 0;
int rs1, rs2;
int32_t imm = 0;
@ -381,9 +412,11 @@ void Execute::SH(Instruction &inst) {
<< rs2 << " -> x"
<< rs1 << " + 0x" << hex << imm << " (@0x" << hex
<< mem_addr << dec << ")" << endl;
return true;
}
void Execute::SW(Instruction &inst, bool c_extension) {
bool Execute::SW(Instruction &inst, bool c_extension) {
uint32_t mem_addr = 0;
int rs1, rs2;
int32_t imm = 0;
@ -409,9 +442,11 @@ void Execute::SW(Instruction &inst, bool c_extension) {
<< rs2 << "(0x" << hex << data << ") -> x" << dec
<< rs1 << " + 0x" << hex << imm << " (@0x" << hex
<< mem_addr << dec << ")" << endl;
return true;
}
void Execute::ADDI(Instruction &inst, bool c_extension) {
bool Execute::ADDI(Instruction &inst, bool c_extension) {
int rd, rs1;
int32_t imm = 0;
int32_t calc;
@ -432,11 +467,13 @@ void Execute::ADDI(Instruction &inst, bool c_extension) {
regs->setValue(rd, calc);
log->SC_log(Log::INFO) << "ADDI: x" << dec
<< rs1 << " + 0x" << hex << imm << " -> x" << dec
<< rs1 << " + " << imm << " -> x" << dec
<< rd << "(0x" << hex << calc << ")"<< endl;
return true;
}
void Execute::SLTI(Instruction &inst) {
bool Execute::SLTI(Instruction &inst) {
int rd, rs1;
int32_t imm;
@ -457,9 +494,11 @@ void Execute::SLTI(Instruction &inst) {
<< imm << " => " << "0 -> x"
<< rd << endl;
}
return true;
}
void Execute::SLTIU(Instruction &inst) {
bool Execute::SLTIU(Instruction &inst) {
int rd, rs1;
int32_t imm;
@ -480,9 +519,11 @@ void Execute::SLTIU(Instruction &inst) {
<< imm << " => " << "0 -> x"
<< rd << endl;
}
return true;
}
void Execute::XORI(Instruction &inst) {
bool Execute::XORI(Instruction &inst) {
int rd, rs1;
int32_t imm;
uint32_t calc;
@ -498,9 +539,11 @@ void Execute::XORI(Instruction &inst) {
<< rs1 << " XOR "
<< imm << "-> x"
<< rd << endl;
return true;
}
void Execute::ORI(Instruction &inst) {
bool Execute::ORI(Instruction &inst) {
int rd, rs1;
int32_t imm;
uint32_t calc;
@ -516,9 +559,11 @@ void Execute::ORI(Instruction &inst) {
<< rs1 << " OR "
<< imm << "-> x"
<< rd << endl;
return true;
}
void Execute::ANDI(Instruction &inst) {
bool Execute::ANDI(Instruction &inst) {
int rd, rs1;
int32_t imm;
uint32_t calc;
@ -534,6 +579,8 @@ void Execute::ANDI(Instruction &inst) {
<< rs1 << " AND "
<< imm << " -> x"
<< rd << endl;
return true;
}
bool Execute::SLLI(Instruction &inst) {
@ -565,7 +612,7 @@ bool Execute::SLLI(Instruction &inst) {
return true;
}
void Execute::SRLI(Instruction &inst) {
bool Execute::SRLI(Instruction &inst) {
int rd, rs1, rs2;
uint32_t shift;
uint32_t calc;
@ -582,9 +629,11 @@ void Execute::SRLI(Instruction &inst) {
log->SC_log(Log::INFO) << "SRLI: x" << dec
<< rs1 << " >> " << shift << " -> x"
<< rd << endl;
return true;
}
void Execute::SRAI(Instruction &inst) {
bool Execute::SRAI(Instruction &inst) {
int rd, rs1, rs2;
uint32_t shift;
int32_t calc;
@ -601,9 +650,11 @@ void Execute::SRAI(Instruction &inst) {
log->SC_log(Log::INFO) << "SRAI: x" << dec
<< rs1 << " >> " << shift << " -> x"
<< rd << endl;
return true;
}
void Execute::ADD(Instruction &inst) {
bool Execute::ADD(Instruction &inst) {
int rd, rs1, rs2;
uint32_t calc;
rd = inst.get_rd();
@ -617,9 +668,11 @@ void Execute::ADD(Instruction &inst) {
<< rs1 << " + x"
<< rs2 << " -> x"
<< rd << endl;
return true;
}
void Execute::SUB(Instruction &inst) {
bool Execute::SUB(Instruction &inst) {
int rd, rs1, rs2;
uint32_t calc;
rd = inst.get_rd();
@ -636,9 +689,11 @@ void Execute::SUB(Instruction &inst) {
<< rs1 << " - x"
<< rs2 << " -> x"
<< rd << "("<< calc << ")" << endl;
return true;
}
void Execute::SLL(Instruction &inst) {
bool Execute::SLL(Instruction &inst) {
int rd, rs1, rs2;
uint32_t shift;
uint32_t calc;
@ -655,9 +710,11 @@ void Execute::SLL(Instruction &inst) {
log->SC_log(Log::INFO) << "SLL: x"
<< rs1 << " << " << shift << " -> x"
<< rd << endl;
return true;
}
void Execute::SLT(Instruction &inst) {
bool Execute::SLT(Instruction &inst) {
int rd, rs1, rs2;
rd = inst.get_rd();
@ -677,9 +734,11 @@ void Execute::SLT(Instruction &inst) {
<< rs2 << " => " << "0 -> x"
<< rd << endl;
}
return true;
}
void Execute::SLTU(Instruction &inst) {
bool Execute::SLTU(Instruction &inst) {
int rd, rs1, rs2;
rd = inst.get_rd();
@ -699,9 +758,11 @@ void Execute::SLTU(Instruction &inst) {
<< rs2 << " => " << "0 -> x"
<< rd << endl;
}
return true;
}
void Execute::XOR(Instruction &inst) {
bool Execute::XOR(Instruction &inst) {
int rd, rs1, rs2;
uint32_t calc;
@ -716,9 +777,11 @@ void Execute::XOR(Instruction &inst) {
<< rs1 << " XOR x"
<< rs2 << "-> x"
<< rd << endl;
return true;
}
void Execute::SRL(Instruction &inst) {
bool Execute::SRL(Instruction &inst) {
int rd, rs1, rs2;
uint32_t shift;
uint32_t calc;
@ -734,9 +797,11 @@ void Execute::SRL(Instruction &inst) {
log->SC_log(Log::INFO) << "SRL: x"
<< rs1 << " >> " << shift << " -> x" << rd << endl;
return true;
}
void Execute::SRA(Instruction &inst) {
bool Execute::SRA(Instruction &inst) {
int rd, rs1, rs2;
uint32_t shift;
int32_t calc;
@ -752,9 +817,11 @@ void Execute::SRA(Instruction &inst) {
log->SC_log(Log::INFO) << "SRA: x"
<< rs1 << " >> " << shift << " -> x" << rd << endl;
return true;
}
void Execute::OR(Instruction &inst) {
bool Execute::OR(Instruction &inst) {
int rd, rs1, rs2;
uint32_t calc;
@ -767,9 +834,11 @@ void Execute::OR(Instruction &inst) {
log->SC_log(Log::INFO) << "OR: x" << rs1 << " OR x" << rs2
<< "-> x" << rd << endl;
return true;
}
void Execute::AND(Instruction &inst) {
bool Execute::AND(Instruction &inst) {
int rd, rs1, rs2;
uint32_t calc;
@ -782,13 +851,17 @@ void Execute::AND(Instruction &inst) {
log->SC_log(Log::INFO) << "AND: x" << rs1 << " AND x" << rs2
<< "-> x" << rd << endl;
return true;
}
void Execute::FENCE(Instruction &inst) {
bool Execute::FENCE(Instruction &inst) {
log->SC_log(Log::INFO) << "FENCE" << endl;
return true;
}
void Execute::ECALL(Instruction &inst) {
bool Execute::ECALL(Instruction &inst) {
log->SC_log(Log::INFO) << "ECALL" << endl;
std::cout << endl << "ECALL Instruction called, stopping simulation" << endl;
@ -797,6 +870,8 @@ void Execute::ECALL(Instruction &inst) {
perf->dump();
SC_REPORT_ERROR("Execute", "ECALL");
return true;
}
bool Execute::EBREAK(Instruction &inst) {
@ -812,7 +887,7 @@ bool Execute::EBREAK(Instruction &inst) {
return true;
}
void Execute::CSRRW(Instruction &inst) {
bool Execute::CSRRW(Instruction &inst) {
int rd, rs1;
int csr;
uint32_t aux;
@ -826,15 +901,18 @@ void Execute::CSRRW(Instruction &inst) {
aux = regs->getCSR(csr);
regs->setValue(rd, aux);
}
aux = regs->getValue(rs1);
regs->setCSR(csr, aux);
log->SC_log(Log::INFO) << "CSRRW: CSR #"
<< csr << " -> x" << rd
<< ". x" << rs1 << "-> CSR #" << csr << endl;
return true;
}
void Execute::CSRRS(Instruction &inst) {
bool Execute::CSRRS(Instruction &inst) {
int rd, rs1;
int csr;
uint32_t bitmask, aux, aux2;
@ -844,7 +922,7 @@ void Execute::CSRRS(Instruction &inst) {
csr = inst.get_csr();
if (rd == 0) {
return;
return false;
}
/* These operations must be atomical */
@ -860,9 +938,11 @@ void Execute::CSRRS(Instruction &inst) {
<< csr << "(0x" << hex << aux << ") -> x" << dec << rd
<< ". x" << rs1 << " & CSR #" << csr
<< " <- 0x" << hex << aux2 << endl;
return true;
}
void Execute::CSRRC(Instruction &inst) {
bool Execute::CSRRC(Instruction &inst) {
int rd, rs1;
int csr;
uint32_t bitmask, aux, aux2;
@ -872,7 +952,7 @@ void Execute::CSRRC(Instruction &inst) {
csr = inst.get_csr();
if (rd == 0) {
return;
return true;
}
/* These operations must be atomical */
@ -888,9 +968,11 @@ void Execute::CSRRC(Instruction &inst) {
<< csr << "(0x" << hex << aux << ") -> x" << dec << rd
<< ". x" << rs1 << " & CSR #" << csr
<< " <- 0x" << hex << aux2 << endl;
return true;
}
void Execute::CSRRWI(Instruction &inst) {
bool Execute::CSRRWI(Instruction &inst) {
int rd, rs1;
int csr;
uint32_t aux;
@ -911,9 +993,11 @@ void Execute::CSRRWI(Instruction &inst) {
log->SC_log(Log::INFO) << "CSRRWI: CSR #"
<< csr << " -> x" << rd
<< ". x" << rs1 << "-> CSR #" << csr << endl;
return true;
}
void Execute::CSRRSI(Instruction &inst) {
bool Execute::CSRRSI(Instruction &inst) {
int rd, rs1;
int csr;
uint32_t bitmask, aux;
@ -923,7 +1007,7 @@ void Execute::CSRRSI(Instruction &inst) {
csr = inst.get_csr();
if (rs1 == 0) {
return;
return true;
}
/* These operations must be atomical */
@ -937,9 +1021,11 @@ void Execute::CSRRSI(Instruction &inst) {
log->SC_log(Log::INFO) << "CSRRSI: CSR #"
<< csr << " -> x" << rd
<< ". x" << rs1 << " & CSR #" << csr << endl;
return true;
}
void Execute::CSRRCI(Instruction &inst) {
bool Execute::CSRRCI(Instruction &inst) {
int rd, rs1;
int csr;
uint32_t bitmask, aux;
@ -949,7 +1035,7 @@ void Execute::CSRRCI(Instruction &inst) {
csr = inst.get_csr();
if (rs1 == 0) {
return;
return true;
}
/* These operations must be atomical */
@ -963,27 +1049,33 @@ void Execute::CSRRCI(Instruction &inst) {
log->SC_log(Log::INFO) << "CSRRCI: CSR #"
<< csr << " -> x" << rd
<< ". x" << rs1 << " & CSR #" << csr << endl;
return true;
}
/*********************** Privileged Instructions ******************************/
void Execute::MRET(Instruction &inst) {
bool Execute::MRET(Instruction &inst) {
uint32_t new_pc = 0;
new_pc = regs->getCSR(CSR_MEPC);
regs->setPC(new_pc);
log->SC_log(Log::INFO) << "MRET: PC <- 0x" << hex << new_pc << endl;
return true;
}
void Execute::WFI(Instruction &inst) {
bool Execute::WFI(Instruction &inst) {
log->SC_log(Log::INFO) << "WFI" << endl;
return true;
}
/**************************** C Instructions **********************************/
void Execute::C_JR(Instruction &inst) {
bool Execute::C_JR(Instruction &inst) {
uint32_t mem_addr = 0;
int rs1;
int new_pc;
@ -999,9 +1091,11 @@ void Execute::C_JR(Instruction &inst) {
regs->setPC(new_pc);
log->SC_log(Log::INFO) << "JR: PC <- 0x" << hex << new_pc << endl;
return true;
}
void Execute::C_MV(Instruction &inst) {
bool Execute::C_MV(Instruction &inst) {
int rd, rs1, rs2;
uint32_t calc;
@ -1018,9 +1112,11 @@ void Execute::C_MV(Instruction &inst) {
<< rs1 << "(0x" << hex << regs->getValue(rs1) << ") + x" << dec
<< rs2 << "(0x" << hex << regs->getValue(rs2) << ") -> x" << dec
<< rd << "(0x" << hex << calc << ")" << endl;
return true;
}
void Execute::C_ADD(Instruction &inst) {
bool Execute::C_ADD(Instruction &inst) {
int rd, rs1, rs2;
uint32_t calc;
@ -1037,9 +1133,11 @@ void Execute::C_ADD(Instruction &inst) {
<< dec << rs1 << " + x"
<< rs2 << " -> x"
<< rd << endl;
return true;
}
void Execute::C_LWSP(Instruction &inst) {
bool Execute::C_LWSP(Instruction &inst) {
uint32_t mem_addr = 0;
int rd, rs1;
int32_t imm = 0;
@ -1061,6 +1159,8 @@ void Execute::C_LWSP(Instruction &inst) {
<< rs1 << "(0x" << hex << regs->getValue(rs1) << ") + "
<< dec << imm << " (@0x" << hex << mem_addr << dec << ") -> x"
<< rd << "(" << hex << data << ")"<< dec << endl;
return true;
}
bool Execute::C_ADDI4SPN(Instruction &inst) {
@ -1090,7 +1190,7 @@ bool Execute::C_ADDI4SPN(Instruction &inst) {
return true;
}
void Execute::C_ADDI16SP(Instruction &inst) {
bool Execute::C_ADDI16SP(Instruction &inst) {
// addi x2, x2, nzimm[9:4]
int rd, rs1;
int32_t imm = 0;
@ -1117,11 +1217,12 @@ void Execute::C_ADDI16SP(Instruction &inst) {
regs->setValue(rd, imm);
log->SC_log(Log::INFO) << dec << "C.LUI x"
<< rd << " <- 0x" << hex << imm << endl;
}
return true;
}
void Execute::C_SWSP(Instruction &inst) {
bool Execute::C_SWSP(Instruction &inst) {
// sw rs2, offset(x2)
uint32_t mem_addr = 0;
int rs1, rs2;
@ -1143,9 +1244,11 @@ void Execute::C_SWSP(Instruction &inst) {
<< rs2 << "(0x" << hex << data << ") -> x" << dec
<< rs1 << " + " << imm << " (@0x" << hex
<< mem_addr << dec << ")" << endl;
return true;
}
void Execute::C_BEQZ(Instruction &inst) {
bool Execute::C_BEQZ(Instruction &inst) {
int rs1;
int new_pc = 0;
uint32_t val1;
@ -1165,9 +1268,11 @@ void Execute::C_BEQZ(Instruction &inst) {
log->SC_log(Log::INFO) << "C.BEQZ: x" << dec
<< rs1 << "(" << val1 << ") == 0? -> PC (0x"
<< hex << new_pc << ")" << dec << endl;
return true;
}
void Execute::C_BNEZ(Instruction &inst) {
bool Execute::C_BNEZ(Instruction &inst) {
int rs1;
int new_pc = 0;
uint32_t val1;
@ -1187,9 +1292,11 @@ void Execute::C_BNEZ(Instruction &inst) {
log->SC_log(Log::INFO) << "C.BNEZ: x" << dec
<< rs1 << "(0x" << hex << val1 << ") != 0? -> PC (0x"
<< hex << new_pc << ")" << dec << endl;
return true;
}
void Execute::C_LI(Instruction &inst) {
bool Execute::C_LI(Instruction &inst) {
int rd, rs1;
int32_t imm = 0;
int32_t calc;
@ -1206,9 +1313,11 @@ void Execute::C_LI(Instruction &inst) {
log->SC_log(Log::INFO) << dec << "LI: x"
<< rs1 << "(" << regs->getValue(rs1) << ") + "
<< imm << " -> x" << rd << "(" << calc << ")" << endl;
return true;
}
void Execute::C_SRLI(Instruction &inst) {
bool Execute::C_SRLI(Instruction &inst) {
int rd, rs1, rs2;
uint32_t shift;
uint32_t calc;
@ -1227,9 +1336,11 @@ void Execute::C_SRLI(Instruction &inst) {
log->SC_log(Log::INFO) << "C.SRLI: x"
<< rs1 << " >> " << shift << " -> x"
<< rd << endl;
return true;
}
void Execute::C_SRAI(Instruction &inst) {
bool Execute::C_SRAI(Instruction &inst) {
int rd, rs1, rs2;
uint32_t shift;
int32_t calc;
@ -1248,9 +1359,11 @@ void Execute::C_SRAI(Instruction &inst) {
log->SC_log(Log::INFO) << "C.SRAI: x"
<< rs1 << " >> " << dec << shift << " -> x"
<< rd << "("<< calc << ")" << endl;
return true;
}
void Execute::C_SLLI(Instruction &inst) {
bool Execute::C_SLLI(Instruction &inst) {
int rd, rs1, rs2;
uint32_t shift;
uint32_t calc;
@ -1270,10 +1383,12 @@ void Execute::C_SLLI(Instruction &inst) {
<< dec << rs1 << " << "
<< shift << " -> x"
<< rd << endl;
return true;
}
void Execute::C_ANDI(Instruction &inst) {
bool Execute::C_ANDI(Instruction &inst) {
int rd, rs1;
int32_t imm;
uint32_t calc;
@ -1291,9 +1406,11 @@ void Execute::C_ANDI(Instruction &inst) {
<< rs1 << " AND "
<< imm << " -> x"
<< rd << endl;
return true;
}
void Execute::C_SUB(Instruction &inst) {
bool Execute::C_SUB(Instruction &inst) {
int rd, rs1, rs2;
uint32_t calc;
@ -1313,10 +1430,12 @@ void Execute::C_SUB(Instruction &inst) {
<< dec << rs1 << " - x"
<< rs2 << " -> x"
<< rd << endl;
return true;
}
void Execute::C_XOR(Instruction &inst) {
bool Execute::C_XOR(Instruction &inst) {
int rd, rs1, rs2;
uint32_t calc;
@ -1333,9 +1452,11 @@ void Execute::C_XOR(Instruction &inst) {
<< dec << rs1 << " XOR x"
<< rs2 << "-> x"
<< rd << endl;
return true;
}
void Execute::C_OR(Instruction &inst) {
bool Execute::C_OR(Instruction &inst) {
int rd, rs1, rs2;
uint32_t calc;
@ -1352,9 +1473,11 @@ void Execute::C_OR(Instruction &inst) {
<< dec << rs1 << " OR x"
<< rs2 << "-> x"
<< rd << endl;
return true;
}
void Execute::C_AND(Instruction &inst) {
bool Execute::C_AND(Instruction &inst) {
int rd, rs1, rs2;
uint32_t calc;
@ -1371,12 +1494,14 @@ void Execute::C_AND(Instruction &inst) {
<< dec << rs1 << " AND x"
<< rs2 << "-> x"
<< rd << endl;
return true;
}
/******************************************************************************/
/* M Extensions */
/******************************************************************************/
void Execute::M_MUL(Instruction &inst) {
bool Execute::M_MUL(Instruction &inst) {
int rd, rs1, rs2;
int32_t multiplier, multiplicand;
int64_t result;
@ -1396,9 +1521,11 @@ void Execute::M_MUL(Instruction &inst) {
log->SC_log(Log::INFO) << dec << "MUL: x" << rs1 << " * x" << rs2
<< " -> x" << rd << "(" << result << ")" << endl;
return true;
}
void Execute::M_MULH(Instruction &inst) {
bool Execute::M_MULH(Instruction &inst) {
int rd, rs1, rs2;
int32_t multiplier, multiplicand;
int64_t result;
@ -1420,9 +1547,11 @@ void Execute::M_MULH(Instruction &inst) {
log->SC_log(Log::INFO) << dec << "MULH: x" << rs1 << " * x" << rs2
<< " -> x" << rd << "(" << result << ")" << endl;
return true;
}
void Execute::M_MULHSU(Instruction &inst) {
bool Execute::M_MULHSU(Instruction &inst) {
int rd, rs1, rs2;
int32_t multiplier;
uint32_t multiplicand;
@ -1443,9 +1572,11 @@ void Execute::M_MULHSU(Instruction &inst) {
log->SC_log(Log::INFO) << dec << "MULHSU: x" << rs1 << " * x" << rs2
<< " -> x" << rd << "(" << result << ")" << endl;
return true;
}
void Execute::M_MULHU(Instruction &inst) {
bool Execute::M_MULHU(Instruction &inst) {
int rd, rs1, rs2;
uint32_t multiplier, multiplicand;
uint64_t result;
@ -1466,9 +1597,11 @@ void Execute::M_MULHU(Instruction &inst) {
log->SC_log(Log::INFO) << dec << "MULHU: x" << rs1 << " * x" << rs2
<< " -> x" << rd << "(" << ret_value << ")" << endl;
return true;
}
void Execute::M_DIV(Instruction &inst) {
bool Execute::M_DIV(Instruction &inst) {
int rd, rs1, rs2;
int32_t divisor, dividend;
int64_t result;
@ -1495,9 +1628,11 @@ void Execute::M_DIV(Instruction &inst) {
log->SC_log(Log::INFO) << dec << "DIV: x" << rs1 << " / x" << rs2
<< " -> x" << rd << "(" << result << ")" << endl;
return true;
}
void Execute::M_DIVU(Instruction &inst) {
bool Execute::M_DIVU(Instruction &inst) {
int rd, rs1, rs2;
uint32_t divisor, dividend;
uint64_t result;
@ -1522,9 +1657,11 @@ void Execute::M_DIVU(Instruction &inst) {
log->SC_log(Log::INFO) << dec << "DIVU: x" << rs1 << " / x" << rs2
<< " -> x" << rd << "(" << result << ")" << endl;
return true;
}
void Execute::M_REM(Instruction &inst) {
bool Execute::M_REM(Instruction &inst) {
int rd, rs1, rs2;
int32_t divisor, dividend;
int32_t result;
@ -1550,9 +1687,11 @@ void Execute::M_REM(Instruction &inst) {
log->SC_log(Log::INFO) << dec << "REM: x" << rs1 << " / x" << rs2
<< " -> x" << rd << "(" << result << ")" << endl;
return true;
}
void Execute::M_REMU(Instruction &inst) {
bool Execute::M_REMU(Instruction &inst) {
int rd, rs1, rs2;
uint32_t divisor, dividend;
uint32_t result;
@ -1576,15 +1715,19 @@ void Execute::M_REMU(Instruction &inst) {
log->SC_log(Log::INFO) << dec << "REMU: x" << rs1 << " / x" << rs2
<< " -> x" << rd << "(" << result << ")" << endl;
return true;
}
void Execute::NOP(Instruction &inst) {
bool Execute::NOP(Instruction &inst) {
cout << endl;
regs->dump();
cout << "Simulation time " << sc_time_stamp() << endl;
perf->dump();
SC_REPORT_ERROR("Execute", "NOP");
return true;
}
/**
@ -1638,7 +1781,6 @@ void Execute::writeDataMem(uint32_t addr, uint32_t data, int size) {
data_bus->b_transport( trans, delay);
}
void Execute::RaiseException(uint32_t cause, uint32_t inst) {
uint32_t new_pc, current_pc, m_cause;