Dear Nilay and Andreas,

There is a typo in this changeset which is causing an error:

*SimOject *==> must  be *SimObject*

Also, I guess you have agreed on changing *Subsystem *to *Simobject*, is it
correct?

Thanks,


On Tue, Nov 3, 2015 at 10:12 PM, Erfan Azarkhish <erfan.azarkh...@unibo.it>
wrote:

> changeset 276ad9121192 in /z/repo/gem5
> details: http://repo.gem5.org/gem5?cmd=changeset;node=276ad9121192
> description:
>         mem: hmc: top level design
>
>         This patch enables modeling a complete Hybrid Memory Cube (HMC)
> device. It
>         highly reuses the existing components in gem5's general memory
> system with some
>         small modifications. This changeset requires additional patches to
> model a
>         complete HMC device.
>
>         Committed by: Nilay Vaish <ni...@cs.wisc.edu>
>
> diffstat:
>
>  configs/common/HMC.py       |  238
> ++++++++++++++++++++++++++++++++++++++++++++
>  configs/common/MemConfig.py |   21 ++-
>  configs/example/fs.py       |    1 +
>  3 files changed, 254 insertions(+), 6 deletions(-)
>
> diffs (truncated from 306 to 300 lines):
>
> diff -r fa8b2a99d4fe -r 276ad9121192 configs/common/HMC.py
> --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
> +++ b/configs/common/HMC.py     Tue Nov 03 12:17:56 2015 -0600
> @@ -0,0 +1,238 @@
> +# Copyright (c) 2012-2013 ARM Limited
> +# All rights reserved.
> +#
> +# The license below extends only to copyright in the software and shall
> +# not be construed as granting a license to any other intellectual
> +# property including but not limited to intellectual property relating
> +# to a hardware implementation of the functionality of the software
> +# licensed hereunder.  You may use the software subject to the license
> +# terms below provided that you ensure that this notice is replicated
> +# unmodified and in its entirety in all distributions of the software,
> +# modified or unmodified, in source code or in binary form.
> +#
> +# Copyright (c) 2015 The University of Bologna
> +# All rights reserved.
> +#
> +# Redistribution and use in source and binary forms, with or without
> +# modification, are permitted provided that the following conditions are
> +# met: redistributions of source code must retain the above copyright
> +# notice, this list of conditions and the following disclaimer;
> +# redistributions in binary form must reproduce the above copyright
> +# notice, this list of conditions and the following disclaimer in the
> +# documentation and/or other materials provided with the distribution;
> +# neither the name of the copyright holders nor the names of its
> +# contributors may be used to endorse or promote products derived from
> +# this software without specific prior written permission.
> +#
> +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +#
> +# Authors: Erfan Azarkhish
> +
> +# A Simplified model of a complete HMC device. Based on:
> +#  [1] http://www.hybridmemorycube.org/specification-download/
> +#  [2] High performance AXI-4.0 based interconnect for extensible smart
> memory
> +#      cubes(E. Azarkhish et. al)
> +#  [3] Low-Power Hybrid Memory Cubes With Link Power Management and
> Two-Level
> +#      Prefetching (J. Ahn et. al)
> +#  [4] Memory-centric system interconnect design with Hybrid Memory Cubes
> +#      (G. Kim et. al)
> +#  [5] Near Data Processing, Are we there yet? (M. Gokhale)
> +#      http://www.cs.utah.edu/wondp/gokhale.pdf
> +#
> +# This script builds a complete HMC device composed of vault controllers,
> +# serial links, the main internal crossbar, and an external hmc
> controller.
> +#
> +# - VAULT CONTROLLERS:
> +#   Instances of the HMC_2500_x32 class with their functionality
> specified in
> +#   dram_ctrl.cc
> +#
> +# - THE MAIN XBAR:
> +#   This component is simply an instance of the NoncoherentXBar class,
> and its
> +#   parameters are tuned to [2].
> +#
> +# - SERIAL LINKS:
> +#   SerialLink is a simple variation of the Bridge class, with the
> ability to
> +#   account for the latency of packet serialization. We assume that the
> +#   serializer component at the transmitter side does not need to receive
> the
> +#   whole packet to start the serialization. But the deserializer waits
> for
> +#   the complete packet to check its integrity first.
> +#   * Bandwidth of the serial links is not modeled in the SerialLink
> component
> +#     itself. Instead bandwidth/port of the HMCController has been
> adjusted to
> +#     reflect the bandwidth delivered by 1 serial link.
> +#
> +# - HMC CONTROLLER:
> +#   Contains a large buffer (modeled with Bridge) to hide the access
> latency
> +#   of the memory cube. Plus it simply forwards the packets to the serial
> +#   links in a round-robin fashion to balance load among them.
> +#   * It is inferred from the standard [1] and the literature [3] that
> serial
> +#     links share the same address range and packets can travel over any
> of
> +#     them so a load distribution mechanism is required among them.
> +
> +import optparse
> +
> +import m5
> +from m5.objects import *
> +
> +# A single Hybrid Memory Cube (HMC)
> +class HMCSystem(SimOject):
> +
> +    #*****************************CROSSBAR
> PARAMETERS*************************
> +    # Flit size of the main interconnect [1]
> +    xbar_width = Param.Unsigned( 32, "Data width of the main XBar
> (Bytes)")
> +
> +    # Clock frequency of the main interconnect [1]
> +    # This crossbar, is placed on the logic-based of the HMC and it has
> its
> +    # own voltage and clock domains, different from the DRAM dies or from
> the
> +    # host.
> +    xbar_frequency = Param.Frequency('1GHz', "Clock Frequency of the main
> "
> +        "XBar")
> +
> +    # Arbitration latency of the HMC XBar [1]
> +    xbar_frontend_latency = Param.Cycles(1, "Arbitration latency of the
> XBar")
> +
> +    # Latency to forward a packet via the interconnect [1](two levels of
> FIFOs
> +    # at the input and output of the inteconnect)
> +    xbar_forward_latency = Param.Cycles(2, "Forward latency of the XBar")
> +
> +    # Latency to forward a response via the interconnect [1](two levels of
> +    # FIFOs at the input and output of the inteconnect)
> +    xbar_response_latency = Param.Cycles(2, "Response latency of the
> XBar")
> +
> +    #*****************************SERIAL LINK
> PARAMETERS**********************
> +    # Number of serial links [1]
> +    num_serial_links = Param.Unsigned(4, "Number of serial links")
> +
> +    # Number of packets (not flits) to store at the request side of the
> serial
> +    #  link. This number should be adjusted to achive required bandwidth
> +    link_buffer_size_req = Param.Unsigned( 16, "Number of packets to
> buffer "
> +        "at the request side of the serial link")
> +
> +    # Number of packets (not flits) to store at the response side of the
> serial
> +    #  link. This number should be adjusted to achive required bandwidth
> +    link_buffer_size_rsp = Param.Unsigned( 16, "Number of packets to
> buffer "
> +        "at the response side of the serial link")
> +
> +    # Latency of the serial link composed by SER/DES latency (1.6ns [4])
> plus
> +    # the PCB trace latency (3ns Estimated based on [5])
> +    link_latency = Param.Latency('4.6ns', "Latency of the serial links")
> +
> +    # Header overhead of the serial links: Header size is 128bits in HMC
> [1],
> +    #  and we have 16 lanes, so the overhead is 8 cycles
> +    link_overhead = Param.Cycles(8, "The number of cycles required to"
> +        " transmit the packet header over the serial link")
> +
> +    # Clock frequency of the serial links [1]
> +    link_frequency = Param.Frequency('10GHz', "Clock Frequency of the
> serial"
> +        "links")
> +
> +    # Number of parallel lanes in each serial link [1]
> +    num_lanes_per_link =  Param.Unsigned( 16, "Number of lanes per each
> link")
> +
> +    # Number of serial links [1]
> +    num_serial_links =  Param.Unsigned( 4, "Number of serial links")
> +
> +    #*****************************HMC CONTROLLER
> PARAMETERS*******************
> +    # Number of packets (not flits) to store at the HMC controller. This
> +    # number should be high enough to be able to hide the high latency of
> HMC
> +    ctrl_buffer_size_req = Param.Unsigned( 256, "Number of packets to
> buffer "
> +        "at the HMC controller (request side)")
> +
> +    # Number of packets (not flits) to store at the response side of the
> HMC
> +    #  controller.
> +    ctrl_buffer_size_rsp = Param.Unsigned( 256, "Number of packets to
> buffer "
> +        "at the HMC controller (response side)")
> +
> +    # Latency of the HMC controller to process the packets
> +    # (ClockDomain = Host clock domain)
> +    ctrl_latency = Param.Cycles(4, "The number of cycles required for the
> "
> +        " controller to process the packet")
> +
> +    # Wiring latency from the SoC crossbar to the HMC controller
> +    ctrl_static_latency = Param.Latency('500ps', "Static latency of the
> HMC"
> +        "controller")
> +
> +    #*****************************PERFORMANCE
> MONITORING**********************
> +    # The main monitor behind the HMC Controller
> +    enable_global_monitor = Param.Bool(True, "The main monitor behind the
> "
> +        "HMC Controller")
> +
> +    # The link performance monitors
> +    enable_link_monitor = Param.Bool(True, "The link monitors" )
> +
> +# Create an HMC device and attach it to the current system
> +def config_hmc(options, system):
> +
> +    system.hmc=HMCSystem()
> +
> +    system.buffer = Bridge(ranges=system.mem_ranges,
> +        req_size=system.hmc.ctrl_buffer_size_req,
> +        resp_size=system.hmc.ctrl_buffer_size_rsp,
> +        delay=system.hmc.ctrl_static_latency)
> +    try:
> +        system.hmc.enable_global_monitor = options.enable_global_monitor
> +    except:
> +        pass;
> +
> +    try:
> +        system.hmc.enable_link_monitor = options.enable_link_monitor
> +    except:
> +        pass;
> +
> +    system.membus.master = system.buffer.slave
> +
> +    # The HMC controller (Clock domain is the same as the host)
> +    system.hmccontroller =
> HMCController(width=(system.hmc.num_lanes_per_link.
> +        value * system.hmc.num_serial_links/8),
> +        frontend_latency=system.hmc.ctrl_latency,
> +        forward_latency=system.hmc.link_overhead,
> +        response_latency=system.hmc.link_overhead)
> +
> +    system.hmccontroller.clk_domain = SrcClockDomain(clock=system.hmc.
> +        link_frequency, voltage_domain = VoltageDomain(voltage = '1V'))
> +
> +    # Serial Links
> +    system.hmc.seriallink =[ SerialLink(ranges = system.mem_ranges,
> +        req_size=system.hmc.link_buffer_size_req,
> +        resp_size=system.hmc.link_buffer_size_rsp,
> +        num_lanes=system.hmc.num_lanes_per_link,
> +        delay=system.hmc.link_latency)
> +        for i in xrange(system.hmc.num_serial_links)]
> +
> +    if system.hmc.enable_link_monitor:
> +        system.hmc.lmonitor = [ CommMonitor()
> +        for i in xrange(system.hmc.num_serial_links)]
> +
> +    # The HMC Crossbar located in its logic-base (LoB)
> +    system.hmc.xbar = NoncoherentXBar(width = system.hmc.xbar_width,
> +        frontend_latency=system.hmc.xbar_frontend_latency,
> +        forward_latency=system.hmc.xbar_forward_latency,
> +        response_latency=system.hmc.xbar_response_latency )
> +    system.hmc.xbar.clk_domain = SrcClockDomain(clock =
> +        system.hmc.xbar_frequency, voltage_domain =
> +        VoltageDomain(voltage = '1V'))
> +
> +    if system.hmc.enable_global_monitor:
> +        system.gmonitor = CommMonitor()
> +        system.buffer.master = system.gmonitor.slave
> +        system.gmonitor.master = system.hmccontroller.slave
> +    else:
> +        system.hmccontroller.slave = system.buffer.master
> +
> +    for i in xrange(system.hmc.num_serial_links):
> +        system.hmccontroller.master = system.hmc.seriallink[i].slave
> +        system.hmc.seriallink[i].clk_domain =
> system.hmccontroller.clk_domain;
> +        if system.hmc.enable_link_monitor:
> +            system.hmc.seriallink[i].master = system.hmc.lmonitor[i].slave
> +            system.hmc.lmonitor[i].master = system.hmc.xbar.slave
> +        else:
> +            system.hmc.seriallink[i].master = system.hmc.xbar.slave
> diff -r fa8b2a99d4fe -r 276ad9121192 configs/common/MemConfig.py
> --- a/configs/common/MemConfig.py       Tue Nov 03 12:17:55 2015 -0600
> +++ b/configs/common/MemConfig.py       Tue Nov 03 12:17:56 2015 -0600
> @@ -39,6 +39,7 @@
>  import m5.objects
>  import inspect
>  import sys
> +import HMC
>  from textwrap import  TextWrapper
>
>  # Dictionary of mapping names of real memory controller models to
> @@ -151,6 +152,14 @@
>      them.
>      """
>
> +    if ( options.mem_type == "HMC_2500_x32"):
> +        HMC.config_hmc(options, system)
> +        subsystem = system.hmc
> +        xbar = system.hmc.xbar
> +    else:
> +        subsystem = system
> +        xbar = system.membus
> +
>      if options.tlm_memory:
>          system.external_memory = m5.objects.ExternalSlave(
>              port_type="tlm",
> @@ -161,11 +170,11 @@
>          return
>
>      if options.external_memory_system:
> -        system.external_memory = m5.objects.ExternalSlave(
> +        subsystem.external_memory = m5.objects.ExternalSlave(
>              port_type=options.external_memory_system,
> -            port_data="init_mem0", port=system.membus.master,
> +            port_data="init_mem0", port=xbar.master,
>              addr_ranges=system.mem_ranges)
> -        system.kernel_addr_check = False
> +        subsystem.kernel_addr_check = False
>          return
>
>      nbr_mem_ctrls = options.mem_channels
> @@ -199,8 +208,8 @@
>
>              mem_ctrls.append(mem_ctrl)
>
> -    system.mem_ctrls = mem_ctrls
> +    subsystem.mem_ctrls = mem_ctrls
>
>      # Connect the controllers to the membus
> -    for i in xrange(len(system.mem_ctrls)):
> -        system.mem_ctrls[i].port = system.membus.master
> +    for i in xrange(len(subsystem.mem_ctrls)):
> +        subsystem.mem_ctrls[i].port = xbar.master
> diff -r fa8b2a99d4fe -r 276ad9121192 configs/example/fs.py
> --- a/configs/example/fs.py     Tue Nov 03 12:17:55 2015 -0600
> +++ b/configs/example/fs.py     Tue Nov 03 12:17:56 2015 -0600
> @@ -215,6 +215,7 @@
>              test_sys.cpu[i].createThreads()
> _______________________________________________
> gem5-dev mailing list
> gem5-dev@gem5.org
> http://m5sim.org/mailman/listinfo/gem5-dev
>



-- 
Erfan Azarkhish
Micrel Lab - Viale Carlo Pepoli 3/2 - 40123, Bologna
DEI - University of Bologna, Italy
https://www.linkedin.com/in/erfanazarkhish
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to