in src/dpi/module.cc [373:433]
void MemDPI(
dpi8_t rd_req_valid,
dpi8_t rd_req_len,
dpi8_t rd_req_id,
dpi64_t rd_req_addr,
dpi8_t wr_req_valid,
dpi8_t wr_req_len,
dpi64_t wr_req_addr,
dpi8_t wr_valid,
const svOpenArrayHandle wr_value,
dpi64_t wr_strb,
dpi8_t* rd_valid,
dpi8_t* rd_id,
const svOpenArrayHandle rd_value,
dpi8_t rd_ready) {
// check data pointers
// data is expected to come in 64bit chunks
// up to 512 bits total
// more bits require wider strb data
assert(wr_value != NULL);
assert(svDimensions(wr_value) == 1);
assert(svSize(wr_value, 1) <= 8);
assert(svSize(wr_value, 0) == 64);
assert(rd_value != NULL);
assert(svDimensions(rd_value) == 1);
assert(svSize(rd_value, 1) <= 8);
assert(svSize(rd_value, 0) == 64);
int lftIdx = svLeft(rd_value, 1);
int rgtIdx = svRight(rd_value, 1);
int blkNb = lftIdx - rgtIdx + 1;
assert(lftIdx >= 0);
assert(rgtIdx >= 0);
assert(lftIdx >= rgtIdx);
assert(blkNb > 0);
if (wr_valid) {
mem_device_.WriteData(wr_value, wr_strb);
}
if (rd_req_valid || wr_req_valid) {
mem_device_.SetRequest(
rd_req_valid,
rd_req_addr,
rd_req_len,
rd_req_id,
wr_req_addr,
wr_req_len,
wr_req_valid);
}
MemResponse r = mem_device_.ReadData(rd_ready, blkNb);
*rd_valid = r.valid;
for (int idx = 0; idx < blkNb; idx ++) {
uint64_t* dataPtr = (uint64_t*)svGetArrElemPtr1(rd_value, rgtIdx + idx);
assert(dataPtr != NULL);
(*dataPtr) = r.value[idx];
}
*rd_id = r.id;
}