| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| // TODO: This module is only a draft implementation that covers most of the clkmgr |
| // functionality but is incomplete |
| |
| |
| |
| # CLKMGR register template |
| # |
| { |
| name: "clkmgr", |
| human_name: "Clock Manager", |
| one_line_desc: "Derives and monitors on-chip clock signals, handles clock gating requests from power manager and software", |
| one_paragraph_desc: ''' |
| Clock Manager derives on-chip clocks from root clock signals provided by Analog Sensor Top (AST). |
| Input and output clocks may be asynchronous to each other. |
| During clock derivation, Clock Manager can divide clocks to lower frequencies and gate clocks based on control signals from the power manager and to a limited extent from software. |
| For example, the idle status of relevant hardware blocks is tracked and clock gating requests from software are ignored as long as these blocks are active. |
| Further security features include switchable clock jitter, continuous monitoring of clock frequencies, and various countermeasures to deter fault injection (FI) attacks. |
| ''' |
| design_spec: "../doc", |
| dv_doc: "../doc/dv", |
| hw_checklist: "../doc/checklist", |
| sw_checklist: "/sw/device/lib/dif/dif_clkmgr", |
| revisions: [ |
| { |
| version: "1.0", |
| life_stage: "L1", |
| design_stage: "D1", |
| verification_stage: "V1", |
| dif_stage: "S2", |
| } |
| ] |
| clocking: [{clock: "clk_i", reset: "rst_ni"}], |
| bus_interfaces: [ |
| { protocol: "tlul", direction: "device" } |
| ], |
| regwidth: "32", |
| param_list: [ |
| { name: "NumGroups", |
| desc: "Number of clock groups", |
| type: "int", |
| default: "7", |
| local: "true" |
| }, |
| ], |
| |
| countermeasures: [ |
| { name: "BUS.INTEGRITY", |
| desc: "End-to-end bus integrity scheme." |
| }, |
| { name: "TIMEOUT.CLK.BKGN_CHK", |
| desc: "Background check for clock timeout." |
| }, |
| { name: "MEAS.CLK.BKGN_CHK", |
| desc: "Background check for clock frequency." |
| }, |
| { name: "IDLE.INTERSIG.MUBI", |
| desc: "Idle inputs are multibit encoded." |
| } |
| { name: "LC_CTRL.INTERSIG.MUBI", |
| desc: "The life cycle control signals are multibit encoded." |
| } |
| { name: "LC_CTRL_CLK_HANDSHAKE.INTERSIG.MUBI", |
| desc: "The life cycle clock req/ack signals are multibit encoded." |
| } |
| { name: "CLK_HANDSHAKE.INTERSIG.MUBI", |
| desc: "The external clock req/ack signals are multibit encoded." |
| } |
| { name: "DIV.INTERSIG.MUBI", |
| desc: "Divider step down request is multibit encoded." |
| } |
| { name: "JITTER.CONFIG.MUBI", |
| desc: "The jitter enable configuration is multibit encoded." |
| } |
| { name: "IDLE.CTR.REDUN", |
| desc: "Idle counter is duplicated." |
| } |
| { name: "MEAS.CONFIG.REGWEN", |
| desc: "The measurement controls protected with regwen." |
| } |
| { name: "CLK_CTRL.CONFIG.REGWEN", |
| desc: "Software controlled clock requests are proteced with regwen." |
| } |
| ] |
| |
| // Define rstmgr struct package |
| inter_signal_list: [ |
| { struct: "clkmgr_out", |
| type: "uni", |
| name: "clocks", |
| act: "req", |
| package: "clkmgr_pkg", |
| }, |
| |
| { struct: "pwr_clk", |
| type: "req_rsp", |
| name: "pwr", |
| act: "rsp", |
| }, |
| |
| { struct: "clk_dft", |
| type: "uni", |
| name: "dft", |
| act: "rcv", |
| package: "clkmgr_pkg", // This should be moved elsewhere later |
| }, |
| |
| { struct: "clk_hint_status", |
| type: "uni", |
| name: "status", |
| act: "rcv", |
| package: "clkmgr_pkg", |
| }, |
| ], |
| |
| |
| registers: [ |
| { name: "CLK_ENABLES", |
| desc: ''' |
| Clock enable for software gateable clocks. |
| These clocks are direclty controlled by software. |
| ''', |
| swaccess: "rw", |
| hwaccess: "hro", |
| fields: [ |
| { |
| bits: "0", |
| name: "CLK_FIXED_PERI_EN", |
| resval: 1, |
| desc: ''' |
| 0 CLK_FIXED_PERI is disabled. |
| 1 CLK_FIXED_PERI is enabled. |
| ''' |
| } |
| { |
| bits: "1", |
| name: "CLK_USB_48MHZ_PERI_EN", |
| resval: 1, |
| desc: ''' |
| 0 CLK_USB_48MHZ_PERI is disabled. |
| 1 CLK_USB_48MHZ_PERI is enabled. |
| ''' |
| } |
| ] |
| }, |
| |
| { name: "CLK_HINTS", |
| desc: ''' |
| Clock hint for software gateable clocks. |
| These clocks are not fully controlled by software. |
| |
| For disable, software only provides a hint, and hardware determines the final clock state based on the |
| hint and whether the block in question is idle. |
| |
| ''', |
| swaccess: "rw", |
| hwaccess: "hro", |
| fields: [ |
| { |
| bits: "0", |
| name: "CLK_MAIN_AES_HINT", |
| resval: 1, |
| desc: ''' |
| 0 CLK_MAIN_AES can be disabled. |
| 1 CLK_MAIN_AES is enabled. |
| ''' |
| } |
| { |
| bits: "1", |
| name: "CLK_MAIN_HMAC_HINT", |
| resval: 1, |
| desc: ''' |
| 0 CLK_MAIN_HMAC can be disabled. |
| 1 CLK_MAIN_HMAC is enabled. |
| ''' |
| } |
| ] |
| }, |
| |
| { name: "CLK_HINTS_STATUS", |
| desc: ''' |
| Since the final state of !!CLK_HINTS is not always determined by software, |
| this register provides read feedback for the current clock state. |
| |
| ''', |
| swaccess: "ro", |
| hwaccess: "hwo", |
| fields: [ |
| { |
| bits: "0", |
| name: "CLK_MAIN_AES_VAL", |
| resval: 1, |
| desc: ''' |
| 0 CLK_MAIN_AES is disabled. |
| 1 CLK_MAIN_AES is enabled. |
| ''' |
| } |
| { |
| bits: "1", |
| name: "CLK_MAIN_HMAC_VAL", |
| resval: 1, |
| desc: ''' |
| 0 CLK_MAIN_HMAC is disabled. |
| 1 CLK_MAIN_HMAC is enabled. |
| ''' |
| } |
| ] |
| }, |
| ] |
| } |