6 #include "sw/device/lib/dif/dif_rv_core_ibex.h"
9 #include "sw/device/lib/testing/entropy_testutils.h"
10 #include "sw/device/lib/testing/rv_core_ibex_testutils.h"
11 #include "sw/device/lib/testing/test_framework/check.h"
14 #include "rv_core_ibex_regs.h"
17 OTTF_DEFINE_TEST_CONFIG();
20 extern uint32_t rv_core_ibex_rnd_read_and_immediately_check_status(
22 extern uint32_t rv_core_ibex_check_rnd_read_possible_while_status_invalid(
26 kRandomDataReads = 32,
27 kRandomDataReadsSilicon = 500000,
28 kInvalidReadAttempts = 8,
35 kTimeoutUsec = 2500000,
44 CHECK_STATUS_OK(entropy_testutils_auto_mode_init());
47 dif_rv_core_ibex_t rv_core_ibex;
48 dt_rv_core_ibex_t kRvCoreIbexDt = (dt_rv_core_ibex_t)0;
49 static_assert(kDtRvCoreIbexCount == 1,
50 "This test expects exactly one Ibex core");
51 CHECK_DIF_OK(dif_rv_core_ibex_init_from_dt(kRvCoreIbexDt, &rv_core_ibex));
53 uint32_t data_reads_count = kRandomDataReads;
55 data_reads_count = kRandomDataReadsSilicon;
62 uint32_t previous_rnd_data = 0;
63 for (
int i = 0; i < data_reads_count; i++) {
64 CHECK_STATUS_OK(rv_core_ibex_testutils_get_rnd_data(
65 &rv_core_ibex, kTimeoutUsec, &rnd_data));
66 CHECK(rnd_data != previous_rnd_data);
67 previous_rnd_data = rnd_data;
72 bool quick_reads_success =
true;
73 for (
int i = 0; i < kInvalidReadAttempts; ++i) {
74 quick_reads_success &= rv_core_ibex_rnd_read_and_immediately_check_status(
75 rv_core_ibex.base_addr.base);
77 CHECK(!quick_reads_success);
81 for (
int i = 0; i < data_reads_count; i++) {
82 CHECK_DIF_OK(dif_rv_core_ibex_read_rnd_data(&rv_core_ibex, &rnd_data));
87 IBEX_SPIN_FOR(rv_core_ibex_testutils_is_rnd_data_valid(&rv_core_ibex),
89 uint32_t status_value = UINT32_MAX;
90 for (
int i = 0; i < kInvalidReadAttempts; ++i) {
91 status_value &= rv_core_ibex_check_rnd_read_possible_while_status_invalid(
92 rv_core_ibex.base_addr.base);
94 CHECK(status_value == 0);