Bump spike-cosim for spike changes
This commit is contained in:
@@ -6,6 +6,9 @@
|
||||
#include <sstream>
|
||||
#include <set>
|
||||
|
||||
#define CLINT_BASE (0x2000000)
|
||||
#define CLINT_SIZE (0x1000)
|
||||
|
||||
typedef struct system_info_t {
|
||||
std::string isa;
|
||||
int pmpregions;
|
||||
@@ -87,13 +90,20 @@ extern "C" void cospike_cosim(long long int cycle,
|
||||
);
|
||||
|
||||
std::vector<std::pair<reg_t, mem_t*>> mems = make_mems(cfg->mem_layout());
|
||||
|
||||
rom_device_t *boot_rom = new rom_device_t(info->bootrom);
|
||||
mem_t *boot_addr_reg = new mem_t(0x1000);
|
||||
uint64_t default_boot_addr = 0x80000000;
|
||||
std::vector<std::pair<reg_t, abstract_device_t*>> plugin_devices;
|
||||
boot_addr_reg->store(0, 8, (const uint8_t*)(&default_boot_addr));
|
||||
plugin_devices.push_back(std::pair(0x10000, boot_rom));
|
||||
|
||||
// Don't actually build a clint
|
||||
mem_t* clint_mem = new mem_t(CLINT_SIZE);
|
||||
|
||||
std::vector<std::pair<reg_t, abstract_device_t*>> plugin_devices;
|
||||
// The device map is hardcoded here for now
|
||||
plugin_devices.push_back(std::pair(0x4000, boot_addr_reg));
|
||||
plugin_devices.push_back(std::pair(0x10000, boot_rom));
|
||||
plugin_devices.push_back(std::pair(CLINT_BASE, clint_mem));
|
||||
|
||||
s_vpi_vlog_info vinfo;
|
||||
if (!vpi_get_vlog_info(&vinfo))
|
||||
@@ -201,7 +211,7 @@ extern "C" void cospike_cosim(long long int cycle,
|
||||
if (has_wdata) {
|
||||
auto& log = s->log_reg_write;
|
||||
auto& mem_read = s->log_mem_read;
|
||||
|
||||
reg_t mem_read_addr = mem_read.empty() ? 0 : std::get<0>(mem_read[0]);
|
||||
for (auto regwrite : log) {
|
||||
int rd = regwrite.first >> 4;
|
||||
int type = regwrite.first & 0xf;
|
||||
@@ -225,14 +235,15 @@ extern "C" void cospike_cosim(long long int cycle,
|
||||
)) {
|
||||
printf("CSR override\n");
|
||||
s->XPR.write(rd, wdata);
|
||||
} else if (!mem_read.empty() &&
|
||||
((magic_addrs.count(std::get<0>(mem_read[0])) ||
|
||||
tohost_addr && std::get<0>(mem_read[0]) == tohost_addr) ||
|
||||
(fromhost_addr && std::get<0>(mem_read[0]) == fromhost_addr))) {
|
||||
// Don't check reads from tohost, or reads from magic memory
|
||||
} else if (!mem_read.empty() && ((magic_addrs.count(mem_read_addr) ||
|
||||
(tohost_addr && mem_read_addr == tohost_addr) ||
|
||||
(fromhost_addr && mem_read_addr == fromhost_addr) ||
|
||||
(CLINT_BASE <= mem_read_addr && mem_read_addr < (CLINT_BASE + CLINT_SIZE))
|
||||
))) {
|
||||
// Don't check reads from tohost, reads from magic memory, or reads from clint
|
||||
// Technically this could be buggy because log_mem_read only reports vaddrs, but
|
||||
// no software ever should access tohost/fromhost with vaddrs anyways
|
||||
printf("To/From host read override\n");
|
||||
// no software ever should access tohost/fromhost/clint with vaddrs anyways
|
||||
printf("Read override %lx\n", mem_read_addr);
|
||||
s->XPR.write(rd, wdata);
|
||||
} else if (wdata != regwrite.second.v[0]) {
|
||||
printf("%d wdata mismatch reg %d %lx != %lx\n", cycle, rd, regwrite.second.v[0], wdata);
|
||||
|
||||
Reference in New Issue
Block a user