blob: c9e21e6a3ab2126ded08bd42591fdd3f19d3cddb [file] [log] [blame]
# Copyright 2020 Google, Inc.
#
# 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.
from m5.params import *
from m5.proxy import *
from m5.SimObject import SimObject
from m5.objects.ArmInterrupts import ArmInterrupts
from m5.objects.ArmISA import ArmISA
from m5.objects.FastModel import AmbaInitiatorSocket, AmbaTargetSocket
from m5.objects.ResetPort import ResetResponsePort
from m5.objects.IntPin import IntSinkPin, VectorIntSinkPin
from m5.objects.Iris import IrisBaseCPU
from m5.objects.SystemC import SystemC_ScModule
class FastModelCortexR52(IrisBaseCPU):
type = 'FastModelCortexR52'
cxx_class = 'gem5::fastmodel::CortexR52'
cxx_header = 'arch/arm/fastmodel/CortexR52/cortex_r52.hh'
evs = Parent.evs
ppi = VectorIntSinkPin('PPI inputs (0-8)')
llpp = AmbaInitiatorSocket(64, 'Low Latency Peripheral Port')
flash = AmbaInitiatorSocket(64, 'Flash')
amba = AmbaInitiatorSocket(64, 'AMBA initiator socket')
core_reset = IntSinkPin('Raising this signal will put the core into ' \
'reset mode.')
poweron_reset = IntSinkPin('Power on reset. Initializes all the ' \
'processor logic, including debug logic.')
halt = IntSinkPin('Raising this signal will put the core into halt mode.')
CFGEND = Param.Bool(False, "Endianness configuration at reset. 0, " \
"little endian. 1, big endian.")
CFGTE = Param.Bool(False, "Equivalent to CFGTHUMBEXCEPTIONS")
RVBARADDR = Param.UInt32(0, "Equivalent to CFGVECTABLE")
ase_present = Param.Bool(True, "Set whether the model has been built " \
"with NEON support")
dcache_size = Param.UInt16(0x8000, "L1 D-Cache size in bytes")
flash_enable = Param.Bool(False, "Equivalent to CFGFLASHEN")
icache_size = Param.UInt16(0x8000, "L1 I-Cache size in bytes")
llpp_base = Param.UInt32(0, "Equivalent to CFGLLPPBASEADDR")
llpp_size = Param.UInt32(0x1000, "Equivalent to CFGLLPPSIZE")
max_code_cache_mb = Param.UInt64(0x100, "Maximum size of the " \
"simulation code cache (MiB). For platforms with more than 2 " \
"cores this limit will be scaled down. (e.g 1/8 for 16 or more " \
"cores).")
min_sync_level = Param.UInt8(0, "Force minimum syncLevel " \
"(0=off=default,1=syncState,2=postInsnIO,3=postInsnAll)")
semihosting_A32_HLT = Param.UInt16(0xf000, "A32 HLT number for " \
"semihosting calls.")
semihosting_ARM_SVC = Param.UInt32(0x123456, "A32 SVC number for " \
"semihosting calls.")
semihosting_T32_HLT = Param.UInt8(60, "T32 HLT number for semihosting " \
"calls.")
semihosting_Thumb_SVC = Param.UInt8(171, "T32 SVC number for " \
"semihosting calls.")
semihosting_cmd_line = Param.String("", "Command line available to " \
"semihosting calls.")
semihosting_cwd = Param.String("", "Base directory for semihosting " \
"file access.")
semihosting_enable = Param.Bool(True, "Enable semihosting SVC/HLT traps.")
semihosting_heap_base = Param.UInt32(0, "Virtual address of heap base.")
semihosting_heap_limit = Param.UInt32(0xf000000, "Virtual address of " \
"top of heap.")
semihosting_stack_base = Param.UInt32(0x10000000, "Virtual address of " \
"base of descending stack.")
semihosting_stack_limit = Param.UInt32(0xf000000, "Virtual address of " \
"stack limit.")
tcm_a_enable = Param.Bool(False, "Equivalent to CFGTCMBOOT")
tcm_a_size = Param.UInt32(0x4000, "Sets the size of the ATCM(in bytes)")
tcm_b_size = Param.UInt32(0x4000, "Sets the size of the BTCM(in bytes)")
tcm_c_size = Param.UInt32(0x2000, "Sets the size of the CTCM(in bytes)")
vfp_dp_present = Param.Bool(True, "Whether double-precision floating " \
"point feature is implemented")
vfp_enable_at_reset = Param.Bool(False, "Enable VFP in CPACR, CPPWR, " \
"NSACR at reset. Warning: Arm recommends going through the "
"implementation's suggested VFP power-up sequence!")
class FastModelCortexR52Cluster(SimObject):
type = 'FastModelCortexR52Cluster'
cxx_class = 'gem5::fastmodel::CortexR52Cluster'
cxx_header = 'arch/arm/fastmodel/CortexR52/cortex_r52.hh'
cores = VectorParam.FastModelCortexR52(
'Core in a given cluster of CortexR52s')
evs = Param.SystemC_ScModule(
"Fast mo0del exported virtual subsystem holding cores")
spi = VectorIntSinkPin('SPI inputs (0-959)')
ext_slave = AmbaTargetSocket(64, 'AMBA target socket')
top_reset = IntSinkPin('This signal resets timer and interrupt controller.')
dbg_reset = IntSinkPin('Initialize the shared debug APB, Cross Trigger ' \
'Interface (CTI), and Cross Trigger Matrix (CTM) logic.')
model_reset = ResetResponsePort('A reset port to reset the whole cluster.')
CLUSTER_ID = Param.UInt16(0, "CLUSTER_ID[15:8] equivalent to " \
"CFGMPIDRAFF2, CLUSTER_ID[7:0] equivalent to CFGMPIDRAFF1")
DBGROMADDR = Param.UInt32(0, "Equivalent to CFGDBGROMADDR")
DBGROMADDRV = Param.Bool(False, "If true, set bits[1:0] of the CP15 " \
"DBGDRAR to indicate that the address is valid")
PERIPHBASE = Param.UInt32(0x13080000, "Equivalent to CFGPERIPHBASE")
cluster_utid = Param.UInt8(0, "Equivalent to CFGCLUSTERUTID")
cpi_div = Param.UInt32(1, "Divider for calculating CPI " \
"(Cycles Per Instruction)")
cpi_mul = Param.UInt32(1, "Multiplier for calculating CPI " \
"(Cycles Per Instruction)")
dcache_prefetch_enabled = Param.Bool(False, "Enable simulation of data " \
"cache prefetching. This is only used when " \
"dcache-state_modelled=true")
dcache_read_access_latency = Param.UInt64(0, "L1 D-Cache timing " \
"annotation latency for read accesses given in ticks per access " \
"(of size dcache-read_bus_width_in_bytes). If this parameter " \
"is non-zero, per-access latencies will be used instead of " \
"per-byte even if dcache-read_latency is set. This is in " \
"addition to the hit or miss latency, and intended to " \
"correspond to the time taken to transfer across the cache " \
"upstream bus, this is only used when dcache-state_modelled=true.")
dcache_state_modelled = Param.Bool(False, "Set whether D-cache has " \
"stateful implementation")
dcache_write_access_latency = Param.UInt64(0, "L1 D-Cache timing " \
"annotation latency for write accesses given in ticks per " \
"access (of size dcache-write_bus_width_in_bytes). If this " \
"parameter is non-zero, per-access latencies will be used " \
"instead of per-byte even if dcache-write_latency is set. This " \
"is only used when dcache-state_modelled=true.")
flash_protection_enable_at_reset = Param.Bool(False, "Equivalent to " \
"CFGFLASHPROTEN")
has_flash_protection = Param.Bool(True, "Equivalent to CFGFLASHPROTIMP")
icache_prefetch_enabled = Param.Bool(False, "Enable simulation of " \
"instruction cache prefetching. This is only used when " \
"icache-state_modelled=true.")
icache_read_access_latency = Param.UInt64(0, "L1 I-Cache timing " \
"annotation latency for read accesses given in ticks per access " \
"(of size icache-read_bus_width_in_bytes). If this parameter " \
"is non-zero, per-access latencies will be used instead of " \
"per-byte even if icache-read_latency is set. This is in " \
"addition to the hit or miss latency, and intended to " \
"correspond to the time taken to transfer across the cache " \
"upstream bus, this is only used when icache-state_modelled=true.")
icache_state_modelled = Param.Bool(False, "Set whether I-cache has " \
"stateful implementation")
memory_ext_slave_base = Param.UInt32(0, "Equivalent to CFGAXISTCMBASEADDR")
memory_flash_base = Param.UInt32(0, "Equivalent to CFGFLASHBASEADDR")
memory_flash_size = Param.UInt32(0x4000000, "Equivalent to CFGFLASHIMP. " \
"memory.flash_size = 0 => CFGFLASHIMP = false")
num_protection_regions_s1 = Param.UInt8(16, "Number of v8-R stage1 " \
"protection regions")
num_protection_regions_s2 = Param.UInt8(16, "Number of v8-R hyp " \
"protection regions")
num_spi = Param.UInt16(960, "Number of interrupts (SPI) into the " \
"internal GIC controller")
ram_protection_enable_at_reset = Param.Bool(False, "Equivalent to " \
"CFGRAMPROTEN")
has_export_m_port = Param.Bool(True, "The interrupt distributor has an " \
"optional interrupt export port for routing interrupts to an " \
"external device")
class FastModelScxEvsCortexR52x1(SystemC_ScModule):
type = 'FastModelScxEvsCortexR52x1'
cxx_class = 'gem5::fastmodel::ScxEvsCortexR52<' \
'gem5::fastmodel::ScxEvsCortexR52x1Types>'
cxx_template_params = [ 'class Types' ]
cxx_header = 'arch/arm/fastmodel/CortexR52/evs.hh'
class FastModelCortexR52x1(FastModelCortexR52Cluster):
cores = [ FastModelCortexR52(thread_paths=[ 'core.cpu0' ]) ]
evs = FastModelScxEvsCortexR52x1()
class FastModelScxEvsCortexR52x2(SystemC_ScModule):
type = 'FastModelScxEvsCortexR52x2'
cxx_class = 'gem5::fastmodel::ScxEvsCortexR52<' \
'gem5::fastmodel::ScxEvsCortexR52x2Types>'
cxx_template_params = [ 'class Types' ]
cxx_header = 'arch/arm/fastmodel/CortexR52/evs.hh'
class FastModelCortexR52x2(FastModelCortexR52Cluster):
cores = [ FastModelCortexR52(thread_paths=[ 'core.cpu0' ]),
FastModelCortexR52(thread_paths=[ 'core.cpu1' ]) ]
evs = FastModelScxEvsCortexR52x2()
class FastModelScxEvsCortexR52x3(SystemC_ScModule):
type = 'FastModelScxEvsCortexR52x3'
cxx_class = 'gem5::fastmodel::ScxEvsCortexR52<' \
'gem5::fastmodel::ScxEvsCortexR52x3Types>'
cxx_template_params = [ 'class Types' ]
cxx_header = 'arch/arm/fastmodel/CortexR52/evs.hh'
class FastModelCortexR52x3(FastModelCortexR52Cluster):
cores = [ FastModelCortexR52(thread_paths=[ 'core.cpu0' ]),
FastModelCortexR52(thread_paths=[ 'core.cpu1' ]),
FastModelCortexR52(thread_paths=[ 'core.cpu2' ]) ]
evs = FastModelScxEvsCortexR52x3()
class FastModelScxEvsCortexR52x4(SystemC_ScModule):
type = 'FastModelScxEvsCortexR52x4'
cxx_class = 'gem5::fastmodel::ScxEvsCortexR52<' \
'gem5::fastmodel::ScxEvsCortexR52x4Types>'
cxx_template_params = [ 'class Types' ]
cxx_header = 'arch/arm/fastmodel/CortexR52/evs.hh'
class FastModelCortexR52x4(FastModelCortexR52Cluster):
cores = [ FastModelCortexR52(thread_paths=[ 'core.cpu0' ]),
FastModelCortexR52(thread_paths=[ 'core.cpu1' ]),
FastModelCortexR52(thread_paths=[ 'core.cpu2' ]),
FastModelCortexR52(thread_paths=[ 'core.cpu3' ]) ]
evs = FastModelScxEvsCortexR52x4()