mirror of
https://github.com/lowRISC/ibex.git
synced 2025-04-21 04:17:20 -04:00
When Ibex does a load that receives data with bad integrity it suppresses the write to the destination register. The implements matching functionality for cosim.
121 lines
3 KiB
C++
121 lines
3 KiB
C++
// Copyright lowRISC contributors.
|
|
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
#include <svdpi.h>
|
|
#include <cassert>
|
|
|
|
#include "cosim.h"
|
|
#include "cosim_dpi.h"
|
|
|
|
int riscv_cosim_step(Cosim *cosim, const svBitVecVal *write_reg,
|
|
const svBitVecVal *write_reg_data, const svBitVecVal *pc,
|
|
svBit sync_trap, svBit suppress_reg_write) {
|
|
assert(cosim);
|
|
|
|
return cosim->step(write_reg[0], write_reg_data[0], pc[0], sync_trap,
|
|
suppress_reg_write)
|
|
? 1
|
|
: 0;
|
|
}
|
|
|
|
void riscv_cosim_set_mip(Cosim *cosim, const svBitVecVal *mip) {
|
|
assert(cosim);
|
|
|
|
cosim->set_mip(mip[0]);
|
|
}
|
|
|
|
void riscv_cosim_set_nmi(Cosim *cosim, svBit nmi) {
|
|
assert(cosim);
|
|
|
|
cosim->set_nmi(nmi);
|
|
}
|
|
|
|
void riscv_cosim_set_nmi_int(Cosim *cosim, svBit nmi_int) {
|
|
assert(cosim);
|
|
|
|
cosim->set_nmi_int(nmi_int);
|
|
}
|
|
void riscv_cosim_set_debug_req(Cosim *cosim, svBit debug_req) {
|
|
assert(cosim);
|
|
|
|
cosim->set_debug_req(debug_req);
|
|
}
|
|
|
|
void riscv_cosim_set_mcycle(Cosim *cosim, svBitVecVal *mcycle) {
|
|
assert(cosim);
|
|
|
|
uint64_t mcycle_full = mcycle[0] | (uint64_t)mcycle[1] << 32;
|
|
cosim->set_mcycle(mcycle_full);
|
|
}
|
|
|
|
void riscv_cosim_set_csr(Cosim *cosim, const int csr_id,
|
|
const svBitVecVal *csr_val) {
|
|
assert(cosim);
|
|
|
|
cosim->set_csr(csr_id, (uint32_t)csr_val[0]);
|
|
}
|
|
|
|
void riscv_cosim_set_ic_scr_key_valid(Cosim *cosim, svBit valid) {
|
|
assert(cosim);
|
|
|
|
cosim->set_ic_scr_key_valid(valid);
|
|
}
|
|
|
|
void riscv_cosim_notify_dside_access(Cosim *cosim, svBit store,
|
|
svBitVecVal *addr, svBitVecVal *data,
|
|
svBitVecVal *be, svBit error,
|
|
svBit misaligned_first,
|
|
svBit misaligned_second) {
|
|
assert(cosim);
|
|
|
|
cosim->notify_dside_access(
|
|
DSideAccessInfo{.store = store != 0,
|
|
.data = data[0],
|
|
.addr = addr[0],
|
|
.be = be[0],
|
|
.error = error != 0,
|
|
.misaligned_first = misaligned_first != 0,
|
|
.misaligned_second = misaligned_second != 0});
|
|
}
|
|
|
|
void riscv_cosim_set_iside_error(Cosim *cosim, svBitVecVal *addr) {
|
|
assert(cosim);
|
|
|
|
cosim->set_iside_error(addr[0]);
|
|
}
|
|
|
|
int riscv_cosim_get_num_errors(Cosim *cosim) {
|
|
assert(cosim);
|
|
|
|
return cosim->get_errors().size();
|
|
}
|
|
|
|
const char *riscv_cosim_get_error(Cosim *cosim, int index) {
|
|
assert(cosim);
|
|
|
|
if (index >= cosim->get_errors().size()) {
|
|
return nullptr;
|
|
}
|
|
|
|
return cosim->get_errors()[index].c_str();
|
|
}
|
|
|
|
void riscv_cosim_clear_errors(Cosim *cosim) {
|
|
assert(cosim);
|
|
|
|
cosim->clear_errors();
|
|
}
|
|
|
|
void riscv_cosim_write_mem_byte(Cosim *cosim, const svBitVecVal *addr,
|
|
const svBitVecVal *d) {
|
|
assert(cosim);
|
|
uint8_t byte = d[0] & 0xff;
|
|
cosim->backdoor_write_mem(addr[0], 1, &byte);
|
|
}
|
|
|
|
unsigned int riscv_cosim_get_insn_cnt(Cosim *cosim) {
|
|
assert(cosim);
|
|
|
|
return cosim->get_insn_cnt();
|
|
}
|