BankwiseRefreshManager added.

Tests for RefreshManager.
This commit is contained in:
Janik Schlemminger
2014-03-12 07:17:02 -07:00
parent 4dbc9b8a78
commit aa2eb43126
6 changed files with 81 additions and 20 deletions

View File

@@ -11,7 +11,7 @@ using namespace common;
using namespace std;
namespace controller {
/*
BankwiseRefreshManager::BankwiseRefreshManager(vector<RefreshTiming> refreshTimings,
IInternalScheduler& internalScheduler)
{
@@ -19,14 +19,22 @@ BankwiseRefreshManager::BankwiseRefreshManager(vector<RefreshTiming> refreshTimi
for (unsigned int i = 0; i < refreshTimings.size(); ++i)
{
RefreshManager manager(refreshTimings.at(i), internalScheduler, Bank(i));
refreshManagerForBanks.push_back(&manager);
RefreshManager* manager = new RefreshManager(refreshTimings.at(i), internalScheduler, Bank(i));
refreshManagerForBanks.push_back(manager);
}
}
BankwiseRefreshManager::~BankwiseRefreshManager()
{
for (unsigned int i = 0; i < refreshManagerForBanks.size(); ++i)
{
delete(refreshManagerForBanks.at(i));
}
}
bool BankwiseRefreshManager::hasCollision(const CommandSchedule& schedule)
{
RefreshManager& manager = refreshManagerForBanks.at(schedule.getBank().ID());
RefreshManager& manager = *refreshManagerForBanks.at(schedule.getBank().ID());
return manager.hasCollision(schedule);
}
@@ -34,9 +42,9 @@ void BankwiseRefreshManager::scheduleRefresh(sc_time time)
{
for (unsigned int i = 0; i < refreshManagerForBanks.size(); ++i)
{
RefreshManager& manager = refreshManagerForBanks.at(i);
RefreshManager& manager = *refreshManagerForBanks.at(i);
manager.scheduleRefresh(time);
}
}*/
}
} /* namespace controller */

View File

@@ -13,21 +13,21 @@
#include "RefreshManager.h"
namespace controller {
/*
class BankwiseRefreshManager : public IRefreshManager
{
public:
BankwiseRefreshManager(std::vector<RefreshTiming> refreshTimings,
IInternalScheduler& internalScheduler);
virtual ~BankwiseRefreshManager(){}
virtual ~BankwiseRefreshManager();
virtual bool hasCollision(const CommandSchedule& schedule);
virtual void scheduleRefresh(sc_time time);
private:
std::vector<RefreshManager> refreshManagerForBanks;
std::vector<RefreshManager*> refreshManagerForBanks;
};
*/
} /* namespace controller */
#endif /* BANKWISEREFRESHMANAGER_H_ */

View File

@@ -17,7 +17,6 @@ RefreshManager::RefreshManager(const RefreshTiming& refreshTiming,
refreshTiming(refreshTiming), internalScheduler(internalScheduler), nextPlannedRefresh(
refreshTransaction, Command::Refresh, SC_ZERO_TIME, refreshTiming.tRFC)
{
//RefreshManager(refreshTiming, internalScheduler, Bank(0)); --> something is overwritten?
setupTransaction(refreshTransaction, Bank(0));
planNextRefresh(nextPlannedRefresh);
}

View File

@@ -18,8 +18,8 @@ namespace controller {
class CommandSchedule {
public:
CommandSchedule(tlm::tlm_generic_payload& transaction) : transaction(transaction) {};
virtual ~CommandSchedule();
CommandSchedule(const tlm::tlm_generic_payload& transaction) : transaction(transaction) {};
virtual ~CommandSchedule() {}
void add(Command command, sc_time time, sc_time executionTime)
{

View File

@@ -19,8 +19,8 @@ typedef std::vector<Command> CommandSequence;
class CommandSequenceGenerator {
public:
CommandSequenceGenerator(const ControllerState& controllerState) : controllerState(controllerState) {};
virtual ~CommandSequenceGenerator() {};
CommandSequenceGenerator(const ControllerState& controllerState) : controllerState(controllerState) {}
virtual ~CommandSequenceGenerator() {}
CommandSequence generateCommandSequence(tlm::tlm_generic_payload& transaction);
CommandSequence generateCommandSequence(tlm::tlm_generic_payload* transaction);

View File

@@ -12,6 +12,7 @@
using ::testing::_;
using ::testing::AtLeast;
using ::testing::Expectation;
using namespace testing;
constexpr unsigned int numberOfBanks = 8;
@@ -24,11 +25,41 @@ public:
MOCK_METHOD2(scheduleTrigger, void (const Trigger command, sc_time time));
};
TEST(RefreshManager, RefreshIsScheduledAfterStartup)
class RefreshManagerTest: public Test
{
public:
RefreshManagerTest(){}
Configuration config;
MockInternalScheduler internalScheduler;
CommandSchedule getCollidingWithFirstRefresh()
{
tlm::tlm_generic_payload transaction;
CommandSchedule colliding(transaction);
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()
{
tlm::tlm_generic_payload transaction;
CommandSchedule non_colliding(transaction);
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(_));
@@ -39,11 +70,8 @@ TEST(RefreshManager, RefreshIsScheduledAfterStartup)
manager.scheduleRefresh(config.Timings.refreshTimings.at(0).tREFI);//call back from wrapper
}
TEST(RefreshManager, FinishedRefreshTriggersNewRefresh)
TEST_F(RefreshManagerTest, FinishedRefreshTriggersNewRefresh)
{
Configuration config;
MockInternalScheduler internalScheduler;
EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(2);
//first trigger is scheduled
@@ -56,4 +84,30 @@ TEST(RefreshManager, FinishedRefreshTriggersNewRefresh)
manager.scheduleRefresh(config.Timings.refreshTimings.at(0).tREFI * 2);
}
TEST_F(RefreshManagerTest, hasCollisionExpectCollision)
{
RefreshManager manager(config.Timings.refreshTimings.at(0), internalScheduler);
EXPECT_TRUE(manager.hasCollision(getCollidingWithFirstRefresh()));
}
TEST_F(RefreshManagerTest, hasCollisionExpectNoCollision)
{
RefreshManager manager(config.Timings.refreshTimings.at(0), internalScheduler);
EXPECT_FALSE(manager.hasCollision(getNonCollidingWithFirstRefresh()));
}
TEST_F(RefreshManagerTest, hasCollisionSchedulesRefreshOnCollision)
{
EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(1);
RefreshManager manager(config.Timings.refreshTimings.at(0), internalScheduler);
manager.hasCollision(getCollidingWithFirstRefresh());
}
TEST_F(RefreshManagerTest, hasCollisionSchedulesNoRefreshOnNoCollision)
{
EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(0);
RefreshManager manager(config.Timings.refreshTimings.at(0), internalScheduler);
manager.hasCollision(getNonCollidingWithFirstRefresh());
}
} /* namespace controller */