mirror of https://github.com/YosysHQ/picorv32.git
picosoc: added memtest
This commit is contained in:
parent
d21937bafc
commit
f3b1246c86
|
@ -20,7 +20,11 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#if !defined(ICEBREAKER) && !defined(HX8KDEMO)
|
#ifdef ICEBREAKER
|
||||||
|
#define MEM_TOTAL 0x20000
|
||||||
|
#elif HX8KDEMO
|
||||||
|
#define MEM_TOTAL 0x200
|
||||||
|
#else
|
||||||
# error "Set -DICEBREAKER or -DHX8KDEMO when compiling firmware.c"
|
# error "Set -DICEBREAKER or -DHX8KDEMO when compiling firmware.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -176,11 +180,21 @@ void print_hex(uint32_t v, int digits)
|
||||||
|
|
||||||
void print_dec(uint32_t v)
|
void print_dec(uint32_t v)
|
||||||
{
|
{
|
||||||
if (v >= 100) {
|
if (v >= 1000) {
|
||||||
print(">=100");
|
print(">=1000");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (v >= 900) { putchar('9'); v -= 900; }
|
||||||
|
else if (v >= 800) { putchar('8'); v -= 800; }
|
||||||
|
else if (v >= 700) { putchar('7'); v -= 700; }
|
||||||
|
else if (v >= 600) { putchar('6'); v -= 600; }
|
||||||
|
else if (v >= 500) { putchar('5'); v -= 500; }
|
||||||
|
else if (v >= 400) { putchar('4'); v -= 400; }
|
||||||
|
else if (v >= 300) { putchar('3'); v -= 300; }
|
||||||
|
else if (v >= 200) { putchar('2'); v -= 200; }
|
||||||
|
else if (v >= 100) { putchar('1'); v -= 100; }
|
||||||
|
|
||||||
if (v >= 90) { putchar('9'); v -= 90; }
|
if (v >= 90) { putchar('9'); v -= 90; }
|
||||||
else if (v >= 80) { putchar('8'); v -= 80; }
|
else if (v >= 80) { putchar('8'); v -= 80; }
|
||||||
else if (v >= 70) { putchar('7'); v -= 70; }
|
else if (v >= 70) { putchar('7'); v -= 70; }
|
||||||
|
@ -236,6 +250,95 @@ char getchar()
|
||||||
return getchar_prompt(0);
|
return getchar_prompt(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cmd_print_spi_state()
|
||||||
|
{
|
||||||
|
print("SPI State:\n");
|
||||||
|
|
||||||
|
print(" LATENCY ");
|
||||||
|
print_dec((reg_spictrl >> 16) & 15);
|
||||||
|
print("\n");
|
||||||
|
|
||||||
|
print(" DDR ");
|
||||||
|
if ((reg_spictrl & (1 << 22)) != 0)
|
||||||
|
print("ON\n");
|
||||||
|
else
|
||||||
|
print("OFF\n");
|
||||||
|
|
||||||
|
print(" QSPI ");
|
||||||
|
if ((reg_spictrl & (1 << 21)) != 0)
|
||||||
|
print("ON\n");
|
||||||
|
else
|
||||||
|
print("OFF\n");
|
||||||
|
|
||||||
|
print(" CRM ");
|
||||||
|
if ((reg_spictrl & (1 << 20)) != 0)
|
||||||
|
print("ON\n");
|
||||||
|
else
|
||||||
|
print("OFF\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t xorshift32(uint32_t *state)
|
||||||
|
{
|
||||||
|
/* Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs" */
|
||||||
|
uint32_t x = *state;
|
||||||
|
x ^= x << 13;
|
||||||
|
x ^= x >> 17;
|
||||||
|
x ^= x << 5;
|
||||||
|
*state = x;
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmd_memtest()
|
||||||
|
{
|
||||||
|
int cyc_count = 5;
|
||||||
|
int stride = 256;
|
||||||
|
uint32_t state;
|
||||||
|
|
||||||
|
volatile uint32_t *base_word = (uint32_t *) 0;
|
||||||
|
volatile uint8_t *base_byte = (uint8_t *) 0;
|
||||||
|
|
||||||
|
print("Running memtest ");
|
||||||
|
|
||||||
|
// Walk in stride increments, word access
|
||||||
|
for (int i = 1; i <= cyc_count; i++) {
|
||||||
|
state = i;
|
||||||
|
|
||||||
|
for (int word = 0; word < MEM_TOTAL / sizeof(int); word += stride) {
|
||||||
|
*(base_word + word) = xorshift32(&state);
|
||||||
|
}
|
||||||
|
|
||||||
|
state = i;
|
||||||
|
|
||||||
|
for (int word = 0; word < MEM_TOTAL / sizeof(int); word += stride) {
|
||||||
|
if (*(base_word + word) != xorshift32(&state)) {
|
||||||
|
print(" ***FAILED WORD*** at ");
|
||||||
|
print_hex(4*word, 4);
|
||||||
|
print("\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print(".");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Byte access
|
||||||
|
for (int byte = 0; byte < 128; byte++) {
|
||||||
|
*(base_byte + byte) = (uint8_t) byte;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int byte = 0; byte < 128; byte++) {
|
||||||
|
if (*(base_byte + byte) != (uint8_t) byte) {
|
||||||
|
print(" ***FAILED BYTE*** at ");
|
||||||
|
print_hex(byte, 4);
|
||||||
|
print("\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print(" passed\n");
|
||||||
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
|
|
||||||
void cmd_read_flash_id()
|
void cmd_read_flash_id()
|
||||||
|
@ -570,36 +673,23 @@ void main()
|
||||||
print(" | |_) | |/ __/ _ \\___ \\ / _ \\| |\n");
|
print(" | |_) | |/ __/ _ \\___ \\ / _ \\| |\n");
|
||||||
print(" | __/| | (_| (_) |__) | (_) | |___\n");
|
print(" | __/| | (_| (_) |__) | (_) | |___\n");
|
||||||
print(" |_| |_|\\___\\___/____/ \\___/ \\____|\n");
|
print(" |_| |_|\\___\\___/____/ \\___/ \\____|\n");
|
||||||
|
print("\n");
|
||||||
|
|
||||||
|
print("Total memory: ");
|
||||||
|
print_dec(MEM_TOTAL / 1024);
|
||||||
|
print(" KiB\n");
|
||||||
|
print("\n");
|
||||||
|
|
||||||
|
cmd_memtest();
|
||||||
|
print("\n");
|
||||||
|
|
||||||
|
cmd_print_spi_state();
|
||||||
|
print("\n");
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
print("\n");
|
print("\n");
|
||||||
print("\n");
|
|
||||||
print("SPI State:\n");
|
|
||||||
|
|
||||||
print(" LATENCY ");
|
|
||||||
print_dec((reg_spictrl >> 16) & 15);
|
|
||||||
print("\n");
|
|
||||||
|
|
||||||
print(" DDR ");
|
|
||||||
if ((reg_spictrl & (1 << 22)) != 0)
|
|
||||||
print("ON\n");
|
|
||||||
else
|
|
||||||
print("OFF\n");
|
|
||||||
|
|
||||||
print(" QSPI ");
|
|
||||||
if ((reg_spictrl & (1 << 21)) != 0)
|
|
||||||
print("ON\n");
|
|
||||||
else
|
|
||||||
print("OFF\n");
|
|
||||||
|
|
||||||
print(" CRM ");
|
|
||||||
if ((reg_spictrl & (1 << 20)) != 0)
|
|
||||||
print("ON\n");
|
|
||||||
else
|
|
||||||
print("OFF\n");
|
|
||||||
|
|
||||||
print("\n");
|
|
||||||
print("Select an action:\n");
|
print("Select an action:\n");
|
||||||
print("\n");
|
print("\n");
|
||||||
print(" [1] Read SPI Flash ID\n");
|
print(" [1] Read SPI Flash ID\n");
|
||||||
|
@ -611,6 +701,8 @@ void main()
|
||||||
print(" [7] Toggle continuous read mode\n");
|
print(" [7] Toggle continuous read mode\n");
|
||||||
print(" [9] Run simplistic benchmark\n");
|
print(" [9] Run simplistic benchmark\n");
|
||||||
print(" [0] Benchmark all configs\n");
|
print(" [0] Benchmark all configs\n");
|
||||||
|
print(" [M] Run Memtest\n");
|
||||||
|
print(" [S] Print SPI state\n");
|
||||||
print("\n");
|
print("\n");
|
||||||
|
|
||||||
for (int rep = 10; rep > 0; rep--)
|
for (int rep = 10; rep > 0; rep--)
|
||||||
|
@ -650,6 +742,12 @@ void main()
|
||||||
case '0':
|
case '0':
|
||||||
cmd_benchmark_all();
|
cmd_benchmark_all();
|
||||||
break;
|
break;
|
||||||
|
case 'M':
|
||||||
|
cmd_memtest();
|
||||||
|
break;
|
||||||
|
case 'P':
|
||||||
|
cmd_print_spi_state();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue