added missing Load/Store instructions
This commit is contained in:
parent
1c9bfe8c60
commit
d0806a5759
|
@ -159,6 +159,42 @@ void RISC_V_execute::BGEU(Instruction &inst) {
|
|||
log->SC_log(Log::INFO) << "BGEU R" << rs1 << " > R" << rs2 << "? -> PC (" << new_pc << ")" << endl;
|
||||
}
|
||||
|
||||
void RISC_V_execute::LB(Instruction &inst) {
|
||||
uint32_t mem_addr = 0;
|
||||
int rd, rs1;
|
||||
int32_t imm = 0;
|
||||
int8_t data;
|
||||
|
||||
rd = inst.rd();
|
||||
rs1 = inst.rs1();
|
||||
imm = inst.imm_I();
|
||||
|
||||
mem_addr = imm + regs->getValue(rs1);
|
||||
data = readDataMem(mem_addr, 1);
|
||||
regs->setValue(rd, data);
|
||||
|
||||
log->SC_log(Log::INFO) << "LB: R" << rs1 << " + " << imm << " (@0x"
|
||||
<< hex <<mem_addr << dec << ") -> R" << rd << endl;
|
||||
}
|
||||
|
||||
void RISC_V_execute::LH(Instruction &inst) {
|
||||
uint32_t mem_addr = 0;
|
||||
int rd, rs1;
|
||||
int32_t imm = 0;
|
||||
int16_t data;
|
||||
|
||||
rd = inst.rd();
|
||||
rs1 = inst.rs1();
|
||||
imm = inst.imm_I();
|
||||
|
||||
mem_addr = imm + regs->getValue(rs1);
|
||||
data = readDataMem(mem_addr, 2);
|
||||
regs->setValue(rd, data);
|
||||
|
||||
log->SC_log(Log::INFO) << "LH: R" << rs1 << " + " << imm << " (@0x"
|
||||
<< hex <<mem_addr << dec << ") -> R" << rd << endl;
|
||||
}
|
||||
|
||||
void RISC_V_execute::LW(Instruction &inst) {
|
||||
uint32_t mem_addr = 0;
|
||||
int rd, rs1;
|
||||
|
@ -173,11 +209,85 @@ void RISC_V_execute::LW(Instruction &inst) {
|
|||
data = readDataMem(mem_addr, 4);
|
||||
regs->setValue(rd, data);
|
||||
|
||||
cout << "LW Data: " << data << endl;
|
||||
log->SC_log(Log::INFO) << "LW: R" << rs1 << " + " << imm << " (@0x"
|
||||
<< hex <<mem_addr << dec << ") -> R" << rd << endl;
|
||||
}
|
||||
|
||||
void RISC_V_execute::LBU(Instruction &inst) {
|
||||
uint32_t mem_addr = 0;
|
||||
int rd, rs1;
|
||||
int32_t imm = 0;
|
||||
uint8_t data;
|
||||
|
||||
rd = inst.rd();
|
||||
rs1 = inst.rs1();
|
||||
imm = inst.imm_I();
|
||||
|
||||
mem_addr = imm + regs->getValue(rs1);
|
||||
data = readDataMem(mem_addr, 1);
|
||||
regs->setValue(rd, data);
|
||||
|
||||
log->SC_log(Log::INFO) << "LBU: R" << rs1 << " + " << imm << " (@0x"
|
||||
<< hex <<mem_addr << dec << ") -> R" << rd << endl;
|
||||
}
|
||||
|
||||
void RISC_V_execute::LHU(Instruction &inst) {
|
||||
uint32_t mem_addr = 0;
|
||||
int rd, rs1;
|
||||
int32_t imm = 0;
|
||||
uint16_t data;
|
||||
|
||||
rd = inst.rd();
|
||||
rs1 = inst.rs1();
|
||||
imm = inst.imm_I();
|
||||
|
||||
mem_addr = imm + regs->getValue(rs1);
|
||||
data = readDataMem(mem_addr, 2);
|
||||
regs->setValue(rd, data);
|
||||
|
||||
log->SC_log(Log::INFO) << "LHU: R" << rs1 << " + " << imm << " (@0x"
|
||||
<< hex <<mem_addr << dec << ") -> R" << rd << endl;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void RISC_V_execute::SB(Instruction &inst) {
|
||||
uint32_t mem_addr = 0;
|
||||
int rs1, rs2;
|
||||
int32_t imm = 0;
|
||||
uint32_t data;
|
||||
|
||||
rs1 = inst.rs1();
|
||||
rs2 = inst.rs2();
|
||||
imm = inst.imm_S();
|
||||
|
||||
mem_addr = imm + regs->getValue(rs1);
|
||||
data = regs->getValue(rs2);
|
||||
|
||||
writeDataMem(mem_addr, data, 1);
|
||||
|
||||
log->SC_log(Log::INFO) << "SB: R" << rs2 << " -> R" << rs1 << " + "
|
||||
<< imm << " (@0x" << hex <<mem_addr << dec << ")" << endl;
|
||||
}
|
||||
|
||||
void RISC_V_execute::SH(Instruction &inst) {
|
||||
uint32_t mem_addr = 0;
|
||||
int rs1, rs2;
|
||||
int32_t imm = 0;
|
||||
uint32_t data;
|
||||
|
||||
rs1 = inst.rs1();
|
||||
rs2 = inst.rs2();
|
||||
imm = inst.imm_S();
|
||||
|
||||
mem_addr = imm + regs->getValue(rs1);
|
||||
data = regs->getValue(rs2);
|
||||
|
||||
writeDataMem(mem_addr, data, 2);
|
||||
|
||||
log->SC_log(Log::INFO) << "SH: R" << rs2 << " -> R" << rs1 << " + "
|
||||
<< imm << " (@0x" << hex <<mem_addr << dec << ")" << endl;
|
||||
}
|
||||
|
||||
void RISC_V_execute::SW(Instruction &inst) {
|
||||
uint32_t mem_addr = 0;
|
||||
|
@ -622,7 +732,6 @@ uint32_t RISC_V_execute::readDataMem(uint32_t addr, int size) {
|
|||
|
||||
data_bus->b_transport( trans, delay);
|
||||
|
||||
cout << "RD addr: " << addr << " data: " << data << endl;
|
||||
return data;
|
||||
}
|
||||
|
||||
|
@ -641,6 +750,4 @@ void RISC_V_execute::writeDataMem(uint32_t addr, uint32_t data, int size) {
|
|||
trans.set_address( addr );
|
||||
|
||||
data_bus->b_transport( trans, delay);
|
||||
|
||||
cout << "WR addr: " << addr << " data: " << data << endl;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue