diff --git a/src/dev/reg_bank.hh b/src/dev/reg_bank.hh index 3d8dc576cb..3a89a00ab6 100644 --- a/src/dev/reg_bank.hh +++ b/src/dev/reg_bank.hh @@ -759,6 +759,9 @@ class RegisterBank : public RegisterBankBase // constructor. This is intended to be used in a resetter function. const Data &initialValue() const { return _resetData; } + // Reset the initial value, which is normally set in the constructor, + // to the register's current value. + void resetInitialValue() { _resetData = _data; } /* * Interface for accessing the register's state, for use by the diff --git a/src/dev/reg_bank.test.cc b/src/dev/reg_bank.test.cc index 4439526e35..c618ef16d4 100644 --- a/src/dev/reg_bank.test.cc +++ b/src/dev/reg_bank.test.cc @@ -881,6 +881,28 @@ TEST_F(TypedRegisterTest, DefaultResetter) EXPECT_EQ(reg.get(), initial_value); } +// Set initial value later than constructor +TEST_F(TypedRegisterTest, LateInitialValueAssignment) +{ + BackingType initial_value = reg.get(); + BackingType new_initial_value = initial_value + 1; + + reg.get() = new_initial_value; + reg.resetInitialValue(); + + EXPECT_EQ(reg.get(), new_initial_value); + EXPECT_EQ(reg.initialValue(), new_initial_value); + + reg.get() = new_initial_value + 1; + EXPECT_EQ(reg.get(), new_initial_value + 1); + EXPECT_EQ(reg.initialValue(), new_initial_value); + + reg.reset(); + + EXPECT_EQ(reg.get(), new_initial_value); + EXPECT_EQ(reg.initialValue(), new_initial_value); +} + // Set a custom resetter for a register. TEST_F(TypedRegisterTest, Resetter) {