# minimum time between a write data transfer and a precharge
tWR = Param.Latency("Write recovery time")
+ # minimum time between a read and precharge command
+ tRTP = Param.Latency("Read to precharge")
+
# time to complete a burst transfer, typically the burst length
# divided by two due to the DDR bus, but by making it a parameter
# it is easier to also evaluate SDR memories like WideIO.
tRP = '13.75ns'
tRAS = '35ns'
tWR = '15ns'
+ tRTP = '7.5ns'
# 8 beats across an x64 interface translates to 4 clocks @ 800 MHz.
# Note this is a BL8 DDR device.
tRP = '15ns'
tRAS = '36ns'
tWR = '15ns'
+ tRTP = '7.5ns'
# 8 beats across an x64 interface translates to 4 clocks @ 666.66 MHz.
# Note this is a BL8 DDR device.
tRAS = '42ns'
tWR = '15ns'
+ # 6 CK read to precharge delay
+ tRTP = '11.256ns'
+
# 8 beats across an x32 DDR interface translates to 4 clocks @ 533 MHz.
# Note this is a BL8 DDR device.
# Requests larger than 32 bytes are broken down into multiple requests
tRP = '18ns'
tRAS = '42ns'
tWR = '15ns'
+ # Read to precharge is same as the burst
+ tRTP = '20ns'
# 4 beats across an x128 SDR interface translates to 4 clocks @ 200 MHz.
# Note this is a BL4 SDR device.
tRAS = '42ns'
tWR = '15ns'
+ # Greater of 4 CK or 7.5 ns, 4 CK @ 800 MHz = 5 ns
+ tRTP = '7.5ns'
+
# Pre-charge one bank 15 ns (all banks 18 ns)
tRP = '15ns'
writesThisTime(0), readsThisTime(0),
tWTR(p->tWTR), tRTW(p->tRTW), tBURST(p->tBURST),
tRCD(p->tRCD), tCL(p->tCL), tRP(p->tRP), tRAS(p->tRAS), tWR(p->tWR),
- tRFC(p->tRFC), tREFI(p->tREFI), tRRD(p->tRRD),
+ tRTP(p->tRTP), tRFC(p->tRFC), tREFI(p->tREFI), tRRD(p->tRRD),
tXAW(p->tXAW), activationLimit(p->activation_limit),
memSchedPolicy(p->mem_sched_policy), addrMapping(p->addr_mapping),
pageMgmt(p->page_policy),
"tWTR %d ticks\n" \
"tRTW %d ticks\n" \
"tWR %d ticks\n" \
+ "tRTP %d ticks\n" \
"tXAW (%d) %d ticks\n",
name(), tRCD, tCL, tRP, tBURST, tRFC, tREFI, tWTR,
- tRTW, tWR, activationLimit, tXAW);
+ tRTW, tWR, tRTP, activationLimit, tXAW);
}
void
// read/write (add a max with tCCD here)
bank.colAllowedAt = cmd_at + tBURST;
- // If this is a write, we also need to respect the write
- // recovery time before a precharge
- if (!dram_pkt->isRead) {
- bank.preAllowedAt = std::max(bank.preAllowedAt,
- dram_pkt->readyTime + tWR);
- }
+ // If this is a write, we also need to respect the write recovery
+ // time before a precharge, in the case of a read, respect the
+ // read to precharge constraint
+ bank.preAllowedAt = std::max(bank.preAllowedAt,
+ dram_pkt->isRead ? cmd_at + tRTP :
+ dram_pkt->readyTime + tWR);
// increment the bytes accessed and the accesses per row
bank.bytesAccessed += burstSize;