BankwiseRefreshManager added.
Tests for RefreshManager.
This commit is contained in:
@@ -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 */
|
||||
|
||||
@@ -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_ */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user