From b4ce51eb9ecfb053e2aacbabba318a41890f436e Mon Sep 17 00:00:00 2001 From: Andreas Hansson Date: Mon, 30 Jun 2014 13:56:02 -0400 Subject: mem: Add bank and rank indices as fields to the DRAM bank This patch adds the index of the bank and rank as a field so that we can determine the identity of a given bank (reference or pointer) for the power tracing. We also grab the opportunity of cleaning up the arguments used for identifying the bank when activating. --- src/mem/dram_ctrl.cc | 30 +++++++++++++++++++----------- src/mem/dram_ctrl.hh | 12 ++++++------ 2 files changed, 25 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/mem/dram_ctrl.cc b/src/mem/dram_ctrl.cc index e4248b337..b4e1eac7b 100644 --- a/src/mem/dram_ctrl.cc +++ b/src/mem/dram_ctrl.cc @@ -96,6 +96,14 @@ DRAMCtrl::DRAMCtrl(const DRAMCtrlParams* p) : actTicks[c].resize(activationLimit, 0); } + // set the bank indices + for (int r = 0; r < ranksPerChannel; r++) { + for (int b = 0; b < banksPerRank; b++) { + banks[r][b].rank = r; + banks[r][b].bank = b; + } + } + // perform a basic check of the write thresholds if (p->write_low_thresh_perc >= p->write_high_thresh_perc) fatal("Write buffer low threshold %d must be smaller than the " @@ -752,23 +760,24 @@ DRAMCtrl::accessAndRespond(PacketPtr pkt, Tick static_latency) } void -DRAMCtrl::activateBank(Tick act_tick, uint8_t rank, uint8_t bank, - uint32_t row, Bank& bank_ref) +DRAMCtrl::activateBank(Bank& bank, Tick act_tick, uint32_t row) { - assert(0 <= rank && rank < ranksPerChannel); + // get the rank index from the bank + uint8_t rank = bank.rank; + assert(actTicks[rank].size() == activationLimit); DPRINTF(DRAM, "Activate at tick %d\n", act_tick); // update the open row - assert(bank_ref.openRow == Bank::NO_ROW); - bank_ref.openRow = row; + assert(bank.openRow == Bank::NO_ROW); + bank.openRow = row; // start counting anew, this covers both the case when we // auto-precharged, and when this access is forced to // precharge - bank_ref.bytesAccessed = 0; - bank_ref.rowAccesses = 0; + bank.bytesAccessed = 0; + bank.rowAccesses = 0; ++numBanksActive; assert(numBanksActive <= banksPerRank * ranksPerChannel); @@ -777,10 +786,10 @@ DRAMCtrl::activateBank(Tick act_tick, uint8_t rank, uint8_t bank, act_tick, numBanksActive); // The next access has to respect tRAS for this bank - bank_ref.preAllowedAt = act_tick + tRAS; + bank.preAllowedAt = act_tick + tRAS; // Respect the row-to-column command delay - bank_ref.colAllowedAt = act_tick + tRCD; + bank.colAllowedAt = act_tick + tRCD; // start by enforcing tRRD for(int i = 0; i < banksPerRank; i++) { @@ -922,8 +931,7 @@ DRAMCtrl::doDRAMAccess(DRAMPacket* dram_pkt) // Record the activation and deal with all the global timing // constraints caused be a new activation (tRRD and tXAW) - activateBank(act_tick, dram_pkt->rank, dram_pkt->bank, - dram_pkt->row, bank); + activateBank(bank, act_tick, dram_pkt->row); // issue the command as early as possible cmd_at = bank.colAllowedAt; diff --git a/src/mem/dram_ctrl.hh b/src/mem/dram_ctrl.hh index c8104a49d..aee2635b4 100644 --- a/src/mem/dram_ctrl.hh +++ b/src/mem/dram_ctrl.hh @@ -154,6 +154,8 @@ class DRAMCtrl : public AbstractMemory static const uint32_t NO_ROW = -1; uint32_t openRow; + uint8_t rank; + uint8_t bank; Tick colAllowedAt; Tick preAllowedAt; @@ -163,7 +165,8 @@ class DRAMCtrl : public AbstractMemory uint32_t bytesAccessed; Bank() : - openRow(NO_ROW), colAllowedAt(0), preAllowedAt(0), actAllowedAt(0), + openRow(NO_ROW), rank(0), bank(0), + colAllowedAt(0), preAllowedAt(0), actAllowedAt(0), rowAccesses(0), bytesAccessed(0) { } }; @@ -387,14 +390,11 @@ class DRAMCtrl : public AbstractMemory * method updates the time that the banks become available based * on the current limits. * + * @param bank Reference to the bank * @param act_tick Time when the activation takes place - * @param rank Index of the rank - * @param bank Index of the bank * @param row Index of the row - * @param bank_ref Reference to the bank */ - void activateBank(Tick act_tick, uint8_t rank, uint8_t bank, - uint32_t row, Bank& bank_ref); + void activateBank(Bank& bank, Tick act_tick, uint32_t row); /** * Precharge a given bank and also update when the precharge is -- cgit v1.2.3