blob: 2ed2e8b144c1f768a8c8f0ec917d3ba2568fe6a9 [file] [log] [blame]
{
"description": "TBM configuration for Springbok",
# This file is also used as an example of a TBM configuration, hence all the
# comments.
# To experiment with different configurations based on this one, create a new
# configuration file with only the properties you want to change, and pass
# the new file to TBM with the '--extend' argument (this file should still be
# passed to TBM with the '--uarch' argument). You can use the '--extend'
# argument multiple times to pass multiple files. Normally, properties in
# 'extend' files overwrite (or add) properties. If you want to replace an
# entire object (i.e. not just overwrite the mentioned properties, also
# remove all the other properties), include the property 'replace : true' in
# the object.
# config: object, required. General parameters of the microarchitecture.
"config" : {
# branch_prediction: enum, required. Possible values:
# 'none' - no branch prediction, fetch is stalled until the target is
# computed.
# 'perfect' - branching doesn't cause fetch stalls (the branch target is
# taken from the input trace).
"branch_prediction" : "perfect",
# fetch_rate: positive integer, required. The number of instructions that
# are fetched in a cycle. If the fetch queue doesn't have enough space for
# all the instructions, none are fetched.
"fetch_rate" : 4,
# fetch_queue_size: positive integer. The size of the fetch queue. If
# omitted, the queue is unrestricted (infinite).
"fetch_queue_size" : 4,
# decode_rate: positive integer. The number of instructions that can be
# decoded and moved from the fetch queue to the dispatch queues in a cycle.
# If omitted, as many instructions as possible are decoded and moved.
"decode_rate" : 4,
# vector_slices: positive integer, required. The number of slices each
# vector register is composed of.
"vector_slices" : 2
},
# register_files: map, required. Currently the register file names X, F, V,
# and MISC are hard-coded in TBM. In the future, the 'regs' property will be
# used to determine which register file a register belongs to. All registers
# that are not X, F, or V, are MISC.
"register_files" : {
"X" : {
# type: enum, required. Possible values:
# 'scalar' - scalar registers.
# 'vector' - vector registers.
"type" : "scalar",
# regs: array, currently ignored.
"regs" : [
"x1", "x2", "x3", "x4", "x5", "x6", "x7",
"x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
"x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
"x24", "x25", "x26", "x27", "x28", "x29", "x30", "x31"
],
# read_ports: positive integer. The number of register reads that can be
# done in a cycle, excluding registers listed in the
# 'dedicated_read_ports' property. If omitted, any number of registers
# can be read in a cycle.
"read_ports" : 2,
# write_ports: positive integer. Similar to 'read_ports'.
"write_ports" : 1
},
"F" : {
"type" : "scalar",
"regs" : [
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"
],
"read_ports" : 2,
"write_ports" : 1
},
"V" : {
"type" : "vector",
"regs" : [
"v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
"v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
"v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
"v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
],
"read_ports" : 2,
"write_ports" : 1,
# dedicated_read_ports: array. This property is only valid when the
# register file 'type' is 'vector'. See 'read_ports' for more
# information.
"dedicated_read_ports" : [ "v0" ]
# dedicated_write_ports, array. Similar to 'dedicated_read_ports'.
},
"MISC" : {
"type" : "scalar"
}
},
# issue_queues: map, required. Currently the names S and V are hard-coded in
# TBM.
"issue_queues": {
"S" : {
# size: positive integer. The number of instructions the issue/dispatch
# queue can hold. If omitted, the queue is unrestricted (infinite).
"size" : 4
},
"V" : {
"size" : 4
}
},
# functional_units: map, required.
"functional_units" : {
"lsu" : {
# count: positive integer. The number of copies of this unit avilable. If
# omitted, one copy will be avilable.
"count" : 1,
# type: enum, required. Possible values:
# 'scalar' - scalar datapath.
# 'vector' - vector datapath (see slices).
"type" : "scalar",
# issue_queue: string, required. The issue queue that feeds this unit.
"issue_queue" : "S",
# eiq_size: positive integer. If omitted, the queue is unrestricted
# (infinite).
"eiq_size" : 4,
# can_skip_eiq: boolean, required. When true, instructions can move from
# the issue queue directly to the first pipeline stage. Otherwise,
# instructions must spend at list one cycle in the EIQ before they move
# to the first pipeline stage.
"can_skip_eiq" : true,
# depth: positive integer, required. The number of stages in the
# pipeline.
"depth" : 3,
# pipelined: boolean, required. When true, each pipeline stage can be
# populated with a different instruction. Otherwise, only one instruction
# can be in any stage of the pipeline.
"pipelined": true,
# load_stage: non-negative integer. For units that read from memory, this
# is the pipeline stage (zero based) in which the memory accesses is
# initiated.
"load_stage": 1,
# fixed_load_latency: non-negative integer, required when 'load_stage' is
# specified. A load instruction will stall the pipeline only if it
# reaches the pipeline stage 'load_stage + fixed_load_latency', and the
# memory value is not available yet.
"fixed_load_latency": 1,
# store_stage: non-negative integer. Similar to 'load_stage'.
"store_stage": 1,
# fixed_store_latency: non-negative integer, required when 'store_stage'
# is specified. Similar to 'fixed_load_latency'.
"fixed_store_latency": 1,
# memory_interface: string, required when 'load_stage' or 'store_stage'
# are specified. This should be one of the cache levels (see
# 'memory_system'), or 'main'. For units that accesses memory, this is
# the memory module the unit interacts with.
"memory_interface" : "L1D",
# writeback_buff_size: positive integer. The size of the register
# writeback buffer. If omitted, the buffer is unrestricted (infinite).
"writeback_buff_size": 2
},
"alu" : {
"type" : "scalar",
"issue_queue" : "S",
"eiq_size" : 4, "can_skip_eiq" : true,
"depth" : 1, "pipelined": true,
"writeback_buff_size": 2
},
"div" : {
"type" : "scalar",
"issue_queue" : "S",
"eiq_size" : 4, "can_skip_eiq" : true,
"depth" : 4, "pipelined": true,
"writeback_buff_size": 2
},
"mul" : {
"type" : "scalar",
"issue_queue" : "S",
"eiq_size" : 4, "can_skip_eiq" : true,
"depth" : 1, "pipelined": true,
"writeback_buff_size": 2
},
"fpu" : {
"type" : "scalar",
"issue_queue" : "S",
"eiq_size" : 4, "can_skip_eiq" : true,
"depth" : 1, "pipelined": true,
"writeback_buff_size": 2
},
"branch" : {
"description" : "TODO(sflur): not sure how to handle these instruction, so added this unit for now.",
"type" : "scalar",
"issue_queue" : "S",
"eiq_size" : 1, "can_skip_eiq" : true,
"depth" : 1, "pipelined": false,
"writeback_buff_size": 1
},
"csr" : {
"description" : "TODO(sflur): not sure how to handle these instructions, so added this unit for now.",
"type" : "scalar",
"issue_queue" : "S",
"eiq_size" : 1, "can_skip_eiq" : true,
"depth" : 1, "pipelined": false,
"writeback_buff_size": 2
},
"vctrl" : {
"description" : "TODO(sflur): not sure how to handle these instructions, so added this unit for now.",
"type" : "scalar",
"issue_queue" : "S",
"eiq_size" : 1, "can_skip_eiq" : true,
"depth" : 1, "pipelined": false,
"writeback_buff_size": 1
},
"vlsu" : {
"type" : "vector",
"issue_queue" : "V",
"eiq_size" : 4, "can_skip_eiq" : true,
"depth" : 3, "pipelined": true,
"load_stage": 1, "fixed_load_latency": 1,
"store_stage": 1, "fixed_store_latency": 1,
"memory_interface" : "L1D",
"writeback_buff_size": 2
},
"valu" : {
"type" : "vector",
"issue_queue" : "V",
"eiq_size" : 4, "can_skip_eiq" : true,
"depth" : 2, "pipelined": true,
"writeback_buff_size": 2
},
"vmac" : {
"type" : "vector",
"issue_queue" : "V",
"eiq_size" : 4, "can_skip_eiq" : true,
"depth" : 3, "pipelined": true,
"writeback_buff_size": 2
},
"vdiv" : {
"type" : "vector",
"issue_queue" : "V",
"eiq_size" : 4, "can_skip_eiq" : true,
"depth" : 3, "pipelined": true,
"writeback_buff_size": 2
},
"vperm" : {
"type" : "vector",
"issue_queue" : "V",
"eiq_size" : 4, "can_skip_eiq" : true,
"depth" : 3, "pipelined": true,
"writeback_buff_size": 2
},
"vred" : {
"type" : "vector",
"issue_queue" : "V",
"eiq_size" : 4, "can_skip_eiq" : true,
"depth" : 2, "pipelined": true,
"writeback_buff_size": 2
},
"vmsk" : {
"description" : "From the spec doc, this look more special, it is used in conjunction with other units.",
"type" : "vector",
"issue_queue" : "V",
"eiq_size" : 4, "can_skip_eiq" : true,
"depth" : 2, "pipelined": true,
"writeback_buff_size": 2
},
"vmv" : {
"description" : "This unit is not in the spec doc, but I suspect it might be added later.",
"type" : "vector",
"issue_queue" : "V",
"eiq_size" : 4, "can_skip_eiq" : true,
"depth" : 1, "pipelined": true,
"writeback_buff_size": 2
},
"vfspecial" : {
"description" : "Not in the spec doc! copied from old config",
"type" : "vector",
"issue_queue" : "V",
"eiq_size" : 4, "can_skip_eiq" : true,
"depth" : 2, "pipelined": true,
"writeback_buff_size": 2
},
"vnimp" : {
"description" : "For instructions we don't care to implement",
"type" : "vector",
"issue_queue" : "V",
"eiq_size" : 4, "can_skip_eiq" : true,
"depth" : 1, "pipelined": false,
"writeback_buff_size": 2
}
},
# pipe_maps: array, required. A list of files specifying the mapping from
# instructions to functional units.
"pipe_maps" : [
"pipe_maps/riscv/missing.json",
"pipe_maps/riscv/custom.json",
"pipe_maps/riscv/rv32a.json",
"pipe_maps/riscv/rv32b.json",
"pipe_maps/riscv/rv32d.json",
"pipe_maps/riscv/rv32f.json",
"pipe_maps/riscv/rv32h.json",
"pipe_maps/riscv/rv32i.json",
"pipe_maps/riscv/rv32m.json",
"pipe_maps/riscv/rv32q.json",
"pipe_maps/riscv/rv32zfh.json",
"pipe_maps/riscv/rv64a.json",
"pipe_maps/riscv/rv64d.json",
"pipe_maps/riscv/rv64f.json",
"pipe_maps/riscv/rv64h.json",
"pipe_maps/riscv/rv64i.json",
"pipe_maps/riscv/rv64m.json",
"pipe_maps/riscv/rv64q.json",
"pipe_maps/riscv/rvp.json",
"pipe_maps/riscv/rvv.json",
"pipe_maps/riscv/rvv-pseudo.json",
"pipe_maps/riscv/springbok.json",
"pipe_maps/riscv/system.json"
],
"__comment__ additional pipe_maps" : [
"pipe_maps/riscv/pseudo.json",
"pipe_maps/riscv/rv32c.json",
"pipe_maps/riscv/rv32d-zfh.json",
"pipe_maps/riscv/rv32k.json",
"pipe_maps/riscv/rv32q-zfh.json",
"pipe_maps/riscv/rv64b.json",
"pipe_maps/riscv/rv64c.json",
"pipe_maps/riscv/rv64k.json",
"pipe_maps/riscv/rv64zfh.json",
"pipe_maps/riscv/rvc.json",
"pipe_maps/riscv/rvk.json",
"pipe_maps/riscv/svinval.json"
],
# memory_system: object, required. Description of the memory hierarchy.
"memory_system" : {
# latencies: object, required.
"latencies" : {
# fetch_read: positive integer, required when levels is not empty. The
# number of cycles required for handling a fetch read request coming from
# higher levels, not including the handling of the request by lower
# levels.
"fetch_read" : 1,
# fetch_write: positive integer, required with levels.
# Similar to fetch_read.
"fetch_write" : 1,
# write: positive integer, required (TODO(sflur): maybe this shouldn't be
# required for instruction cache?). The number of cycles required for
# handling a write request coming from a functional unit, not including
# the handling of the request by lower levels.
"write" : 1
# read: positive integer, required when this level is used as a
# memory_interface. The number of cycles required for handling a read
# request coming from a functional unit, not including the handling of
# the request by lower levels.
},
# levels: map. Description of the lower cache levels.
"levels" : {
"L3" : {
# type: enum, required. Possible values:
# 'dcache' - data cache, used for serving load/store instructions.
# 'icache' - instruction cache, used for fetching instructions.
# 'unified' - used for both instructions and data.
"type" : "unified",
# placement: object, required. Description of the placement policy.
"placement" : {
# type: enum, required. Possible values:
# 'direct_map'
# 'set_assoc'
"type" : "set_assoc",
# set_size: positive integer, required when 'type' is 'set_assoc'.
"set_size" : 4,
# replacement: enum, required when 'type' is 'set_assoc'. Possible values:
# 'LRU'
"replacement" : "LRU"
},
# write_policy: enum, required. Possible values:
# 'write_back'
# 'write_through'
"write_policy" : "write_back",
# inclusion: enum, required with levels. Possible values:
# 'exclusive'
# 'inclusive'
"inclusion" : "exclusive",
# line_size: positive integer, required. Cache line size in bits.
"line_size" : 128,
# size: bytes, required. Can be a positive integer, or a string with
# one of the suffixes b, kb, mb, gb, tb, lowercase or uppercase (e.g.
# "4MB").
"size" : "4MB",
"latencies" : {
"fetch_read" : 1,
"fetch_write" : 1,
"write" : 1
},
"levels" : {
"L2" : {
"type" : "unified",
"placement" : { "type" : "set_assoc",
"set_size" : 4,
"replacement" : "LRU"
},
"write_policy" : "write_back",
"inclusion" : "exclusive",
"line_size" : 128,
"size" : "256KB",
"latencies" : { "fetch_read" : 1, "fetch_write" : 1, "write" : 1 },
"levels" : {
"L1D" : {
"type" : "dcache",
"placement" : { "type" : "set_assoc",
"set_size" : 4,
"replacement" : "LRU"
},
"write_policy" : "write_back",
"line_size" : 128,
"size" : "32KB",
"latencies" : { "read" : 1, "write" : 1 }
},
"L1I" : {
"type" : "icache",
"placement" : { "type" : "set_assoc",
"set_size" : 4,
"replacement" : "LRU"
},
"write_policy" : "write_back",
"line_size" : 128,
"size" : "32KB",
"latencies" : { "read" : 1, "write" : 1 }
}
}
}
}
}
}
}
}