aboutsummaryrefslogtreecommitdiff
path: root/riscv/dummy-rocc-test.c
blob: ba362a46aadaa7cf107894025a05c158b08a9704 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// The following is a RISC-V program to test the functionality of the
// dummy RoCC accelerator.
// Compile with riscv-gcc dummy.c
// Run with spike --extension=dummy 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");
}