Accept memory trace filename from VCS plusargs

Now can use `EXTRA_SIM_FLAGS="+memtracefile=<tracefile>"` to simulate
with different trace files without recompiling.
This commit is contained in:
Hansung Kim
2023-04-03 17:41:47 -07:00
parent c0d502960f
commit bdc32b765f

View File

@@ -75,7 +75,8 @@ MemTraceLine MemTraceReader::read_trace_at(const long cycle,
// read it right now.
return MemTraceLine{};
} else if (line.cycle == cycle && line.lane_id == lane_id) {
printf("fire! cycle=%ld, valid=%d, %s \n", cycle, line.valid, line.loadstore);
printf("fire! cycle=%ld, valid=%d, %s \n", cycle, line.valid,
line.loadstore);
// FIXME! Currently lane_id is assumed to be in round-robin order, e.g.
// 0->1->2->3->0->..., both in the trace file and the order the caller calls
@@ -91,6 +92,23 @@ MemTraceLine MemTraceReader::read_trace_at(const long cycle,
}
extern "C" void memtrace_init(const char *filename) {
#ifndef NO_VPI
s_vpi_vlog_info info;
if (!vpi_get_vlog_info(&info)) {
fprintf(stderr, "fatal: failed to get plusargs from VCS\n");
exit(1);
}
const char* TRACEFILENAME_PLUSARG = "+memtracefile=";
for (int i = 0; i < info.argc; i++) {
char* input_arg = info.argv[i];
if (strncmp(input_arg, TRACEFILENAME_PLUSARG,
strlen(TRACEFILENAME_PLUSARG)) == 0) {
filename = input_arg + strlen(TRACEFILENAME_PLUSARG);
break;
}
}
#endif
printf("memtrace_init: filename=[%s]\n", filename);
reader = std::make_unique<MemTraceReader>(filename);