# First-Served and a First-Row Hit then First-Come First-Served
class MemSched(Enum): vals = ['fcfs', 'frfcfs']
-# Enum for the address mapping, currently corresponding to either
+# Enum for the address mapping. With Ra, Co, Ba and Ch denoting rank,
+# column, bank and channel, respectively, and going from MSB to LSB,
+# the two schemes available are RaBaChCo and CoRaBaCh, either
# optimising for sequential accesses hitting in the open row, or
-# striping across banks.
-class AddrMap(Enum): vals = ['openmap', 'closemap']
+# maximising parallelism.
+class AddrMap(Enum): vals = ['RaBaChCo', 'CoRaBaCh']
# Enum for the page policy, either open or close.
class PageManage(Enum): vals = ['open', 'close']
# scheduler, address map and page policy
mem_sched_policy = Param.MemSched('frfcfs', "Memory scheduling policy")
- addr_mapping = Param.AddrMap('openmap', "Address mapping policy")
+ addr_mapping = Param.AddrMap('RaBaChCo', "Address mapping policy")
page_policy = Param.PageManage('open', "Page closure management policy")
# the physical organisation of the DRAM
panic("%s has %d interleaved address stripes but %d channel(s)\n",
name(), range.stripes(), channels);
- if (addrMapping == Enums::openmap) {
+ if (addrMapping == Enums::RaBaChCo) {
if (bytesPerCacheLine * linesPerRowBuffer !=
range.granularity()) {
- panic("Interleaving of %s doesn't match open address map\n",
+ panic("Interleaving of %s doesn't match RaBaChCo address map\n",
name());
}
- } else if (addrMapping == Enums::closemap) {
+ } else if (addrMapping == Enums::CoRaBaCh) {
if (bytesPerCacheLine != range.granularity())
- panic("Interleaving of %s doesn't match closed address map\n",
+ panic("Interleaving of %s doesn't match CoRaBaCh address map\n",
name());
}
}
{
// decode the address based on the address mapping scheme
//
- // with R, C, B and K denoting rank, column, bank and rank,
+ // with Ra, Co, Ba and Ch denoting rank, column, bank and channel,
// respectively, and going from MSB to LSB, the two schemes are
- // RKBC (openmap) and RCKB (closedmap)
+ // RaBaChCo and CoRaBaCh
uint8_t rank;
uint16_t bank;
uint16_t row;
// 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) {
+ if (addrMapping == Enums::RaBaChCo) {
// the lowest order bits denote the column to ensure that
// sequential cache lines occupy the same row
addr = addr / linesPerRowBuffer;
// controllers in the address mapping
addr = addr / channels;
- // after the column bits, we get the bank bits to interleave
+ // after the channel bits, we get the bank bits to interleave
// over the banks
bank = addr % banksPerRank;
addr = addr / banksPerRank;
// lastly, get the row bits
row = addr % rowsPerBank;
addr = addr / rowsPerBank;
- } else if (addrMapping == Enums::closemap) {
+ } else if (addrMapping == Enums::CoRaBaCh) {
// optimise for closed page mode and utilise maximum
// parallelism of the DRAM (at the cost of power)
linesPerRowBuffer * rowsPerBank * banksPerRank * ranksPerChannel);
string scheduler = memSchedPolicy == Enums::fcfs ? "FCFS" : "FR-FCFS";
- string address_mapping = addrMapping == Enums::openmap ? "OPENMAP" :
- "CLOSEMAP";
+ string address_mapping = addrMapping == Enums::RaBaChCo ? "RaBaChCo" :
+ "CoRaBaCh";
string page_policy = pageMgmt == Enums::open ? "OPEN" : "CLOSE";
DPRINTF(DRAM,