aboutsummaryrefslogtreecommitdiff
path: root/dummy_rocc
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2014-11-25 13:39:53 -0800
committerAndrew Waterman <waterman@cs.berkeley.edu>2014-11-25 14:40:51 -0800
commit590417bec978bfc3fbf35d303760494395eb65b2 (patch)
treee264e60f8ad9eba772257c9b2676997cd02b7140 /dummy_rocc
parentc31742961bdab9094c35ef6c1b33186892aa34d1 (diff)
downloadspike-590417bec978bfc3fbf35d303760494395eb65b2.zip
spike-590417bec978bfc3fbf35d303760494395eb65b2.tar.gz
spike-590417bec978bfc3fbf35d303760494395eb65b2.tar.bz2
Factor out the dummy RoCC accelerator
Diffstat (limited to 'dummy_rocc')
-rw-r--r--dummy_rocc/dummy_rocc.ac0
-rw-r--r--dummy_rocc/dummy_rocc.cc47
-rw-r--r--dummy_rocc/dummy_rocc.mk.in7
-rw-r--r--dummy_rocc/dummy_rocc_test.c29
4 files changed, 83 insertions, 0 deletions
diff --git a/dummy_rocc/dummy_rocc.ac b/dummy_rocc/dummy_rocc.ac
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/dummy_rocc/dummy_rocc.ac
diff --git a/dummy_rocc/dummy_rocc.cc b/dummy_rocc/dummy_rocc.cc
new file mode 100644
index 0000000..85ab7aa
--- /dev/null
+++ b/dummy_rocc/dummy_rocc.cc
@@ -0,0 +1,47 @@
+#include "rocc.h"
+#include "mmu.h"
+#include <cstring>
+
+class dummy_rocc_t : public rocc_t
+{
+ public:
+ const char* name() { return "dummy_rocc"; }
+
+ reg_t custom0(rocc_insn_t insn, reg_t xs1, reg_t xs2)
+ {
+ reg_t prev_acc = acc[insn.rs2];
+
+ if (insn.rs2 >= num_acc)
+ illegal_instruction();
+
+ switch (insn.funct)
+ {
+ case 0: // acc <- xs1
+ acc[insn.rs2] = xs1;
+ break;
+ case 1: // xd <- acc (the only real work is the return statement below)
+ break;
+ case 2: // acc[rs2] <- Mem[xs1]
+ acc[insn.rs2] = p->get_mmu()->load_uint64(xs1);
+ break;
+ case 3: // acc[rs2] <- accX + xs1
+ acc[insn.rs2] += xs1;
+ break;
+ default:
+ illegal_instruction();
+ }
+
+ return prev_acc; // in all cases, xd <- previous value of acc[rs2]
+ }
+
+ dummy_rocc_t()
+ {
+ memset(acc, 0, sizeof(acc));
+ }
+
+ private:
+ static const int num_acc = 4;
+ reg_t acc[num_acc];
+};
+
+REGISTER_EXTENSION(dummy_rocc, []() { return new dummy_rocc_t; })
diff --git a/dummy_rocc/dummy_rocc.mk.in b/dummy_rocc/dummy_rocc.mk.in
new file mode 100644
index 0000000..298b9f9
--- /dev/null
+++ b/dummy_rocc/dummy_rocc.mk.in
@@ -0,0 +1,7 @@
+dummy_rocc_subproject_deps = \
+ spike \
+ riscv \
+ softfloat \
+
+dummy_rocc_srcs = \
+ dummy_rocc.cc \
diff --git a/dummy_rocc/dummy_rocc_test.c b/dummy_rocc/dummy_rocc_test.c
new file mode 100644
index 0000000..94de8c0
--- /dev/null
+++ b/dummy_rocc/dummy_rocc_test.c
@@ -0,0 +1,29 @@
+// The following is a RISC-V program to test the functionality of the
+// dummy RoCC accelerator.
+// Compile with riscv64-unknown-elf-gcc dummy_rocc_test.c
+// Run with spike --extension=dummy_rocc pk a.out
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdint.h>
+
+int main() {
+ uint64_t x = 123, y = 456, z = 0;
+ // load x into accumulator 2 (funct=0)
+ asm volatile ("custom0 x0, %0, 2, 0" : : "r"(x));
+ // read it back into z (funct=1) to verify it
+ asm volatile ("custom0 %0, x0, 2, 1" : "=r"(z));
+ assert(z == x);
+ // accumulate 456 into it (funct=3)
+ asm volatile ("custom0 x0, %0, 2, 3" : : "r"(y));
+ // verify it
+ asm volatile ("custom0 %0, x0, 2, 1" : "=r"(z));
+ assert(z == x+y);
+ // do it all again, but initialize acc2 via memory this time (funct=2)
+ asm volatile ("custom0 x0, %0, 2, 2" : : "r"(&x));
+ asm volatile ("custom0 x0, %0, 2, 3" : : "r"(y));
+ asm volatile ("custom0 %0, x0, 2, 1" : "=r"(z));
+ assert(z == x+y);
+
+ printf("success!\n");
+}