Skip to content

Commit 0ea46b2

Browse files
committed
[silicon_creator,ibex,rnd] Introduce mock for ibex, use it in rnd
In order to properly test the rnd library, introduce a mock for the ibex library. This allows to better test the rnd code without knowing the specific implementation. Signed-off-by: Amaury Pouly <[email protected]>
1 parent 4a875d8 commit 0ea46b2

File tree

5 files changed

+65
-47
lines changed

5 files changed

+65
-47
lines changed

sw/device/silicon_creator/lib/drivers/BUILD

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,13 +261,19 @@ opentitan_test(
261261
dual_cc_library(
262262
name = "ibex",
263263
srcs = dual_inputs(
264-
host = ["ibex_host.c"],
265-
shared = ["ibex.c"],
264+
device = ["ibex.c"],
265+
host = ["mock_ibex.cc"],
266266
),
267267
hdrs = dual_inputs(
268+
host = ["mock_ibex.h"],
268269
shared = ["ibex.h"],
269270
),
270271
deps = dual_inputs(
272+
host = [
273+
"//sw/device/lib/base:global_mock",
274+
"//sw/device/silicon_creator/testing:rom_test",
275+
"@googletest//:gtest",
276+
],
271277
shared = [
272278
"//hw/top:rv_core_ibex_c_regs",
273279
"//hw/top:dt",
@@ -620,6 +626,7 @@ dual_cc_library(
620626
"@googletest//:gtest",
621627
],
622628
shared = [
629+
":ibex",
623630
":lifecycle",
624631
"//sw/device/lib/base:macros",
625632
"//sw/device/silicon_creator/lib:error",

sw/device/silicon_creator/lib/drivers/ibex_host.c

Lines changed: 0 additions & 33 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright lowRISC contributors (OpenTitan project).
2+
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#include "sw/device/silicon_creator/lib/drivers/mock_ibex.h"
6+
7+
namespace rom_test {
8+
extern "C" {
9+
uint32_t ibex_mcycle32(void) { return MockIbex::Instance().MCycle32(); }
10+
uint64_t ibex_mcycle(void) { return MockIbex::Instance().MCycle(); }
11+
12+
uint64_t ibex_time_to_cycles(uint64_t time_us) {
13+
return MockIbex::Instance().IbexTimeToCycles(time_us);
14+
}
15+
16+
uint32_t ibex_rnd32_read(void) { return MockIbex::Instance().Rnd32(); }
17+
}
18+
} // namespace rom_test
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright lowRISC contributors (OpenTitan project).
2+
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#ifndef OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_MOCK_IBEX_H_
6+
#define OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_MOCK_IBEX_H_
7+
8+
#include "sw/device/lib/base/global_mock.h"
9+
#include "sw/device/silicon_creator/lib/drivers/ibex.h"
10+
#include "sw/device/silicon_creator/testing/rom_test.h"
11+
12+
namespace rom_test {
13+
namespace internal {
14+
15+
/**
16+
* Mock class for ibex.c.
17+
*/
18+
class MockIbex : public global_mock::GlobalMock<MockIbex> {
19+
public:
20+
MOCK_METHOD(uint32_t, Rnd32, ());
21+
MOCK_METHOD(uint32_t, MCycle32, ());
22+
MOCK_METHOD(uint64_t, MCycle, ());
23+
MOCK_METHOD(uint64_t, IbexTimeToCycles, (uint64_t time_us));
24+
};
25+
26+
} // namespace internal
27+
28+
using MockIbex = testing::StrictMock<internal::MockIbex>;
29+
30+
} // namespace rom_test
31+
32+
#endif // OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_MOCK_IBEX_H_

sw/device/silicon_creator/lib/drivers/rnd_unittest.cc

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
#include "sw/device/lib/base/csr.h"
1111
#include "sw/device/lib/base/mock_abs_mmio.h"
1212
#include "sw/device/lib/base/mock_crc32.h"
13-
#include "sw/device/silicon_creator/lib/base/mock_csr.h"
1413
#include "sw/device/silicon_creator/lib/base/mock_sec_mmio.h"
14+
#include "sw/device/silicon_creator/lib/drivers/mock_ibex.h"
1515
#include "sw/device/silicon_creator/lib/drivers/mock_otp.h"
1616
#include "sw/device/silicon_creator/testing/rom_test.h"
1717

@@ -34,29 +34,23 @@ class RndTest : public rom_test::RomTest {
3434
rom_test::MockAbsMmio mmio_;
3535
rom_test::MockSecMmio sec_mmio_;
3636
rom_test::MockOtp otp_;
37-
mock_csr::MockCsr csr_;
37+
rom_test::MockIbex ibex_;
3838
};
3939

4040
TEST_F(RndTest, GetUint32Enabled) {
4141
EXPECT_CALL(otp_, read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_EN_OFFSET))
4242
.WillOnce(Return(kHardenedBoolTrue));
43+
EXPECT_CALL(ibex_, Rnd32()).WillOnce(Return(12345));
4344

44-
EXPECT_ABS_READ32(base_rv_ + RV_CORE_IBEX_RND_STATUS_REG_OFFSET,
45-
{{RV_CORE_IBEX_RND_STATUS_RND_DATA_VALID_BIT, false}});
46-
EXPECT_ABS_READ32(base_rv_ + RV_CORE_IBEX_RND_STATUS_REG_OFFSET,
47-
{{RV_CORE_IBEX_RND_STATUS_RND_DATA_VALID_BIT, true}});
48-
EXPECT_CSR_READ(CSR_REG_MCYCLE, 67894);
49-
EXPECT_ABS_READ32(base_rv_ + RV_CORE_IBEX_RND_DATA_REG_OFFSET, 12345);
50-
EXPECT_EQ(rnd_uint32(), 67894 + 12345);
45+
EXPECT_EQ(rnd_uint32(), 12345);
5146
}
5247

5348
TEST_F(RndTest, GetUint32Disabled) {
5449
EXPECT_CALL(otp_, read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_EN_OFFSET))
5550
.WillOnce(Return(kHardenedBoolFalse));
51+
EXPECT_CALL(ibex_, MCycle32()).WillOnce(Return(978465));
5652

57-
EXPECT_CSR_READ(CSR_REG_MCYCLE, 978465);
58-
EXPECT_ABS_READ32(base_rv_ + RV_CORE_IBEX_RND_DATA_REG_OFFSET, 193475837);
59-
EXPECT_EQ(rnd_uint32(), 978465 + 193475837);
53+
EXPECT_EQ(rnd_uint32(), 978465);
6054
}
6155

6256
struct RndtLcStateTestCfg {

0 commit comments

Comments
 (0)