## Experiar Core Tests
A number of tests can (when they have been implemented) be run on both the management core and user core, to ensure all aspects of the SoC work correctly. All tests should be compatible with fabricated hardware, with success measurable from changes to GPIO states.

## Peripherals
- GPIO verify-peripheralsGPIO-rtl (-gl)
	- Try outputs
	- Try inputs
- UART verify-peripheralsUART-rtl (-gl)
	- Configure devices
	- Verify config is set
	- Send bytes from caravel to uart0
	- Sent bytes from uart0 to caravel
	- Set GPIO high if pass
- SPI verify-peripheralsSPI-rtl (-gl)
	- Connect test device as a 16 bit shift register
	- Set SPI output (will need a high frequency)
	- Write 3 bytes
	- Check that 3 bytes back are correct
	- Set GPIO high if pass
- PWM verify-peripheralsPWM-rtl (-gl)
	- Set PWM output on two different devices
	- Check that they alternate
		- Maybe also check frequency and on time
	- Read counter
	- Read PWM value register
	- Set GPIO high if pass

## Memory verify-memory-rtl (-gl)
- Write data to each SRAM macro
- Read back from each SRAM macro and compare data
- Read back as byte and half values and compare data
- Read back byte and half with offset and compare data
- Read from unused memory on wishbone and check that the data back is -1
- Read from unused memory in peripheral bus and check that the data back is -1
- Read from unused memory in a core and check that the data back is -1
- Read from unused memory in video config and check that the data back is -1
- Set GPIO high if pass

## Video verify-video-rtl (-gl)
- Write to all configs to make screen refresh happen much faster
- Write to start of frame buffer to have some pixel data
- Check that output is as expected
- Measure the signal timings, and make sure they are correct

## Core (these will run for both cores) verify-core-rtl (-gl)
- Program Counter and management
	- Write to program counter
	- Check that the program counter is correct
	- Write NOP for step (this does require instruction reads to work)
	- Step core
	- Check that the program counter is correct
	- Jump the program counter
	- Check that the program counter is correct
	- Free run the program counter
	- Check that the program counter increases
	- Set GPIO high if pass
- Store/Load instructions
	- Write basic program to memory
		- Write to location in local memory, then read back
	- Set program counter
	- Step through instructions
	- Read back register values
	- Run management memory test on user core
	- Run management peripheral test on user core
		- UART test modified so user core transfers data to management core, which transfers data back 
	- Run management video test on user core
	- Set GPIO high if pass
- riscv-arch-test
	- Integrate test into makefile