blob: 710584df8699efd54be46dbafd7b65163b59db04 [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.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.')
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()