Files
DRAMSys/dram/testing/BankwiseRefreshManager_test.cpp
2014-03-16 13:35:47 -07:00

89 lines
2.8 KiB
C++

/*
* BankwiseRefreshManager_test.cpp
*
* Created on: Mar 9, 2014
* Author: jonny
*/
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <core/refresh/BankwiseRefreshManager.h>
#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<tlm::tlm_generic_payload> 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 */