Files
DRAMSys/DRAM/testing/RefreshManager_test.cpp
Janik Schlemminger 8ecd91c040 Changed Data Structure. lastCommandOnBus is a scheduled command now, not
just a sc_time. pointer to transaction is invalidated as soon as the
transaction is sent to the wrapper.
2014-03-15 07:38:41 -07:00

108 lines
3.2 KiB
C++

/*
* RefreshManager_test.cpp
*
* Created on: Mar 6, 2014
* Author: jonny
*/
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "core/refresh/RefreshManager.h"
#include "testUtils.h"
using ::testing::_;
using ::testing::Expectation;
using namespace testing;
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 RefreshManagerTest: public Test
{
public:
RefreshManagerTest(){}
Configuration config;
MockInternalScheduler internalScheduler;
std::shared_ptr<tlm::tlm_generic_payload> transaction;
CommandSchedule getCollidingWithFirstRefresh()
{
transaction = createDummyPayload();
CommandSchedule colliding(*transaction.get());
sc_time tREFI = config.Timings.refreshTimings.at(0).tREFI;
sc_time clk = config.Timings.clk;
colliding.add(Command::Read, tREFI - 1 * clk, 2 * clk);
return colliding;
};
CommandSchedule getNonCollidingWithFirstRefresh()
{
transaction = createDummyPayload();
CommandSchedule non_colliding(*transaction.get());
sc_time tREFI = config.Timings.refreshTimings.at(0).tREFI;
sc_time clk = config.Timings.clk;
non_colliding.add(Command::Read, tREFI - 3 * clk, 2 * clk);
return non_colliding;
};
};
TEST_F(RefreshManagerTest, RefreshIsScheduledAfterStartup)
{
EXPECT_CALL(internalScheduler, scheduleTrigger(Trigger::RefreshTrigger, _)).Times(2);
EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(1);
//first trigger is scheduled
RefreshManager manager(config.Timings.refreshTimings.at(0), internalScheduler);
//first refresh is scheduled, second trigger is scheduled
manager.scheduleRefresh(config.Timings.refreshTimings.at(0).tREFI);//call back from wrapper
}
TEST_F(RefreshManagerTest, FinishedRefreshTriggersNewRefresh)
{
EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(2);
EXPECT_CALL(internalScheduler, scheduleTrigger(Trigger::RefreshTrigger, _)).Times(3);
//first trigger is scheduled
RefreshManager manager(config.Timings.refreshTimings.at(0), internalScheduler);
//first refresh is scheduled at tREFI (wrapper triggers), second trigger is scheduled
manager.scheduleRefresh(config.Timings.refreshTimings.at(0).tREFI);//call back from wrapper
//second trigger should schedule second refresh (wrapper triggers)
manager.scheduleRefresh(config.Timings.refreshTimings.at(0).tREFI * 2);
}
TEST_F(RefreshManagerTest, hasCollisionExpectCollision)
{
EXPECT_CALL(internalScheduler, scheduleTrigger(Trigger::RefreshTrigger, _)).Times(1);
EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(0);
RefreshManager manager(config.Timings.refreshTimings.at(0), internalScheduler);
EXPECT_TRUE(manager.hasCollision(getCollidingWithFirstRefresh()));
}
TEST_F(RefreshManagerTest, hasCollisionExpectNoCollision)
{
EXPECT_CALL(internalScheduler, scheduleTrigger(Trigger::RefreshTrigger, _)).Times(1);
EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(0);
RefreshManager manager(config.Timings.refreshTimings.at(0), internalScheduler);
EXPECT_FALSE(manager.hasCollision(getNonCollidingWithFirstRefresh()));
}
} /* namespace controller */