DRAMCtrl.py revision 9566
1# Copyright (c) 2012 ARM Limited 2# All rights reserved. 3# 4# The license below extends only to copyright in the software and shall 5# not be construed as granting a license to any other intellectual 6# property including but not limited to intellectual property relating 7# to a hardware implementation of the functionality of the software 8# licensed hereunder. You may use the software subject to the license 9# terms below provided that you ensure that this notice is replicated 10# unmodified and in its entirety in all distributions of the software, 11# modified or unmodified, in source code or in binary form. 12# 13# Redistribution and use in source and binary forms, with or without 14# modification, are permitted provided that the following conditions are 15# met: redistributions of source code must retain the above copyright 16# notice, this list of conditions and the following disclaimer; 17# redistributions in binary form must reproduce the above copyright 18# notice, this list of conditions and the following disclaimer in the 19# documentation and/or other materials provided with the distribution; 20# neither the name of the copyright holders nor the names of its 21# contributors may be used to endorse or promote products derived from 22# this software without specific prior written permission. 23# 24# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 25# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 26# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 27# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 28# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 29# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 30# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 31# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 32# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 33# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 34# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35# 36# Authors: Andreas Hansson 37# Ani Udipi 38 39from m5.params import * 40from AbstractMemory import * 41 42# Enum for memory scheduling algorithms, currently First-Come 43# First-Served and a First-Row Hit then First-Come First-Served 44class MemSched(Enum): vals = ['fcfs', 'frfcfs'] 45 46# Enum for the address mapping, currently corresponding to either 47# optimising for sequential accesses hitting in the open row, or 48# striping across banks. 49class AddrMap(Enum): vals = ['openmap', 'closemap'] 50 51# Enum for the page policy, either open or close. 52class PageManage(Enum): vals = ['open', 'close'] 53 54# SimpleDRAM is a single-channel single-ported DRAM controller model 55# that aims to model the most important system-level performance 56# effects of a DRAM without getting into too much detail of the DRAM 57# itself. 58class SimpleDRAM(AbstractMemory): 59 type = 'SimpleDRAM' 60 cxx_header = "mem/simple_dram.hh" 61 62 # single-ported on the system interface side, instantiate with a 63 # bus in front of the controller for multiple ports 64 port = SlavePort("Slave port") 65 66 # the basic configuration of the controller architecture 67 write_buffer_size = Param.Unsigned(32, "Number of read queue entries") 68 read_buffer_size = Param.Unsigned(32, "Number of write queue entries") 69 70 # threshold in percent for when to trigger writes and start 71 # emptying the write buffer as it starts to get full 72 write_thresh_perc = Param.Percent(70, "Threshold to trigger writes") 73 74 # scheduler, address map and page policy 75 mem_sched_policy = Param.MemSched('frfcfs', "Memory scheduling policy") 76 addr_mapping = Param.AddrMap('openmap', "Address mapping policy") 77 page_policy = Param.PageManage('open', "Page closure management policy") 78 79 # the physical organisation of the DRAM 80 lines_per_rowbuffer = Param.Unsigned("Row buffer size in cache lines") 81 ranks_per_channel = Param.Unsigned("Number of ranks per channel") 82 banks_per_rank = Param.Unsigned("Number of banks per rank") 83 # only used for the address mapping as the controller by 84 # construction is a single channel and multiple controllers have 85 # to be instantiated for a multi-channel configuration 86 channels = Param.Unsigned(1, "Number of channels") 87 88 # timing behaviour and constraints - all in nanoseconds 89 90 # the amount of time in nanoseconds from issuing an activate command 91 # to the data being available in the row buffer for a read/write 92 tRCD = Param.Latency("RAS to CAS delay") 93 94 # the time from issuing a read/write command to seeing the actual data 95 tCL = Param.Latency("CAS latency") 96 97 # minimum time between a precharge and subsequent activate 98 tRP = Param.Latency("Row precharge time") 99 100 # time to complete a burst transfer, typically the burst length 101 # divided by two due to the DDR bus, but by making it a parameter 102 # it is easier to also evaluate SDR memories like WideIO. 103 # This parameter has to account for bus width and burst length. 104 # Adjustment also necessary if cache line size is greater than 105 # data size read/written by one full burst. 106 tBURST = Param.Latency("Burst duration (for DDR burst length / 2 cycles)") 107 108 # time taken to complete one refresh cycle (N rows in all banks) 109 tRFC = Param.Latency("Refresh cycle time") 110 111 # refresh command interval, how often a "ref" command needs 112 # to be sent. It is 7.8 us for a 64ms refresh requirement 113 tREFI = Param.Latency("Refresh command interval") 114 115 # write-to-read turn around penalty, assumed same as read-to-write 116 tWTR = Param.Latency("Write to read switching time") 117 118 # time window in which a maximum number of activates are allowed 119 # to take place, set to 0 to disable 120 tXAW = Param.Latency("X activation window") 121 activation_limit = Param.Unsigned("Max number of activates in window") 122 123 # Currently rolled into other params 124 ###################################################################### 125 126 # the minimum amount of time between a row being activated, and 127 # precharged (de-activated) 128 # tRAS - assumed to be 3 * tRP 129 130 # tRC - assumed to be 4 * tRP 131 132 # burst length for an access derived from peerBlockSize 133 134# High-level model of a single DDR3 x64 interface (one command and 135# address bus), with default timings based on a DDR3-1600 4 Gbit part, 136# which would amount to 4 Gbyte of memory in 8x8 or 8 GByte in 16x4 137# configuration. 138class SimpleDDR3(SimpleDRAM): 139 # Assuming 64 byte cache lines, use a 2kbyte page size, this 140 # depends on the memory density 141 lines_per_rowbuffer = 32 142 143 # Use two ranks 144 ranks_per_channel = 2 145 146 # DDR3 has 8 banks in all configurations 147 banks_per_rank = 8 148 149 # DDR3-1600 11-11-11 150 tRCD = '13.75ns' 151 tCL = '13.75ns' 152 tRP = '13.75ns' 153 154 # Assuming 64 byte cache lines, across an x64 (8x8 or 16x4) 155 # interface, translates to BL8, 4 clocks @ 800 MHz 156 tBURST = '5ns' 157 158 # DDR3, 4 Gb has a tRFC of 240 CK and tCK = 1.25 ns 159 tRFC = '300ns' 160 161 # DDR3, <=85C, half for >85C 162 tREFI = '7.8us' 163 164 # Greater of 4 CK or 7.5 ns, 4 CK @ 800 MHz = 5 ns 165 tWTR = '7.5ns' 166 167 # With a 2kbyte page size, DDR3-1600 lands around 40 ns 168 tXAW = '40ns' 169 activation_limit = 4 170 171 172# High-level model of a single LPDDR2-S4 x64 interface (one 173# command/address bus), with default timings based on a LPDDR2-1066 174# 4Gbit part, which whould amount to 1 GByte of memory in 2x32 or 175# 2GByte in 4x16 configuration. 176class SimpleLPDDR2_S4(SimpleDRAM): 177 # Assuming 64 byte cache lines, use a 2kbyte page size, this 178 # depends on the memory density 179 lines_per_rowbuffer = 32 180 181 # Use two ranks 182 ranks_per_channel = 2 183 184 # LPDDR2-S4 has 8 banks in all configurations 185 banks_per_rank = 8 186 187 # Fixed at 15 ns 188 tRCD = '15ns' 189 190 # 8 CK read latency, 4 CK write latency @ 533 MHz, 1.876 ns cycle time 191 tCL = '15ns' 192 193 # Pre-charge one bank 15 ns and all banks 18 ns 194 tRP = '18ns' 195 196 # Assuming 64 byte cache lines, across a x64 interface (2x32 or 197 # 4x16), translates to BL8, 4 clocks @ 533 MHz 198 tBURST = '7.5ns' 199 200 # LPDDR2-S4, 4 Gb 201 tRFC = '130ns' 202 tREFI = '3.9us' 203 204 # Irrespective of speed grade, tWTR is 7.5 ns 205 tWTR = '7.5ns' 206 207 # Irrespective of size, tFAW is 50 ns 208 tXAW = '50ns' 209 activation_limit = 4 210