blob: 8a41a6863dc569ff1b0401ec8e5589a0cdd8d799 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
{ name: "rv_timer",
clock_primary: "clk_i",
bus_interfaces: [
{ protocol: "tlul", direction: "device" }
],
available_input_list: [
],
available_output_list: [
],
interrupt_list: [
{ name: "timer_expired_0_0",
desc: "raised if the timer 0_0 expired (mtimecmp >= mtime)"
},
],
param_list: [
{ name: "N_HARTS",
desc: "Number of harts",
type: "int",
default: "1"
},
{ name: "N_TIMERS",
desc: "Number of timers per Hart",
type: "int",
default: "1"
}
],
no_auto_intr_regs: "true",
regwidth: "32",
registers: [
{ multireg: {
name: "CTRL",
desc: "Control register",
count: "N_HARTS",
cname: "TIMER",
swaccess: "rw",
hwaccess: "hro",
fields: [
{ bits: "0", name: "active",
desc: "If 1, timer operates",
tags: [// prevent timer from being enabled
"excl:CsrNonInitTests:CsrExclWrite"] }
],
}
},
{ skipto: "0x100" },
{ name: "CFG0",
desc: "Configuration for Hart 0",
swaccess: "rw",
hwaccess: "hro",
fields: [
{ bits: "11:0", name: "prescale", desc: "Prescaler to generate tick" },
{ bits: "23:16", name: "step", resval: "0x1", desc: "Incremental value for each tick" },
],
},
{ name: "TIMER_V_LOWER0",
desc: "Timer value Lower",
swaccess: "rw",
hwaccess: "hrw",
fields: [
{ bits: "31:0", name: "v", desc: "Timer value [31:0]" },
],
},
{ name: "TIMER_V_UPPER0",
desc: "Timer value Upper",
swaccess: "rw",
hwaccess: "hrw",
fields: [
{ bits: "31:0", name: "v", desc: "Timer value [63:32]" },
],
},
{ name: "COMPARE_LOWER0_0",
desc: "Timer value Lower",
swaccess: "rw",
hwaccess: "hro",
hwqe: "true",
fields: [
{ bits: "31:0", name: "v", resval: "0xffffffff", desc: "Timer compare value [31:0]" },
],
},
{ name: "COMPARE_UPPER0_0",
desc: "Timer value Upper",
swaccess: "rw",
hwaccess: "hro",
hwqe: "true",
fields: [
{ bits: "31:0", name: "v", resval: "0xffffffff", desc: "Timer compare value [63:32]" },
],
},
{ multireg: {
name: "INTR_ENABLE0",
desc: "Interrupt Enable",
count: "N_TIMERS",
cname: "TIMER",
swaccess: "rw",
hwaccess: "hro",
fields: [
{ bits: "0", name: "IE", desc: "Interrupt Enable for timer" }
]
}
},
{ multireg: {
name: "INTR_STATE0",
desc: "Interrupt Status",
count: "N_TIMERS",
cname: "TIMER",
swaccess: "rw1c",
hwaccess: "hrw",
fields: [
{ bits: "0", name: "IS", desc: "Interrupt status for timer",
tags: [// intr_state csr is affected by writes to other csrs - skip write-check
"excl:CsrNonInitTests:CsrExclWriteCheck"] }
],
}
},
{ multireg: {
name: "INTR_TEST0",
desc: "Interrupt test register",
count: "N_TIMERS",
cname: "TIMER",
swaccess: "wo",
hwaccess: "hro",
hwext: "true",
hwqe: "true",
fields: [
{ bits: "0", name: "T", desc: "Interrupt test for timer",
tags: [// intr_test csr is WO which - it reads back 0s
"excl:CsrNonInitTests:CsrExclWrite"] }
]
}
},
],
}