Go to file
Guokai Chen 6fa3eaca9c tests: add oraclebp mmio test 2023-02-22 11:13:29 +08:00
am tests: add riscv64 ppn access fault test 2023-02-04 16:02:38 +08:00
apps Merge branch 'southlake' 2022-11-03 20:08:26 +08:00
docs drivers: add documents for interrupt handling process 2022-05-02 14:17:37 +08:00
libs/klib southlake: add -DNOPRINT macro to disable printf / uart 2022-05-01 12:48:54 +08:00
share/games/nes share,game,nes: add roms from Navy-apps 2020-03-06 18:17:44 +08:00
tests tests: add oraclebp mmio test 2023-02-22 11:13:29 +08:00
tools os-export: fix export file issues 2020-02-13 00:44:38 +08:00
.gitignore Merge pull request #6 from NJU-ProjectN/fix-gitignore 2020-03-06 18:17:06 +08:00
Makefile Makefiles: include arch.mk by default 2019-03-21 09:32:08 +00:00
Makefile.app Makefile: add comments to makefiles 2019-06-13 19:04:24 +00:00
Makefile.check Makefile: add comments to makefiles 2019-06-13 19:04:24 +00:00
Makefile.compile fix CROSS_COMPILE on non-ELF systems 2022-04-25 12:48:53 +08:00
Makefile.lib fix CROSS_COMPILE on non-ELF systems 2022-04-25 12:48:53 +08:00
README.md doc: add mc bring-up drivers explanation 2022-05-01 12:57:21 +08:00

README.md

The Abstract Machine (AM)

How to build benchmark flash image

  • clone nexus-am from github:
git clone git@github.com:OpenXiangShan/nexus-am.git
  • enter benchmark directory (using apps/coremark as an example):
cd /apps/coremark
make ARCH=riscv64-xs-flash
cd ./build
ls
  • you will find a ".bin" file, this is a benchmark image in flash

How to use the prepared flash image to do simulation

  • assuming you have a XiangShan repo, the commit ID should be newer than 188f739de96af363761c0f2b80b95b70ad01e0fc
  • make emu build
  • use -F to load the image in flash:
./emu -F $AM_HOME//apps/coremark/build/coremark-riscv64-xs-flash.bin  -i ../ready-to-run/coremark-2-iteration.bin 2>debug.log

NOTE: use -i to specify the initial ram image, or a ramdom file if you do not care.

Explanation of multi-processor bring-up drivers

The driver consists of the following functions (implemented in am/src/xs/isa/riscv/mpe.c) :

  • _mpe_init(void (*entry)()): register an entry procedure that each processor will run into after initialization

  • _ncpu(): return the total number of processors

  • _cpu(): return the hartID of current processor (start from 0)

  • _atomic_xchg(intptr_t *addr, intptr_t newval): atomic exchange functionreplace the value in *addr with newval and return the original value

  • _atomic_add(intptr_t *addr, intptr_t adder) : atomic adding functionincrement value in *addr with adder and return the original value

  • _barrier(): barrier functionwait until all processors arrive here

(For more atomic operations, You can implement it yourself using a similar format as _atomic_add)

A simple demo is provided in tests/amtest/src/tests/mp.c Here is the instruction to build and run

cd nexus-am
make ARCH=riscv64-xs-dual mainargs='m2'
# Here m means multi-processor demo, 2 means dual core
$(PATH_OF_DUALCORE_XS)/build/emu -i build/amtest-riscv64-xs-dual.bin --diff=$(PATH_OF_DUALCORE_XS)/ready-to-run/riscv64-nemu-interpreter-dual-so

The output should be like this:

My CPU ID is 0, nrCPU is 2
My CPU ID is 1, nrCPU is 2
sum = 193 atomic_sum = 200
Finalize CPU ID: 1
sum = 193 atomic_sum = 200
Finalize CPU ID: 0

Note that both sum and atomic_sum are incremented 100 times per CPU parallelly. However, atomic_sum utilizes atomic primitive. Thus, we have sum <= 200 && atomic_sum == 200.