10 #include "sw/device/lib/testing/edn_testutils.h"
11 #include "sw/device/lib/testing/entropy_src_testutils.h"
12 #include "sw/device/lib/testing/entropy_testutils.h"
13 #include "sw/device/lib/testing/test_framework/check.h"
16 #include "entropy_src_regs.h"
19 OTTF_DEFINE_TEST_CONFIG();
22 kEntropySrcHealthTestWindowSize = 0x200,
26 kEntropySrcFifoThreshold = 16,
30 kContiguousSamplesCount = 1024,
35 kVerilatorContiguousSamplesCount = 8,
39 kTimeoutUsec = 1000 * 1000,
53 kFifoBufferSizeWords =
54 kContiguousSamplesCount * kBitsPerSample /
sizeof(uint32_t),
57 static uint32_t sample_buffer[kFifoBufferSizeWords];
58 static dif_entropy_src_t entropy_src;
59 static dif_csrng_t csrng;
60 static dif_edn_t edn0;
61 static dif_edn_t edn1;
66 bool entropy_src_fifo_has_overflowed(
void) {
70 return has_overflowed;
76 static status_t let_observe_fifo_overflow(uint32_t timeout_usec) {
77 LOG_INFO(
"let observe FIFO overflow...");
86 bool postht_entropy_dropped(
void) {
87 uint32_t recov_alert_sts;
92 ENTROPY_SRC_RECOV_ALERT_STS_POSTHT_ENTROPY_DROP_ALERT_BIT);
100 edn_testutils_auto_params_build(
false, 0, 0);
102 edn_testutils_auto_params_build(
false, 0, 0);
104 TRY(entropy_testutils_stop_all());
106 TRY(entropy_src_testutils_disable_health_tests(&entropy_src));
112 .entropy_insert_enable =
false,
113 .buffer_threshold = kEntropySrcFifoThreshold,
121 .route_to_firmware =
false,
122 .bypass_conditioner =
false,
123 .single_bit_mode = single_bit_mode,
124 .health_test_threshold_scope =
false,
125 .health_test_window_size = kEntropySrcHealthTestWindowSize,
126 .alert_threshold = UINT16_MAX},
144 uint32_t timeout_usec, uint32_t repeat_count) {
146 uint32_t nr_sample_words =
147 ceil_div(nr_samples * kBitsPerSample,
sizeof(uint32_t));
149 entropy_config(single_bit_mode);
152 LOG_INFO(
"Running test in mode %u, will run test %u times", single_bit_mode,
154 while (repeat_count-- > 0) {
155 LOG_INFO(
"collecting %u samples...", nr_samples);
157 uint32_t words_to_read = nr_sample_words;
158 uint32_t *sample_buffer_ptr = sample_buffer;
162 ENTROPY_SRC_RECOV_ALERT_STS_POSTHT_ENTROPY_DROP_ALERT_BIT));
164 LOG_INFO(
"drain observe FIFO overflow...");
165 TRY(entropy_src_testutils_drain_observe_fifo(&entropy_src));
169 size_t len = words_to_read;
172 TRY_CHECK(!postht_entropy_dropped(),
173 "entropy bits dropped before postht FIFO");
175 TRY_CHECK(!entropy_src_fifo_has_overflowed(),
176 "observe FIFO overflowed during collection");
178 &entropy_src, sample_buffer_ptr, &len));
179 sample_buffer_ptr += len;
180 words_to_read -= len;
185 udiv64_slow((uint64_t)nr_samples * (uint64_t)1000000, elapsed, NULL);
186 LOG_INFO(
"done in %ums (~ %usamples/s)",
187 (uint32_t)
udiv64_slow(elapsed, 1000, NULL), (uint32_t)freq);
190 if (repeat_count > 0) {
191 TRY(let_observe_fifo_overflow(timeout_usec));
198 CHECK_DIF_OK(dif_entropy_src_init(
200 CHECK_DIF_OK(dif_csrng_init(
212 uint32_t contiguous_sample_count = kContiguousSamplesCount;
219 contiguous_sample_count = kVerilatorContiguousSamplesCount;
222 for (
size_t i = 0; i <
ARRAYSIZE(kModes); i++) {
224 contiguous_sample_count, kModes[i], kTimeoutUsec,
228 return status_ok(test_result);