HMC.py revision 11292:5d1d5bf9c178
1# Copyright (c) 2012-2013 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# Copyright (c) 2015 The University of Bologna 14# All rights reserved. 15# 16# Redistribution and use in source and binary forms, with or without 17# modification, are permitted provided that the following conditions are 18# met: redistributions of source code must retain the above copyright 19# notice, this list of conditions and the following disclaimer; 20# redistributions in binary form must reproduce the above copyright 21# notice, this list of conditions and the following disclaimer in the 22# documentation and/or other materials provided with the distribution; 23# neither the name of the copyright holders nor the names of its 24# contributors may be used to endorse or promote products derived from 25# this software without specific prior written permission. 26# 27# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 28# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 29# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 30# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 31# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 32# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 33# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 34# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 35# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 36# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 37# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 38# 39# Authors: Erfan Azarkhish 40 41# A Simplified model of a complete HMC device. Based on: 42# [1] http://www.hybridmemorycube.org/specification-download/ 43# [2] High performance AXI-4.0 based interconnect for extensible smart memory 44# cubes(E. Azarkhish et. al) 45# [3] Low-Power Hybrid Memory Cubes With Link Power Management and Two-Level 46# Prefetching (J. Ahn et. al) 47# [4] Memory-centric system interconnect design with Hybrid Memory Cubes 48# (G. Kim et. al) 49# [5] Near Data Processing, Are we there yet? (M. Gokhale) 50# http://www.cs.utah.edu/wondp/gokhale.pdf 51# 52# This script builds a complete HMC device composed of vault controllers, 53# serial links, the main internal crossbar, and an external hmc controller. 54# 55# - VAULT CONTROLLERS: 56# Instances of the HMC_2500_x32 class with their functionality specified in 57# dram_ctrl.cc 58# 59# - THE MAIN XBAR: 60# This component is simply an instance of the NoncoherentXBar class, and its 61# parameters are tuned to [2]. 62# 63# - SERIAL LINKS: 64# SerialLink is a simple variation of the Bridge class, with the ability to 65# account for the latency of packet serialization. We assume that the 66# serializer component at the transmitter side does not need to receive the 67# whole packet to start the serialization. But the deserializer waits for 68# the complete packet to check its integrity first. 69# * Bandwidth of the serial links is not modeled in the SerialLink component 70# itself. Instead bandwidth/port of the HMCController has been adjusted to 71# reflect the bandwidth delivered by 1 serial link. 72# 73# - HMC CONTROLLER: 74# Contains a large buffer (modeled with Bridge) to hide the access latency 75# of the memory cube. Plus it simply forwards the packets to the serial 76# links in a round-robin fashion to balance load among them. 77# * It is inferred from the standard [1] and the literature [3] that serial 78# links share the same address range and packets can travel over any of 79# them so a load distribution mechanism is required among them. 80 81import optparse 82 83import m5 84from m5.objects import * 85 86# A single Hybrid Memory Cube (HMC) 87class HMCSystem(SubSystem): 88 #*****************************CROSSBAR PARAMETERS************************* 89 # Flit size of the main interconnect [1] 90 xbar_width = Param.Unsigned(32, "Data width of the main XBar (Bytes)") 91 92 # Clock frequency of the main interconnect [1] 93 # This crossbar, is placed on the logic-based of the HMC and it has its 94 # own voltage and clock domains, different from the DRAM dies or from the 95 # host. 96 xbar_frequency = Param.Frequency('1GHz', "Clock Frequency of the main " 97 "XBar") 98 99 # Arbitration latency of the HMC XBar [1] 100 xbar_frontend_latency = Param.Cycles(1, "Arbitration latency of the XBar") 101 102 # Latency to forward a packet via the interconnect [1](two levels of FIFOs 103 # at the input and output of the inteconnect) 104 xbar_forward_latency = Param.Cycles(2, "Forward latency of the XBar") 105 106 # Latency to forward a response via the interconnect [1](two levels of 107 # FIFOs at the input and output of the inteconnect) 108 xbar_response_latency = Param.Cycles(2, "Response latency of the XBar") 109 110 #*****************************SERIAL LINK PARAMETERS********************** 111 # Number of serial links [1] 112 num_serial_links = Param.Unsigned(4, "Number of serial links") 113 114 # Number of packets (not flits) to store at the request side of the serial 115 # link. This number should be adjusted to achive required bandwidth 116 link_buffer_size_req = Param.Unsigned(16, "Number of packets to buffer " 117 "at the request side of the serial link") 118 119 # Number of packets (not flits) to store at the response side of the serial 120 # link. This number should be adjusted to achive required bandwidth 121 link_buffer_size_rsp = Param.Unsigned(16, "Number of packets to buffer " 122 "at the response side of the serial link") 123 124 # Latency of the serial link composed by SER/DES latency (1.6ns [4]) plus 125 # the PCB trace latency (3ns Estimated based on [5]) 126 link_latency = Param.Latency('4.6ns', "Latency of the serial links") 127 128 # Header overhead of the serial links: Header size is 128bits in HMC [1], 129 # and we have 16 lanes, so the overhead is 8 cycles 130 link_overhead = Param.Cycles(8, "The number of cycles required to" 131 " transmit the packet header over the serial link") 132 133 # Clock frequency of the serial links [1] 134 link_frequency = Param.Frequency('10GHz', "Clock Frequency of the serial" 135 "links") 136 137 # Number of parallel lanes in each serial link [1] 138 num_lanes_per_link = Param.Unsigned(16, "Number of lanes per each link") 139 140 # Number of serial links [1] 141 num_serial_links = Param.Unsigned(4, "Number of serial links") 142 143 #*****************************HMC CONTROLLER PARAMETERS******************* 144 # Number of packets (not flits) to store at the HMC controller. This 145 # number should be high enough to be able to hide the high latency of HMC 146 ctrl_buffer_size_req = Param.Unsigned(256, "Number of packets to buffer " 147 "at the HMC controller (request side)") 148 149 # Number of packets (not flits) to store at the response side of the HMC 150 # controller. 151 ctrl_buffer_size_rsp = Param.Unsigned(256, "Number of packets to buffer " 152 "at the HMC controller (response side)") 153 154 # Latency of the HMC controller to process the packets 155 # (ClockDomain = Host clock domain) 156 ctrl_latency = Param.Cycles(4, "The number of cycles required for the " 157 " controller to process the packet") 158 159 # Wiring latency from the SoC crossbar to the HMC controller 160 ctrl_static_latency = Param.Latency('500ps', "Static latency of the HMC" 161 "controller") 162 163 #*****************************PERFORMANCE MONITORING********************** 164 # The main monitor behind the HMC Controller 165 enable_global_monitor = Param.Bool(True, "The main monitor behind the " 166 "HMC Controller") 167 168 # The link performance monitors 169 enable_link_monitor = Param.Bool(True, "The link monitors") 170 171# Create an HMC device and attach it to the current system 172def config_hmc(options, system): 173 174 system.hmc = HMCSystem() 175 176 system.buffer = Bridge(ranges=system.mem_ranges, 177 req_size=system.hmc.ctrl_buffer_size_req, 178 resp_size=system.hmc.ctrl_buffer_size_rsp, 179 delay=system.hmc.ctrl_static_latency) 180 try: 181 system.hmc.enable_global_monitor = options.enable_global_monitor 182 except: 183 pass; 184 185 try: 186 system.hmc.enable_link_monitor = options.enable_link_monitor 187 except: 188 pass; 189 190 system.membus.master = system.buffer.slave 191 192 # The HMC controller (Clock domain is the same as the host) 193 system.hmccontroller = HMCController(width=(system.hmc.num_lanes_per_link. 194 value * system.hmc.num_serial_links/8), 195 frontend_latency=system.hmc.ctrl_latency, 196 forward_latency=system.hmc.link_overhead, 197 response_latency=system.hmc.link_overhead) 198 199 system.hmccontroller.clk_domain = SrcClockDomain(clock=system.hmc. 200 link_frequency, voltage_domain = VoltageDomain(voltage = '1V')) 201 202 # Serial Links 203 system.hmc.seriallink =[ SerialLink(ranges = system.mem_ranges, 204 req_size=system.hmc.link_buffer_size_req, 205 resp_size=system.hmc.link_buffer_size_rsp, 206 num_lanes=system.hmc.num_lanes_per_link, 207 delay=system.hmc.link_latency) 208 for i in xrange(system.hmc.num_serial_links)] 209 210 if system.hmc.enable_link_monitor: 211 system.hmc.lmonitor = [ CommMonitor() 212 for i in xrange(system.hmc.num_serial_links)] 213 214 # The HMC Crossbar located in its logic-base (LoB) 215 system.hmc.xbar = NoncoherentXBar(width = system.hmc.xbar_width, 216 frontend_latency=system.hmc.xbar_frontend_latency, 217 forward_latency=system.hmc.xbar_forward_latency, 218 response_latency=system.hmc.xbar_response_latency ) 219 system.hmc.xbar.clk_domain = SrcClockDomain(clock = 220 system.hmc.xbar_frequency, voltage_domain = 221 VoltageDomain(voltage = '1V')) 222 223 if system.hmc.enable_global_monitor: 224 system.gmonitor = CommMonitor() 225 system.buffer.master = system.gmonitor.slave 226 system.gmonitor.master = system.hmccontroller.slave 227 else: 228 system.hmccontroller.slave = system.buffer.master 229 230 for i in xrange(system.hmc.num_serial_links): 231 system.hmccontroller.master = system.hmc.seriallink[i].slave 232 system.hmc.seriallink[i].clk_domain = system.hmccontroller.clk_domain; 233 if system.hmc.enable_link_monitor: 234 system.hmc.seriallink[i].master = system.hmc.lmonitor[i].slave 235 system.hmc.lmonitor[i].master = system.hmc.xbar.slave 236 else: 237 system.hmc.seriallink[i].master = system.hmc.xbar.slave 238