/* * BankwiseRefreshManager_test.cpp * * Created on: Mar 9, 2014 * Author: jonny */ #include #include #include #include "testUtils.h" #include "common/dramExtension.h" using namespace testing; namespace core { class MockInternalScheduler: public IInternalScheduler { public: MOCK_METHOD1(scheduleCommand, void (const ScheduledCommand& command)); MOCK_METHOD2(scheduleTrigger, void (const Trigger command, sc_time time)); }; class BankwiseRefreshManagerTest: public Test { public: BankwiseRefreshManagerTest(){} Configuration config; MockInternalScheduler internalScheduler; std::shared_ptr transaction; CommandSchedule getCollidingWithFirstRefreshOnBank(unsigned int i) { transaction = createDummyPayload(Thread(0), Bank(i)); CommandSchedule colliding(*transaction.get()); sc_time tREFI = config.Timings.refreshTimings.at(i).tREFI; sc_time clk = config.Timings.clk; colliding.add(Read, tREFI - 1 * clk, 2 * clk); return colliding; }; CommandSchedule getNonCollidingWithFirstRefreshOnBank(unsigned int i) { transaction = createDummyPayload(Thread(0), Bank(i)); CommandSchedule non_colliding(*transaction.get()); sc_time tREFI = config.Timings.refreshTimings.at(i).tREFI; sc_time clk = config.Timings.clk; non_colliding.add(Read, tREFI - 3 * clk, 2 * clk); return non_colliding; }; }; TEST_F(BankwiseRefreshManagerTest, RefreshsAreScheduledAfterStartup) { EXPECT_CALL(internalScheduler, scheduleTrigger(Trigger::RefreshTrigger, _)).Times(config.numberOfBanks * 2); EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(config.numberOfBanks); //first trigger for each bank is scheduled BankwiseRefreshManager manager(config.Timings.refreshTimings, internalScheduler); //first refresh for each bank is scheduled, second trigger is scheduled manager.scheduleRefresh(config.Timings.refreshTimings.at(0).tREFI);//call back from wrapper } TEST_F(BankwiseRefreshManagerTest, hasCollisionExpectCollisionOnBank2) { EXPECT_CALL(internalScheduler, scheduleTrigger(Trigger::RefreshTrigger, _)).Times(config.numberOfBanks); EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(0); BankwiseRefreshManager manager(config.Timings.refreshTimings, internalScheduler); EXPECT_TRUE(manager.hasCollision(getCollidingWithFirstRefreshOnBank(2))); } TEST_F(BankwiseRefreshManagerTest, hasCollisionExpectNoCollisionOnBank2) { EXPECT_CALL(internalScheduler, scheduleTrigger(Trigger::RefreshTrigger, _)).Times(config.numberOfBanks); EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(0); BankwiseRefreshManager manager(config.Timings.refreshTimings, internalScheduler); EXPECT_FALSE(manager.hasCollision(getNonCollidingWithFirstRefreshOnBank(2))); } } /* namespace controller */