89 lines
2.8 KiB
C++
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;
|
|
using namespace common;
|
|
|
|
namespace controller {
|
|
|
|
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(Command::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(Command::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 + 1);
|
|
EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(1);
|
|
|
|
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 */
|