| ************************************************************************* |
| Benchmarks for RISCV Processor |
| ------------------------------------------------------------------------- |
| |
| The benchmarks make use of the RISCV C compiler toolchain. You will need |
| to include a bmark.mk makefile fragment in each benchmark directory. The |
| fragment should include the object files and a rule to actually link |
| these object files into an executable. There are a couple important |
| points to make about the toolchain. |
| |
| + The toolchain sets the stack pointer to memory address 0x20000 so your |
| main memory _must_ be larger than 0x20000 bytes or else the stack will |
| get wrapped around and overwrite program data. |
| |
| + The stack grows down from 0x20000 and your program is loaded at 0x1000. |
| If you have a very large program and have lots of very big arrays |
| declared on the stack your stack could overwrite your program. Be aware. |
| |
| + You cannot use standard clib functions (like memcopy or strcat). You |
| cannot use system calls and thus cannot use printf. |
| |
| + You cannot access the simulated command line - ie you cannot use argc |
| and argv within main. |
| |
| + You may have to increase the timeout check in your test harness to |
| allow longer programs to run (you can do this from the command line |
| option +max-cycles with the standard test harness) |
| |
| + The compiler loads the program at 0x1000. It does not insert exception |
| setup code. So if you are careful with what C you use it will only |
| generate code in the riscv lab1 subset. If you use multiplies, shorts, |
| and chars it could generate mul, lh, and lb instructions. Be aware. |
| |
| + You can write assembly in C - you need to do this to write tohost to 1 |
| to indicate when the benchmark is done. Look at the example |
| benchmarks to see how this is done. You can find more information |
| about how to write assembly in C here: |
| http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html |
| |
| + Debugging C compiled code on the RISCV processor is a real pain. It is |
| hard to associate the assembly with the C code and there is no |
| debugger. So if you encounter a bug in your processor when running a C |
| benchmark you can try to debug it, but you might have better luck |
| adding more assembly tests to your test suite. |
| |
| + To avoid having the compiler try and use a global pointer (ie using |
| register 28 to point to a space where small global variables are |
| stored) you need to use the -G 0 command line option. |