100 lines
3.0 KiB
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;
|
|
}
|