mem: Add comments for the DRAM address decoding
authorAndreas Hansson <andreas.hansson@arm.com>
Thu, 31 Jan 2013 12:49:18 +0000 (07:49 -0500)
committerAndreas Hansson <andreas.hansson@arm.com>
Thu, 31 Jan 2013 12:49:18 +0000 (07:49 -0500)
This patch adds more verbose comments to explain the two different
address mapping schemes of the DRAM controller.

src/mem/simple_dram.cc

index 6885e48c03aa2a7387f49bd642dd04ad19336a8e..32a13eef01e0eef75f490e6c1415f7205604e209 100644 (file)
@@ -166,6 +166,11 @@ SimpleDRAM::writeQueueFull() const
 SimpleDRAM::DRAMPacket*
 SimpleDRAM::decodeAddr(PacketPtr pkt)
 {
+    // decode the address based on the address mapping scheme
+    //
+    // with R, C, B and K denoting rank, column, bank and rank,
+    // respectively, and going from MSB to LSB, the two schemes are
+    // RKBC (openmap) and RCKB (closedmap)
     uint8_t rank;
     uint16_t bank;
     uint16_t row;
@@ -176,26 +181,46 @@ SimpleDRAM::decodeAddr(PacketPtr pkt)
     // truncate the address to the access granularity
     addr = addr / bytesPerCacheLine;
 
+    // we have removed the lowest order address bits that denote the
+    // position within the cache line, proceed and select the
+    // appropriate bits for bank, rank and row (no column address is
+    // needed)
     if (addrMapping == Enums::openmap) {
+        // the lowest order bits denote the column to ensure that
+        // sequential cache lines occupy the same row
         addr = addr / linesPerRowBuffer;
 
+        // after the column bits, we get the bank bits to interleave
+        // over the banks
         bank = addr % banksPerRank;
         addr = addr / banksPerRank;
 
+        // after the bank, we get the rank bits which thus interleaves
+        // over the ranks
         rank = addr % ranksPerChannel;
         addr = addr / ranksPerChannel;
 
+        // lastly, get the row bits
         row = addr % rowsPerBank;
         addr = addr / rowsPerBank;
     } else if (addrMapping == Enums::closemap) {
+        // optimise for closed page mode and utilise maximum
+        // parallelism of the DRAM (at the cost of power)
+
+        // start with the bank bits, as this provides the maximum
+        // opportunity for parallelism between requests
         bank = addr % banksPerRank;
         addr = addr / banksPerRank;
 
+        // next get the rank bits
         rank = addr % ranksPerChannel;
         addr = addr / ranksPerChannel;
 
+        // next the column bits which we do not need to keep track of
+        // and simply skip past
         addr = addr / linesPerRowBuffer;
 
+        // lastly, get the row bits
         row = addr % rowsPerBank;
         addr = addr / rowsPerBank;
     } else