Skip to content

Commit

Permalink
Add the generated buffer for DiffTestState (OpenXiangShan#203)
Browse files Browse the repository at this point in the history
  • Loading branch information
klin02 authored Oct 25, 2023
1 parent f3b5197 commit f2f0f37
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 5 deletions.
36 changes: 34 additions & 2 deletions src/main/scala/DPIC.scala
Original file line number Diff line number Diff line change
Expand Up @@ -97,11 +97,11 @@ class DPIC[T <: DifftestBundle](gen: T) extends ExtModule
| ${dpicFuncArgs.flatten.map(arg => getDPICArgString(arg._1, arg._2, true)).mkString(",\n ")}
|)""".stripMargin
val dpicFunc: String = {
val packet = s"difftest[io_coreid]->dut->${gen.desiredCppName}"
val packet = s"DUT_BUF(io_coreid)->${gen.desiredCppName}"
val index = if (gen.isIndexed) "[io_index]" else if (gen.isFlatten) "[io_address]" else ""
s"""
|$dpicFuncProto {
| if (difftest == NULL) return;
| if (diffstate_buffer == NULL) return;
| auto packet = &($packet$index);
| ${dpicFuncAssigns.mkString("\n ")}
|}
Expand Down Expand Up @@ -187,12 +187,31 @@ object DPIC {
BoringUtils.addSource(enable, "dpic_global_enable")
step := enable
}
val class_def =
s"""
|class DPICBuffer : public DiffStateBuffer {
|private:
| DiffTestState buffer;
|public:
| DPICBuffer() {
| memset(&buffer, 0, sizeof(buffer));
| }
| inline DiffTestState* get() {
| return &buffer;
| }
| inline DiffTestState* next() {
| return &buffer;
| }
|};
|""".stripMargin
val interfaceCpp = ListBuffer.empty[String]
interfaceCpp += "#ifndef __DIFFTEST_DPIC_H__"
interfaceCpp += "#define __DIFFTEST_DPIC_H__"
interfaceCpp += ""
interfaceCpp += "#include <cstdint>"
interfaceCpp += "#include \"diffstate.h\""
interfaceCpp += ""
interfaceCpp += class_def
interfaceCpp += interfaces.map(_._2 + ";").mkString("\n")
interfaceCpp += ""
interfaceCpp += "#endif // __DIFFTEST_DPIC_H__"
Expand All @@ -202,11 +221,24 @@ object DPIC {
val outputHeaderFile = outputDir + "/difftest-dpic.h"
Files.write(Paths.get(outputHeaderFile), interfaceCpp.mkString("\n").getBytes(StandardCharsets.UTF_8))

val diff_func =
s"""
|void diffstate_buffer_init() {
| diffstate_buffer = new DPICBuffer[NUM_CORES];
|}
|void diffstate_buffer_free() {
| delete[] diffstate_buffer;
|}
""".stripMargin
interfaceCpp.clear()
interfaceCpp += "#ifndef CONFIG_NO_DIFFTEST"
interfaceCpp += ""
interfaceCpp += "#include \"difftest.h\""
interfaceCpp += "#include \"difftest-dpic.h\""
interfaceCpp += ""
interfaceCpp += "DiffStateBuffer* diffstate_buffer;"
interfaceCpp += "#define DUT_BUF(core_id) (diffstate_buffer[core_id].get())"
interfaceCpp += diff_func;
interfaceCpp += interfaces.map(_._3).mkString("")
interfaceCpp += ""
interfaceCpp += "#endif // CONFIG_NO_DIFFTEST"
Expand Down
16 changes: 16 additions & 0 deletions src/main/scala/Difftest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,22 @@ object DifftestModule {
difftestCpp += "} DiffTestState;"
difftestCpp += ""

val class_def =
s"""
|class DiffStateBuffer {
|public:
| virtual ~DiffStateBuffer() {}
| virtual DiffTestState* get() = 0;
| virtual DiffTestState* next() = 0;
|};
|
|extern DiffStateBuffer* diffstate_buffer;
|
|extern void diffstate_buffer_init();
|extern void diffstate_buffer_free();
|""".stripMargin

difftestCpp += class_def
difftestCpp += "#endif // __DIFFSTATE_H__"
difftestCpp += ""

Expand Down
7 changes: 4 additions & 3 deletions src/test/csrc/difftest/difftest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@
Difftest **difftest = NULL;

int difftest_init() {
diffstate_buffer_init();
difftest = new Difftest*[NUM_CORES];
for (int i = 0; i < NUM_CORES; i++) {
difftest[i] = new Difftest(i);
difftest[i]->dut = diffstate_buffer[i].get();
}
return 0;
}
Expand All @@ -53,6 +55,7 @@ int difftest_state() {

int difftest_step() {
for (int i = 0; i < NUM_CORES; i++) {
difftest[i]->dut = diffstate_buffer[i].next();
int ret = difftest[i]->step();
if (ret) {
return ret;
Expand All @@ -68,6 +71,7 @@ void difftest_trace() {
}

void difftest_finish() {
diffstate_buffer_free();
for (int i = 0; i < NUM_CORES; i++) {
delete difftest[i];
}
Expand All @@ -90,14 +94,11 @@ void difftest_squash_set(int enable, const char *scope_name = "TOP.SimTop.Squash

Difftest::Difftest(int coreid) : id(coreid) {
state = new DiffState();

dut = (DiffTestState *)calloc(batch_size, sizeof(DiffTestState));
}

Difftest::~Difftest() {
delete state;
delete difftrace;
free(dut);
if (proxy) {
delete proxy;
}
Expand Down

0 comments on commit f2f0f37

Please sign in to comment.