diff --git a/analyzer/analyzer/businessObjects/phases/phase.cpp b/analyzer/analyzer/businessObjects/phases/phase.cpp index 71ebdcf3..3a5827b7 100644 --- a/analyzer/analyzer/businessObjects/phases/phase.cpp +++ b/analyzer/analyzer/businessObjects/phases/phase.cpp @@ -97,7 +97,7 @@ Qt::BrushStyle Phase::getBrushStyle() const bool Phase::isSelected(traceTime time, double yVal, const TraceDrawingProperties& drawingproperties) const { - if (span.contains(time) && fabs(yVal-getYVal(drawingproperties))<=hexagonHeigth) + if (span.contains(time) && (!this->isBankwise() || fabs(yVal-getYVal(drawingproperties))<=hexagonHeigth)) return true; if (spanOnDataBus && spanOnDataBus->contains(time) && fabs(yVal-drawingproperties.yValDataBus)<=hexagonHeigth) return true; diff --git a/analyzer/analyzer/businessObjects/phases/phase.h b/analyzer/analyzer/businessObjects/phases/phase.h index 5b2be3de..8c643849 100644 --- a/analyzer/analyzer/businessObjects/phases/phase.h +++ b/analyzer/analyzer/businessObjects/phases/phase.h @@ -164,42 +164,71 @@ protected: virtual std::vector getTimesOnCommandBus() const {return {span.Begin()};} virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const override {Q_UNUSED(drawingProperties) return getPhaseColor();} virtual QColor getPhaseColor() const override {return ColorGenerator::getColor(10);} + virtual bool isBankwise() const {return false;} }; -class PDNA : public Phase +class PDNAB : public Phase { public: using Phase::Phase; protected: - virtual QString Name() const override {return "PDNA";} + virtual QString Name() const override {return "PDNAB";} virtual Qt::BrushStyle getBrushStyle() const override {return Qt::Dense6Pattern;} virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const override {Q_UNUSED(drawingProperties) return getPhaseColor();} virtual QColor getPhaseColor() const override {return QColor(Qt::black);} virtual Phase::PhaseSymbol getPhaseSymbol() const override {return PhaseSymbol::Rect;} }; -class PDNP : public Phase +class PDNA : public PDNAB +{ +public: + using PDNAB::PDNAB; +protected: + virtual QString Name() const override {return "PDNA";} + virtual bool isBankwise() const {return false;} +}; + +class PDNPB : public Phase { public: using Phase::Phase; protected: - virtual QString Name() const override {return "PDNP";} + virtual QString Name() const override {return "PDNPB";} virtual Qt::BrushStyle getBrushStyle() const override{return Qt::Dense4Pattern;} virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const override {Q_UNUSED(drawingProperties) return getPhaseColor();} virtual QColor getPhaseColor() const override {return QColor(Qt::black);} virtual Phase::PhaseSymbol getPhaseSymbol() const override {return PhaseSymbol::Rect;} }; -class SREF : public Phase +class PDNP : public PDNPB +{ +public: + using PDNPB::PDNPB; +protected: + virtual QString Name() const override {return "PDNP";} + virtual bool isBankwise() const {return false;} +}; + +class SREFB : public Phase { public: using Phase::Phase; protected: - virtual QString Name() const final {return "SREF";} + virtual QString Name() const {return "SREFB";} virtual Qt::BrushStyle getBrushStyle() const {return Qt::Dense1Pattern;} virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const override {Q_UNUSED(drawingProperties) return getPhaseColor();} virtual QColor getPhaseColor() const override {return QColor(Qt::black);} virtual Phase::PhaseSymbol getPhaseSymbol() const override {return PhaseSymbol::Rect;} }; +class SREF : public SREFB +{ +public: + using SREFB::SREFB; +protected: + virtual QString Name() const override {return "SREF";} + virtual bool isBankwise() const {return false;} +}; + + #endif // BANKPHASE_H diff --git a/analyzer/analyzer/businessObjects/phases/phasefactory.cpp b/analyzer/analyzer/businessObjects/phases/phasefactory.cpp index f5ebd1a4..efcf69da 100644 --- a/analyzer/analyzer/businessObjects/phases/phasefactory.cpp +++ b/analyzer/analyzer/businessObjects/phases/phasefactory.cpp @@ -35,13 +35,18 @@ shared_ptr PhaseFactory::CreatePhase(ID id, const QString& dbPhaseName,co return shared_ptr(new WR(id, span,trans,{Timespan(span.Begin(),span.Begin()+clk)},std::shared_ptr(new Timespan(trans->SpanOnDataStrobe())))); else if(dbPhaseName == "WRA") return shared_ptr(new WRA(id, span,trans,{Timespan(span.Begin(),span.Begin()+clk)},std::shared_ptr(new Timespan(trans->SpanOnDataStrobe())))); - - else if(dbPhaseName == "SREF") - return shared_ptr(new SREF(id, span, trans,{Timespan(span.Begin(),span.Begin()+clk),Timespan(span.End()-clk,span.End())},std::shared_ptr())); else if(dbPhaseName == "PDNA") return shared_ptr(new PDNA(id, span,trans, {Timespan(span.Begin(),span.Begin()+clk),Timespan(span.End()-clk,span.End())},std::shared_ptr())); + else if(dbPhaseName == "PDNAB") + return shared_ptr(new PDNAB(id, span,trans, {Timespan(span.Begin(),span.Begin()+clk),Timespan(span.End()-clk,span.End())},std::shared_ptr())); else if(dbPhaseName == "PDNP") return shared_ptr(new PDNP(id, span,trans, {Timespan(span.Begin(),span.Begin()+clk),Timespan(span.End()-clk,span.End())},std::shared_ptr())); + else if(dbPhaseName == "PDNPB") + return shared_ptr(new PDNPB(id, span,trans, {Timespan(span.Begin(),span.Begin()+clk),Timespan(span.End()-clk,span.End())},std::shared_ptr())); + else if(dbPhaseName == "SREF") + return shared_ptr(new SREF(id, span, trans,{Timespan(span.Begin(),span.Begin()+clk),Timespan(span.End()-clk,span.End())},std::shared_ptr())); + else if(dbPhaseName == "SREFB") + return shared_ptr(new SREFB(id, span, trans,{Timespan(span.Begin(),span.Begin()+clk),Timespan(span.End()-clk,span.End())},std::shared_ptr())); else throw std::runtime_error("DB phasename " + dbPhaseName.toStdString() + " unkown to phasefactory"); } diff --git a/dram/resources/configs/memconfigs/fifo.xml b/dram/resources/configs/memconfigs/fifo.xml index 2e23e330..603049f2 100644 --- a/dram/resources/configs/memconfigs/fifo.xml +++ b/dram/resources/configs/memconfigs/fifo.xml @@ -1,6 +1,6 @@ - + diff --git a/dram/src/common/TlmRecorder.cpp b/dram/src/common/TlmRecorder.cpp index 089f24db..7e2d3821 100644 --- a/dram/src/common/TlmRecorder.cpp +++ b/dram/src/common/TlmRecorder.cpp @@ -196,6 +196,9 @@ void TlmRecorder::setUpTransactionTerminatingPhases() transactionTerminatingPhases.push_back(static_cast(END_PDNP)); transactionTerminatingPhases.push_back(static_cast(END_PDNA)); transactionTerminatingPhases.push_back(static_cast(END_SREF)); + transactionTerminatingPhases.push_back(static_cast(END_PDNPB)); + transactionTerminatingPhases.push_back(static_cast(END_PDNAB)); + transactionTerminatingPhases.push_back(static_cast(END_SREFB)); } void TlmRecorder::prepareSqlStatements() diff --git a/dram/src/controller/Controller.h b/dram/src/controller/Controller.h index c8462a44..8a6b9115 100644 --- a/dram/src/controller/Controller.h +++ b/dram/src/controller/Controller.h @@ -179,27 +179,63 @@ void Controller::send(const ScheduledCommand &command, tlm_generic_pay controllerCorePEQ.notify(payload, BEGIN_PRE, command.getStart() - sc_time_stamp()); break; case Command::PrechargeAll: - controllerCorePEQ.notify(payload, BEGIN_PRE_ALL, command.getStart() - sc_time_stamp()); + if(command.getBank() == Bank(0)) + controllerCorePEQ.notify(payload, BEGIN_PRE_ALL, command.getStart() - sc_time_stamp()); break; case Command::PDNA: - controllerCorePEQ.notify(payload, BEGIN_PDNA, command.getStart() - sc_time_stamp()); - break; - case Command::PDNP: - controllerCorePEQ.notify(payload, BEGIN_PDNP, command.getStart() - sc_time_stamp()); - break; - case Command::SREF: - controllerCorePEQ.notify(payload, BEGIN_SREF, command.getStart() - sc_time_stamp()); + if(!Configuration::getInstance().BankwiseLogic) + { + if(command.getBank() == Bank(0)) + controllerCorePEQ.notify(payload, BEGIN_PDNA, command.getStart() - sc_time_stamp()); + } + else + controllerCorePEQ.notify(payload, BEGIN_PDNAB, command.getStart() - sc_time_stamp()); break; case Command::PDNAX: - controllerCorePEQ.notify(payload, END_PDNA, command.getEnd() - sc_time_stamp()); + if(!Configuration::getInstance().BankwiseLogic) + { + if(command.getBank() == Bank(0)) + controllerCorePEQ.notify(payload, END_PDNA, command.getStart() - sc_time_stamp()); + } + else + controllerCorePEQ.notify(payload, END_PDNAB, command.getStart() - sc_time_stamp()); + break; + case Command::PDNP: + if(!Configuration::getInstance().BankwiseLogic) + { + if(command.getBank() == Bank(0)) + controllerCorePEQ.notify(payload, BEGIN_PDNP, command.getStart() - sc_time_stamp()); + } + else + controllerCorePEQ.notify(payload, BEGIN_PDNPB, command.getStart() - sc_time_stamp()); break; case Command::PDNPX: - controllerCorePEQ.notify(payload, END_PDNP, command.getEnd() - sc_time_stamp()); + if(!Configuration::getInstance().BankwiseLogic) + { + if(command.getBank() == Bank(0)) + controllerCorePEQ.notify(payload, END_PDNP, command.getStart() - sc_time_stamp()); + } + else + controllerCorePEQ.notify(payload, END_PDNPB, command.getStart() - sc_time_stamp()); + break; + case Command::SREF: + if(!Configuration::getInstance().BankwiseLogic) + { + if(command.getBank() == Bank(0)) + controllerCorePEQ.notify(payload, BEGIN_SREF, command.getStart() - sc_time_stamp()); + } + else + controllerCorePEQ.notify(payload, BEGIN_SREFB, command.getStart() - sc_time_stamp()); break; case Command::SREFX: - controllerCorePEQ.notify(payload, END_SREF, command.getEnd() - sc_time_stamp()); + if(!Configuration::getInstance().BankwiseLogic) + { + if(command.getBank() == Bank(0)) + controllerCorePEQ.notify(payload, END_SREF, command.getStart() - sc_time_stamp()); + } + else + controllerCorePEQ.notify(payload, END_SREFB, command.getStart() - sc_time_stamp()); break; - default: SC_REPORT_FATAL(0, "unsupported command was sent by controller"); break; @@ -248,10 +284,14 @@ void Controller::controllerCorePEQCallback(tlm_generic_payload &payloa printDebugMessage("Entering REFB on bank " + to_string(bank.ID())); else if (phase == BEGIN_REFA) printDebugMessage("Entering REFA"); - else if (containsPhase(phase, { BEGIN_PDNA, BEGIN_PDNP, BEGIN_SREF })) + else if (containsPhase(phase, { BEGIN_PDNAB, BEGIN_PDNPB, BEGIN_SREFB })) printDebugMessage("Entering PowerDown " + phaseNameToString(phase) + " on bank " + to_string(bank.ID())); - else if (containsPhase(phase, { END_PDNA, END_PDNP, END_SREF })) + else if (containsPhase(phase, { END_PDNAB, END_PDNPB, END_SREFB })) printDebugMessage("Leaving PowerDown " + phaseNameToString(phase) + " on bank " + to_string(bank.ID())); + else if (containsPhase(phase, { BEGIN_PDNA, BEGIN_PDNP, BEGIN_SREF })) + printDebugMessage("Entering PowerDown " + phaseNameToString(phase) + " on all banks"); + else if (containsPhase(phase, { END_PDNA, END_PDNP, END_SREF })) + printDebugMessage("Leaving PowerDown " + phaseNameToString(phase) + " on all banks" ); else if (containsPhase(phase, { BEGIN_RD, BEGIN_WR, BEGIN_ACT, BEGIN_PRE, BEGIN_PRE_ALL, BEGIN_RDA, BEGIN_WRA })) { } @@ -404,7 +444,7 @@ void Controller::dramPEQCallback(tlm_generic_payload &payload, const t sendToFrontend(payload, BEGIN_RESP, SC_ZERO_TIME); scheduleNextPayload(); } - else if (phase == END_REFA || phase == END_REFB)//TODO send all to sleep for REFA?? + else if (phase == END_REFA || phase == END_REFB)//TODO send all to sleep for REFA cause we only send for bank 0 now??? { printDebugMessage("Finished auto refresh on bank " + to_string(bank.ID())); if(numberOfPayloadsInSystem[bank] == 0) diff --git a/dram/src/simulation/Dram.h b/dram/src/simulation/Dram.h index 7049ea86..e7f47677 100644 --- a/dram/src/simulation/Dram.h +++ b/dram/src/simulation/Dram.h @@ -108,45 +108,37 @@ struct Dram: sc_module } //Powerdown phases have to be started and ended by the controller, because they do not have a fixed length - else if (phase == BEGIN_PDNP) - { - if(Configuration::getInstance().BankwiseLogic == false) - { - if(bank == 0) - { - //DRAMPower->doCommand(MemCommand::PDN_S_PRE, bank, cycle); - } - } - } - else if (phase == END_PDNP) - { - if(Configuration::getInstance().BankwiseLogic == false) - { - if(bank == 0) - { - //DRAMPower->doCommand(MemCommand::PUP_PRE, bank, cycle); - } - } - } else if (phase == BEGIN_PDNA) { - if(Configuration::getInstance().BankwiseLogic == false) - { - if(bank == 0) - { //DRAMPower->doCommand(MemCommand::PDN_S_ACT, bank, cycle); - } - } } else if (phase == END_PDNA) { - if(Configuration::getInstance().BankwiseLogic ==false) - { - if(bank == 0) - { //DRAMPower->doCommand(MemCommand::PUP_ACT, bank, cycle); - } - } + } + else if (phase == BEGIN_PDNAB) + { + //DRAMPower->doCommand(MemCommand::PDN_S_ACT, bank, cycle); + } + else if (phase == END_PDNAB) + { + //DRAMPower->doCommand(MemCommand::PUP_ACT, bank, cycle); + } + else if (phase == BEGIN_PDNP) + { + //DRAMPower->doCommand(MemCommand::PDN_S_PRE, bank, cycle); + } + else if (phase == END_PDNP) + { + //DRAMPower->doCommand(MemCommand::PUP_PRE, bank, cycle); + } + else if (phase == BEGIN_PDNPB) + { + //DRAMPower->doCommand(MemCommand::PDN_S_PRE, bank, cycle); + } + else if (phase == END_PDNPB) + { + //DRAMPower->doCommand(MemCommand::PUP_PRE, bank, cycle); } else if (phase == BEGIN_SREF) { @@ -156,6 +148,14 @@ struct Dram: sc_module { //DRAMPower->doCommand(MemCommand::SREX, bank, cycle); } + else if (phase == BEGIN_SREFB) + { + //DRAMPower->doCommand(MemCommand::SREN, bank, cycle); + } + else if (phase == END_SREFB) + { + //DRAMPower->doCommand(MemCommand::SREX, bank, cycle); + } else { SC_REPORT_FATAL("DRAM", "DRAM PEQ was called with unknown phase");