Hazard3/test/sim/sw_testcases/pmp_write_and_lock.c

100 lines
3.0 KiB
C

#include "tb_cxxrtl_io.h"
#include "hazard3_csr.h"
#include "pmp.h"
// Check PMP registers can be written and read back. Check that lock bit
// prevents further writes.
/*EXPECTED-OUTPUT***************************************************************
Reset value check
00: cfg = 00, addr = 00000000
01: cfg = 00, addr = 00000000
02: cfg = 00, addr = 00000000
03: cfg = 00, addr = 00000000
04: cfg = 00, addr = 00000000
05: cfg = 00, addr = 00000000
06: cfg = 00, addr = 00000000
07: cfg = 00, addr = 00000000
08: cfg = 00, addr = 00000000
09: cfg = 00, addr = 00000000
10: cfg = 00, addr = 00000000
11: cfg = 00, addr = 00000000
12: cfg = 00, addr = 00000000
13: cfg = 00, addr = 00000000
14: cfg = 00, addr = 00000000
15: cfg = 00, addr = 00000000
Write all ones (except lock bit)
00: cfg = 1f, addr = 3fffffff // Note bits 31:30 aren't writable as the address is
01: cfg = 1f, addr = 3fffffff // left-shifted by 2 and we only have a 4 GiB
02: cfg = 1f, addr = 3fffffff // physical address space.
03: cfg = 1f, addr = 3fffffff
04: cfg = 00, addr = 00000000
05: cfg = 00, addr = 00000000
06: cfg = 00, addr = 00000000
07: cfg = 00, addr = 00000000
08: cfg = 00, addr = 00000000
09: cfg = 00, addr = 00000000
10: cfg = 00, addr = 00000000
11: cfg = 00, addr = 00000000
12: cfg = 00, addr = 00000000
13: cfg = 00, addr = 00000000
14: cfg = 00, addr = 00000000
15: cfg = 00, addr = 00000000
Write unique values
00: cfg = 00, addr = 11111111
01: cfg = 01, addr = 22222222
02: cfg = 02, addr = 33333333
03: cfg = 03, addr = 04444444
Set lock bits
Try to set all-ones again
00: cfg = 80, addr = 11111111
01: cfg = 80, addr = 22222222
02: cfg = 80, addr = 33333333
03: cfg = 80, addr = 04444444
*******************************************************************************/
// Number of implemented regions configured in the testbench
#define PMP_REGIONS 4
// Number of registers including WARL-0
#define PMP_REGIONS_MAX 16
int main() {
tb_puts("Reset value check\n");
for (int i = 0; i < PMP_REGIONS_MAX; ++i)
tb_printf("%02d: cfg = %02x, addr = %08x\n", i, read_pmpcfg(i), read_pmpaddr(i));
tb_puts("Write all ones (except lock bit)\n");
for (int i = 0; i < PMP_REGIONS_MAX; ++i) {
write_pmpcfg(i, 0x1fu);
write_pmpaddr(i, -1u);
}
for (int i = 0; i < PMP_REGIONS_MAX; ++i)
tb_printf("%02d: cfg = %02x, addr = %08x\n", i, read_pmpcfg(i), read_pmpaddr(i));
tb_puts("Write unique values\n");
for (unsigned int i = 0; i < PMP_REGIONS; ++i) {
write_pmpcfg(i, i);
write_pmpaddr(i, (i + 1) * 0x11111111u);
}
for (int i = 0; i < PMP_REGIONS; ++i)
tb_printf("%02d: cfg = %02x, addr = %08x\n", i, read_pmpcfg(i), read_pmpaddr(i));
tb_puts("Set lock bits\n");
for (int i = 0; i < PMP_REGIONS; ++i)
write_pmpcfg(i, PMPCFG_L_BITS);
tb_puts("Try to set all-ones again\n");
for (int i = 0; i < PMP_REGIONS_MAX; ++i) {
write_pmpcfg(i, 0x1fu);
write_pmpaddr(i, -1u);
}
for (int i = 0; i < PMP_REGIONS; ++i)
tb_printf("%02d: cfg = %02x, addr = %08x\n", i, read_pmpcfg(i), read_pmpaddr(i));
return 0;
}