| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| // |
| { |
| name: "aon_timer", |
| human_name: "Always-On Timer", |
| one_line_desc: "Wakeup and watchdog timers running on a low-power, always-on clock", |
| one_paragraph_desc: ''' |
| Always-On (AON) Timer is the main timer hardware block of OpenTitan. |
| It includes two 32-bit up-counting timers, one of which functions as a wakeup timer and the other as a watchdog timer. |
| The watchdog timer has two thresholds: a 'bark' threshold that generates an interrupt and a 'bite' threshold that resets the system. |
| The wakeup timer has a 12-bit pre-scaler to enable very long timeouts and also generates an interrupt to the core. |
| The timers run on a ~200 kHz AON clock and have a maximum timeout window of roughly ~6 hours for the watchdog timer and ~1000 days with the use of the pre-scaler for the wakeup timer. |
| ''' |
| design_spec: "../doc", |
| dv_doc: "../doc/dv", |
| hw_checklist: "../doc/checklist", |
| sw_checklist: "/sw/device/lib/dif/dif_aon_timer", |
| version: "1.0", |
| life_stage: "L1", |
| design_stage: "D3", |
| verification_stage: "V2", |
| dif_stage: "S2", |
| clocking: [ |
| {clock: "clk_i", reset: "rst_ni", primary: true}, |
| {clock: "clk_aon_i", reset: "rst_aon_ni"} |
| ] |
| bus_interfaces: [ |
| { protocol: "tlul", direction: "device"} |
| ], |
| interrupt_list: [ |
| { name: "wkup_timer_expired", |
| desc: "Raised if the wakeup timer has hit the specified threshold" |
| }, |
| { name: "wdog_timer_bark", |
| desc: "Raised if the watchdog timer has hit the bark threshold" |
| }, |
| ], |
| alert_list: [ |
| { name: "fatal_fault", |
| desc: ''' |
| This fatal alert is triggered when a fatal TL-UL bus integrity fault is detected. |
| ''' |
| } |
| ], |
| wakeup_list: [ |
| { name: "wkup_req", |
| desc: "Raised if the wakeup or watchdog timer has hit the specified threshold" |
| }, |
| ], |
| reset_request_list: [ |
| { name: "aon_timer_rst_req", |
| desc: "watchdog reset requestt" |
| }, |
| ], |
| inter_signal_list: [ |
| // wakeup and reset request signals |
| { struct: "logic", |
| type: "uni", |
| name: "nmi_wdog_timer_bark", |
| act: "req", |
| package: "", |
| default: "1'b0" |
| }, |
| { struct: "logic", |
| type: "uni", |
| name: "wkup_req", |
| act: "req", |
| package: "", |
| default: "1'b0" |
| }, |
| { struct: "logic", |
| type: "uni", |
| name: "aon_timer_rst_req", |
| act: "req", |
| package: "", |
| default: "1'b0" |
| }, |
| // Broadcast from LC |
| { struct: "lc_tx" |
| type: "uni" |
| name: "lc_escalate_en" |
| act: "rcv" |
| default: "lc_ctrl_pkg::Off" |
| package: "lc_ctrl_pkg" |
| }, |
| { name: "sleep_mode", |
| type: "uni", |
| act: "rcv", |
| package: "", |
| struct: "logic", |
| width: "1" |
| } |
| ], |
| countermeasures: [ |
| { name: "BUS.INTEGRITY", |
| desc: "End-to-end bus integrity scheme." |
| } |
| ] |
| no_auto_intr_regs: "true", |
| regwidth: "32", |
| registers: [ |
| { name: "WKUP_CTRL", |
| desc: "Wakeup Timer Control register", |
| swaccess: "rw", |
| hwaccess: "hro", |
| async: "clk_aon_i", |
| fields: [ |
| { bits: "0", |
| name: "enable", |
| desc: "When set to 1, the wakeup timer will count", |
| } |
| { bits: "12:1", |
| name: "prescaler", |
| desc: "Pre-scaler value for wakeup timer count", |
| } |
| ], |
| }, |
| { name: "WKUP_THOLD", |
| desc: "Wakeup Timer Threshold Register", |
| swaccess: "rw", |
| hwaccess: "hro", |
| async: "clk_aon_i", |
| fields: [ |
| { bits: "31:0", |
| name: "threshold", |
| desc: "The count at which a wakeup interrupt should be generated", |
| } |
| ], |
| }, |
| { name: "WKUP_COUNT", |
| desc: "Wakeup Timer Count Register", |
| swaccess: "rw", |
| hwaccess: "hrw", |
| async: "clk_aon_i", |
| fields: [ |
| { bits: "31:0", |
| name: "count", |
| desc: "The current wakeup counter value", |
| } |
| ], |
| tags: [// this could be updated by HW |
| "excl:CsrNonInitTests:CsrExclWriteCheck"], |
| }, |
| { name: "WDOG_REGWEN", |
| desc: "Watchdog Timer Write Enable Register", |
| swaccess: "rw0c", |
| hwaccess: "none", |
| fields: [ |
| { bits: "0", |
| name: "regwen", |
| desc: "Once cleared, the watchdog configuration will be locked until the next reset", |
| resval: 1 |
| } |
| ] |
| }, |
| { name: "WDOG_CTRL", |
| desc: "Watchdog Timer Control register", |
| swaccess: "rw", |
| hwaccess: "hro", |
| async: "clk_aon_i", |
| regwen: "WDOG_REGWEN", |
| fields: [ |
| { bits: "0", |
| name: "enable", |
| desc: "When set to 1, the watchdog timer will count", |
| }, |
| { bits: "1", |
| name: "pause_in_sleep", |
| desc: "When set to 1, the watchdog timer will not count during sleep", |
| } |
| ], |
| }, |
| { name: "WDOG_BARK_THOLD", |
| desc: "Watchdog Timer Bark Threshold Register", |
| swaccess: "rw", |
| hwaccess: "hro", |
| async: "clk_aon_i", |
| regwen: "WDOG_REGWEN", |
| fields: [ |
| { bits: "31:0", |
| name: "threshold", |
| desc: "The count at which a watchdog bark interrupt should be generated", |
| } |
| ], |
| }, |
| { name: "WDOG_BITE_THOLD", |
| desc: "Watchdog Timer Bite Threshold Register", |
| swaccess: "rw", |
| hwaccess: "hro", |
| async: "clk_aon_i", |
| regwen: "WDOG_REGWEN", |
| fields: [ |
| { bits: "31:0", |
| name: "threshold", |
| desc: "The count at which a watchdog bite reset should be generated", |
| } |
| ], |
| }, |
| { name: "WDOG_COUNT", |
| desc: "Watchdog Timer Count Register", |
| swaccess: "rw", |
| hwaccess: "hrw", |
| async: "clk_aon_i", |
| fields: [ |
| { bits: "31:0", |
| name: "count", |
| desc: "The current watchdog counter value", |
| } |
| ], |
| tags: [// this could be updated by HW |
| "excl:CsrNonInitTests:CsrExclWriteCheck"], |
| }, |
| { name: "INTR_STATE", |
| desc: "Interrupt State Register", |
| swaccess: "rw1c", |
| hwaccess: "hrw", |
| fields: [ |
| { bits: "0", |
| name: "wkup_timer_expired", |
| desc: "Raised if the wakeup timer has hit the specified threshold", |
| } |
| { bits: "1", |
| name: "wdog_timer_bark", |
| desc: "Raised if the watchdog timer has hit the bark threshold", |
| } |
| ] |
| tags: [// interrupt could be updated by HW |
| "excl:CsrNonInitTests:CsrExclWriteCheck"], |
| }, |
| { name: "INTR_TEST", |
| desc: "Interrupt Test Register", |
| swaccess: "wo", |
| hwaccess: "hro", |
| hwext: "true", |
| hwqe: "true", |
| fields: [ |
| { bits: "0", |
| name: "wkup_timer_expired", |
| desc: "Write 1 to force wkup_timer_expired interrupt", |
| } |
| { bits: "1", |
| name: "wdog_timer_bark", |
| desc: "Write 1 to force wdog_timer_bark interrupt", |
| } |
| ] |
| }, |
| { name: "WKUP_CAUSE", |
| desc: "Wakeup request status", |
| swaccess: "rw0c", |
| hwaccess: "hrw", |
| async: "clk_aon_i", |
| fields: [ |
| { bits: "0", |
| name: "cause", |
| desc: "AON timer requested wakeup, write 0 to clear", |
| } |
| ] |
| tags: [// this could be updated by HW |
| "excl:CsrNonInitTests:CsrExclWriteCheck"], |
| }, |
| ], |
| } |