summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Hansson <andreas.hansson@arm.com>2014-12-23 09:31:18 -0500
committerAndreas Hansson <andreas.hansson@arm.com>2014-12-23 09:31:18 -0500
commit59460b91f35efe24a99424c0018d2f9c002e50c8 (patch)
tree3371fdc57dd5a032ff4b5fa4b4d51b796b8e71cd
parent2f7baf9dbe7fd2cd716885adacf508a5b89e9eb8 (diff)
downloadgem5-59460b91f35efe24a99424c0018d2f9c002e50c8.tar.xz
config: Expose the DRAM ranks as a command-line option
This patch gives the user direct influence over the number of DRAM ranks to make it easier to tune the memory density without affecting the bandwidth (previously the only means of scaling the device count was through the number of channels). The patch also adds some basic sanity checks to ensure that the number of ranks is a power of two (since we rely on bit slices in the address decoding).
-rw-r--r--configs/common/MemConfig.py12
-rw-r--r--configs/common/Options.py2
-rw-r--r--src/mem/dram_ctrl.cc5
3 files changed, 16 insertions, 3 deletions
diff --git a/configs/common/MemConfig.py b/configs/common/MemConfig.py
index 57066426f..4692c2d0e 100644
--- a/configs/common/MemConfig.py
+++ b/configs/common/MemConfig.py
@@ -197,9 +197,15 @@ def config_mem(options, system):
# address mapping in the case of a DRAM
for r in system.mem_ranges:
for i in xrange(nbr_mem_ctrls):
- mem_ctrls.append(create_mem_ctrl(cls, r, i, nbr_mem_ctrls,
- intlv_bits,
- system.cache_line_size.value))
+ mem_ctrl = create_mem_ctrl(cls, r, i, nbr_mem_ctrls, intlv_bits,
+ system.cache_line_size.value)
+ # Set the number of ranks based on the command-line
+ # options if it was explicitly set
+ if issubclass(cls, m5.objects.DRAMCtrl) and \
+ options.mem_ranks:
+ mem_ctrl.ranks_per_channel = options.mem_ranks
+
+ mem_ctrls.append(mem_ctrl)
system.mem_ctrls = mem_ctrls
diff --git a/configs/common/Options.py b/configs/common/Options.py
index f81e69a61..ea3de8691 100644
--- a/configs/common/Options.py
+++ b/configs/common/Options.py
@@ -90,6 +90,8 @@ def addCommonOptions(parser):
help = "type of memory to use")
parser.add_option("--mem-channels", type="int", default=1,
help = "number of memory channels")
+ parser.add_option("--mem-ranks", type="int", default=None,
+ help = "number of memory ranks per channel")
parser.add_option("--mem-size", action="store", type="string",
default="512MB",
help="Specify the physical memory size (single memory)")
diff --git a/src/mem/dram_ctrl.cc b/src/mem/dram_ctrl.cc
index 42abc63a8..44ac3d512 100644
--- a/src/mem/dram_ctrl.cc
+++ b/src/mem/dram_ctrl.cc
@@ -92,6 +92,11 @@ DRAMCtrl::DRAMCtrl(const DRAMCtrlParams* p) :
busBusyUntil(0), prevArrival(0),
nextReqTime(0), activeRank(0), timeStampOffset(0)
{
+ // sanity check the ranks since we rely on bit slicing for the
+ // address decoding
+ fatal_if(!isPowerOf2(ranksPerChannel), "DRAM rank count of %d is not "
+ "allowed, must be a power of two\n", ranksPerChannel);
+
for (int i = 0; i < ranksPerChannel; i++) {
Rank* rank = new Rank(*this, p);
ranks.push_back(rank);