Skip to content

Commit ef1dd89

Browse files
committed
feat(difftest): display instructions in order
This commit changes the order of displayed instructions in the bug report. Previously we are using a vector to emulate a circular queue. Now we change it to a native C++ queue.
1 parent 826fe99 commit ef1dd89

File tree

2 files changed

+40
-47
lines changed

2 files changed

+40
-47
lines changed

src/test/csrc/difftest/difftest.cpp

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1689,6 +1689,12 @@ void CommitTrace::display(bool use_spike) {
16891689
}
16901690
}
16911691

1692+
void CommitTrace::display_line(int index, bool use_spike, bool is_retire) {
1693+
Info("[%02d] ", index);
1694+
display(use_spike);
1695+
Info("%s\n", is_retire ? " <--" : "");
1696+
}
1697+
16921698
void Difftest::display_stats() {
16931699
auto trap = get_trap_event();
16941700
uint64_t instrCnt = trap->instrCnt;
@@ -1698,40 +1704,27 @@ void Difftest::display_stats() {
16981704
this->id, instrCnt, cycleCnt, ipc);
16991705
}
17001706

1701-
void DiffState::display_commit_count(int i) {
1702-
auto retire_pointer = (retire_group_pointer + DEBUG_GROUP_TRACE_SIZE - 1) % DEBUG_GROUP_TRACE_SIZE;
1703-
Info("commit group [%02d]: pc %010lx cmtcnt %d%s\n", i, retire_group_pc_queue[i], retire_group_cnt_queue[i],
1704-
(i == retire_pointer) ? " <--" : "");
1705-
}
1706-
1707-
void DiffState::display_commit_instr(int i) {
1708-
display_commit_instr(retire_inst_pointer, spike_valid());
1709-
fflush(stdout);
1710-
}
1711-
1712-
void DiffState::display_commit_instr(int i, bool use_spike) {
1713-
if (!commit_trace[i]) {
1714-
return;
1715-
}
1716-
Info("[%02d] ", i);
1717-
commit_trace[i]->display(use_spike);
1718-
auto retire_pointer = (retire_inst_pointer + DEBUG_INST_TRACE_SIZE - 1) % DEBUG_INST_TRACE_SIZE;
1719-
Info("%s\n", (i == retire_pointer) ? " <--" : "");
1720-
}
1721-
17221707
void DiffState::display(int coreid) {
17231708
Info("\n============== Commit Group Trace (Core %d) ==============\n", coreid);
1724-
for (int j = 0; j < DEBUG_GROUP_TRACE_SIZE; j++) {
1725-
display_commit_count(j);
1709+
int group_index = 0;
1710+
while (!retire_group_queue.empty()) {
1711+
auto [pc, cnt] = retire_group_queue.front();
1712+
retire_group_queue.pop();
1713+
Info("commit group [%02d]: pc %010lx cmtcnt %d%s\n", group_index, pc, cnt,
1714+
retire_group_queue.empty() ? " <--" : "");
1715+
group_index++;
17261716
}
17271717

17281718
Info("\n============== Commit Instr Trace ==============\n");
1729-
bool use_spike = spike_valid();
1730-
for (int j = 0; j < DEBUG_INST_TRACE_SIZE; j++) {
1731-
display_commit_instr(j, use_spike);
1719+
int commit_index = 0;
1720+
while (!commit_trace.empty()) {
1721+
CommitTrace *trace = commit_trace.front();
1722+
commit_trace.pop();
1723+
trace->display_line(commit_index, use_spike, commit_trace.empty());
1724+
commit_index++;
17321725
}
17331726

17341727
fflush(stdout);
17351728
}
17361729

1737-
DiffState::DiffState() : commit_trace(DEBUG_INST_TRACE_SIZE, nullptr) {}
1730+
DiffState::DiffState() : use_spike(spike_valid()) {}

src/test/csrc/difftest/difftest.h

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
#include "refproxy.h"
2525
#include <queue>
2626
#include <unordered_set>
27-
#include <vector>
2827
#ifdef FUZZING
2928
#include "emu.h"
3029
#endif // FUZZING
@@ -81,6 +80,7 @@ class CommitTrace {
8180
virtual ~CommitTrace() {}
8281
virtual const char *get_type() = 0;
8382
virtual void display(bool use_spike = false);
83+
void display_line(int index, bool use_spike, bool is_retire);
8484

8585
protected:
8686
virtual void display_custom() = 0;
@@ -159,48 +159,48 @@ class DiffState {
159159
bool dump_commit_trace = false;
160160

161161
DiffState();
162-
void record_group(uint64_t pc, uint64_t count) {
163-
retire_group_pc_queue[retire_group_pointer] = pc;
164-
retire_group_cnt_queue[retire_group_pointer] = count;
165-
retire_group_pointer = (retire_group_pointer + 1) % DEBUG_GROUP_TRACE_SIZE;
166-
};
162+
void record_group(uint64_t pc, uint32_t count) {
163+
if (retire_group_queue.size() >= DEBUG_GROUP_TRACE_SIZE) {
164+
retire_group_queue.pop();
165+
}
166+
retire_group_queue.push({pc, count});
167+
}
167168
void record_inst(uint64_t pc, uint32_t inst, uint8_t en, uint8_t dest, uint64_t data, bool skip, bool delayed,
168169
uint8_t lqidx, uint8_t sqidx, uint16_t robidx, uint8_t isLoad, uint8_t isStore) {
169170
push_back_trace(new InstrTrace(pc, inst, en, dest, data, lqidx, sqidx, robidx, isLoad, isStore, skip, delayed));
170-
retire_inst_pointer = (retire_inst_pointer + 1) % DEBUG_INST_TRACE_SIZE;
171171
};
172172
void record_exception(uint64_t pc, uint32_t inst, uint64_t cause) {
173173
push_back_trace(new ExceptionTrace(pc, inst, cause));
174-
retire_inst_pointer = (retire_inst_pointer + 1) % DEBUG_INST_TRACE_SIZE;
175174
};
176175
void record_interrupt(uint64_t pc, uint32_t inst, uint64_t cause) {
177176
push_back_trace(new InterruptTrace(pc, inst, cause));
178-
retire_inst_pointer = (retire_inst_pointer + 1) % DEBUG_INST_TRACE_SIZE;
179177
};
180178
void display(int coreid);
181179

182180
private:
181+
const bool use_spike;
182+
183183
const static int DEBUG_GROUP_TRACE_SIZE = 16;
184-
int retire_group_pointer = 0;
185-
uint64_t retire_group_pc_queue[DEBUG_GROUP_TRACE_SIZE] = {0};
186-
uint32_t retire_group_cnt_queue[DEBUG_GROUP_TRACE_SIZE] = {0};
184+
std::queue<std::pair<uint64_t, uint32_t>> retire_group_queue;
187185

188186
const static int DEBUG_INST_TRACE_SIZE = 32;
189-
int retire_inst_pointer = 0;
190-
std::vector<CommitTrace *> commit_trace;
187+
std::queue<CommitTrace *> commit_trace;
191188

192189
void push_back_trace(CommitTrace *trace) {
193-
if (commit_trace[retire_inst_pointer]) {
194-
delete commit_trace[retire_inst_pointer];
190+
if (commit_trace.size() >= DEBUG_INST_TRACE_SIZE) {
191+
delete commit_trace.front();
192+
commit_trace.pop();
195193
}
196-
commit_trace[retire_inst_pointer] = trace;
194+
commit_trace.push(trace);
197195
if (dump_commit_trace) {
198-
display_commit_instr(retire_inst_pointer);
196+
static uint64_t commit_counter = 0;
197+
trace->display_line(commit_counter, use_spike, false);
198+
commit_counter++;
199+
fflush(stdout);
199200
}
200201
}
201202
void display_commit_count(int i);
202-
void display_commit_instr(int i);
203-
void display_commit_instr(int i, bool use_spike);
203+
void display_commit_instr(int index, CommitTrace *trace, bool is_retire);
204204
};
205205

206206
class Difftest {

0 commit comments

Comments
 (0)