diff options
-rw-r--r-- | configs/common/MemConfig.py | 12 | ||||
-rw-r--r-- | configs/common/Options.py | 2 | ||||
-rw-r--r-- | src/mem/dram_ctrl.cc | 5 |
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); |