|  | // Copyright lowRISC contributors. | 
|  | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  | { | 
|  | name: "clkmgr" | 
|  | // TODO: remove the common testplans if not applicable | 
|  | import_testplans: ["hw/dv/tools/dvsim/testplans/csr_testplan.hjson", | 
|  | "hw/dv/tools/dvsim/testplans/intr_test_testplan.hjson", | 
|  | "hw/dv/tools/dvsim/testplans/alert_test_testplan.hjson", | 
|  | "hw/dv/tools/dvsim/testplans/tl_device_access_types_testplan.hjson", | 
|  | "hw/dv/tools/dvsim/testplans/stress_all_with_reset_testplan.hjson", | 
|  | // TODO: Top-level specific Hjson imported here. This will likely be resolved | 
|  | // once we move to IPgen flow. | 
|  | "hw/top_earlgrey/ip/clkmgr/data/autogen/clkmgr_sec_cm_testplan.hjson"] | 
|  | testpoints: [ | 
|  | { | 
|  | name: smoke | 
|  | desc: ''' | 
|  | Smoke test disabling peripheral and transactional clocks. | 
|  |  | 
|  | - Disables all peripheral clocks from their enabled reset state. | 
|  | - Transactional clocks gating depends on whether they are idle. | 
|  | - Initializes all units as busy (not idle). | 
|  | - Clears each unit's `clk_hints` bit, which has no effect until | 
|  | the unit becomes idle. | 
|  | - Sets the unit's `idle_i` bit, which should disable the clock. | 
|  | - Writes both values of the `jitter_enable` CSR. | 
|  |  | 
|  | **Stimulus**: | 
|  | - CSR writes to `clk_enables` and `clk_hints`. | 
|  | - Setting `idle_i` clkmgr input. | 
|  |  | 
|  | **Checks**: | 
|  | - SVA assertions for peripheral clocks enable and disable | 
|  | properties. | 
|  | - Transactional clocks check SVA properties as follows: | 
|  | - If the hint enables it, the clock becomes active. | 
|  | - If the hint disables it but the unit is busy, the clock remains | 
|  | active. | 
|  | - If the hint disables it and the unit is idle, the clock stops. | 
|  | - For transactional units the CSR `clk_hints_status` is checked | 
|  | to correspond to `clk_hints` once the units are idle. | 
|  | - Check in scoreboard the `jitter_en_o` output tracks updates of the | 
|  | `jitter_enable` CSR. | 
|  | ''' | 
|  | milestone: V1 | 
|  | tests: ["clkmgr_smoke"] | 
|  | } | 
|  | { | 
|  | name: peri_enables | 
|  | desc: ''' | 
|  | Peripheral clocks are disabled if its `clk_enables` bit is off, | 
|  | or `pwr_i.ip_clk_en` is off, and `scanmode_i` is not | 
|  | `lc_ctrl_pkg::On`. | 
|  |  | 
|  | This test runs multiple rounds, and on each one it randomizes | 
|  | `ip_clk_en` and `scanmode_i`, and the initial setting of | 
|  | `clk_enables`, it sends a CSR write to `csr_enables` with this | 
|  | initial value followed by a write that flips all bits. | 
|  |  | 
|  | **Checks**: | 
|  | - The scoreboard checks the gated clock activities against its | 
|  | model of the expected behavior. | 
|  | ''' | 
|  | milestone: V2 | 
|  | tests: ["clkmgr_peri"] | 
|  | } | 
|  | { | 
|  | name: trans_enables | 
|  | desc: ''' | 
|  | Transactional unit clocks are disabled if they are not busy and | 
|  | their CSR `clk_hints` bit is off, or `pwr_i.ip_clk_en` is off, | 
|  | and `scanmode_i` is not `lc_ctrl_pkg::On`. | 
|  | This test randomizes `ip_clk_en`, the initial setting of `idle_i` | 
|  | and the desired value of `clk_hints`. Each round performs this | 
|  | sequence: | 
|  | - Writes the desired value to CSR `clk_hints` and checks that the | 
|  | CSR `clk_hints_status` reflects CSR `clk_hints` except for the | 
|  | units not-idle. | 
|  | - Marks all units as idle, and checks that `csr_hints_status` | 
|  | matches `clk_hints`. | 
|  | - Writes `clk_hints` to all ones and checks that `csr_hints_status` | 
|  | is all ones. | 
|  | - Writes `clk_hints` with its reset value. | 
|  |  | 
|  | **Checks**: | 
|  | - SVA assertions for transactional unit clocks described in | 
|  | clkmgr_smoke. | 
|  | ''' | 
|  | milestone: V2 | 
|  | tests: ["clkmgr_trans"] | 
|  | } | 
|  | { | 
|  | name: extclk | 
|  | desc: ''' | 
|  | Tests the functionality of enabling external clocks. | 
|  |  | 
|  | - External clock is enabled if the `lc_clk_byp_req_i` input from | 
|  | `lc_ctrl` is `lc_ctrl_pkg::On`. | 
|  | - External clock is also be enabled when CSR `extclk_ctrl.sel` is | 
|  | set to | 
|  | `lc_ctrl_pkg::On` and the `lc_dtl_en_i` input from `lc_ctrl` is | 
|  | `lc_ctrl_pkg::On`. | 
|  | - Notice writes to the `extclk_ctrl.sel` register are ignored unless | 
|  | the CSR `extclk_ctrl_regwen` is 1. | 
|  | - A successful switch to external clocks due to `lc_clk_byl_req_i` | 
|  | will cause the clkmgr to undo a divide by 2 for io_div4 and | 
|  | io_div2 clocks except when `(scanmode_i == lc_ctrl_pkg::On)`. | 
|  | - A software triggered switch to external clock will undo divides | 
|  | by 2 if `extclk_ctrl.low_speed_sel` is set to `lc_ctrl_pkg::On`. | 
|  |  | 
|  | **Stimulus**: | 
|  | - CSR writes to `extclk_ctrl` and `extclk_ctrl_regwen`. | 
|  | - Setting `lc_hw_debug_en_i`, `lc_clk_byp_req_i`, and the handshake to | 
|  | ast via `ast_clk_byp_req_o` and `ast_clk_byp_ack_i`. | 
|  | - Setting `scanmode_i`. | 
|  |  | 
|  | **Checks**: | 
|  | Clock divider checks are done with SVA assertions. | 
|  | - When the external clock is selected (and not defeated by | 
|  | `scanmode_i` for scoreboard checks): | 
|  | - The `clk_io_div2_powerup` output matches the `clk_io_powerup` | 
|  | output. | 
|  | - The `clk_io_div4_powerup` output matches the `clk_io_powerup` | 
|  | output at half its frequency. | 
|  | - When the external clock is not selected or division is defeated: | 
|  | - The `clk_io_div2_powerup` output matches the `clk_io_powerup` | 
|  | output at half its frequency. | 
|  | - The `clk_io_div4_powerup` output matches the `clk_io_powerup` | 
|  | output at a quarter of its frequency. | 
|  | LC / AST handshake: | 
|  | - When the external clock functionality is triggered the | 
|  | `ast_clk_byp_req_o` output pin is set to `lc_ctrl_pkg::On`. | 
|  | - When `ast_clk_byp_ack_i` is set to `lc_ctrl_pkg::On` in response | 
|  | to a corresponding request: | 
|  | - The clock dividers are stepped down, unless defeated by | 
|  | `scanmode_i` being `lc_ctrl_pkg::On`. | 
|  | - If the initial request was due to the assertion of the | 
|  | `lc_clk_byp_req_i`, the `lc_clk_byp_ack_o` output is set to | 
|  | `lc_ctrl_pkg::On`. | 
|  | ''' | 
|  | milestone: V2 | 
|  | tests: ["clkmgr_extclk"] | 
|  | } | 
|  | { | 
|  | name: clk_status | 
|  | desc: ''' | 
|  | This tests the three `pwr_o.*_status` output ports, for the | 
|  | `io`, `main`, and `usb` clocks. | 
|  |  | 
|  | The `pwr_o.*_status` output must track the correspponding | 
|  | `pwr_i.*_ip_clk_en` input. | 
|  |  | 
|  | **Stimulus**: | 
|  | - Randomize the `pwr_i.*_ip_clk_en` setting for each clock. | 
|  |  | 
|  | **Check**: | 
|  | - The checks are done in SVA at `clkmbf_pwrmgr_sva_if.sv`. | 
|  | ''' | 
|  | milestone: V2 | 
|  | tests: ["clkmgr_clk_status"] | 
|  | } | 
|  | { | 
|  | name: jitter | 
|  | desc: ''' | 
|  | This tests the jitter functionality. | 
|  |  | 
|  | The jitter functionality is implemented by the AST block, but | 
|  | controlled by the `jitter_enable` CSR in this block. This CSR | 
|  | directly drives the `jitter_en_o` output pin. | 
|  |  | 
|  | **Stimulus**: | 
|  | - CSR write to `jitter_enable`. | 
|  |  | 
|  | **Check**: | 
|  | - The `jitter_en_o` output pin reflects the `jitter_enable` CSR. | 
|  | Test is implemented in the scoreboard, and runs always. | 
|  | ''' | 
|  | milestone: V2 | 
|  | tests: ["clkmgr_smoke"] | 
|  | } | 
|  | { | 
|  | name: frequency | 
|  | desc: '''This tests the frequency counters measured count functionality. | 
|  |  | 
|  | These counters compute the number of cycles of some clock relative | 
|  | to the aon timer. It should trigger a recoverable alert when the | 
|  | count is not in the expected interval. This tests programs counts | 
|  | for each counter, with intervals set to trigger correct, fast, and | 
|  | slow counts. | 
|  |  | 
|  | **Stimulus**: | 
|  | - Randomly set slow, correct, and fast interval for each counter | 
|  | and test. | 
|  |  | 
|  | **Check**: | 
|  | - Slow and fast intervals should cause a recoverable alert. | 
|  | - Coverage collected per clock. | 
|  | ''' | 
|  | milestone: V2 | 
|  | tests: ["clkmgr_frequency"] | 
|  | } | 
|  | { | 
|  | name: frequency_timeout | 
|  | desc: '''This tests the frequency counters timeout functionality. | 
|  |  | 
|  | These counters compute the number of cycles of some clock relative | 
|  | to the aon timer. It should trigger a recoverable alert when there | 
|  | is no valid measurement when enabled, leading to a timeout. This is | 
|  | separate from the `frequenty` testpoint to simplify the test checks. | 
|  |  | 
|  | **Stimulus**: | 
|  | - Randomly stop measured clocks to trigger a timeout. | 
|  |  | 
|  | **Check**: | 
|  | - Timeout should cause a recoverable alert. | 
|  | - Coverage collected per clock. | 
|  | ''' | 
|  | milestone: V2 | 
|  | tests: ["clkmgr_frequency_timeout"] | 
|  | } | 
|  | { | 
|  | name: frequency_overflow | 
|  | desc: '''This tests the overflow feature in prim_clock_meas. | 
|  |  | 
|  | This needs to modify the state of the counter to trigger the | 
|  | feature. | 
|  |  | 
|  | **Stimulus**: | 
|  | - Program the counter. Whenever it hits the value of 1, set it to | 
|  | the range - 2. | 
|  |  | 
|  | **Check**: | 
|  | - The internal cnt_ovfl flop is set. | 
|  | - The fast_o output should be set. | 
|  | ''' | 
|  | milestone: V2 | 
|  | tests: ["clkmgr_frequency"] | 
|  | } | 
|  | { | 
|  | name: stress_all | 
|  | desc: '''This runs random sequences in succession. | 
|  |  | 
|  | Randomly chooses from the following sequences: | 
|  | - clkmgr_extclk_vseq, | 
|  | - clkmgr_frequency_timeout_vseq, | 
|  | - clkmgr_frequency_vseq, | 
|  | - clkmgr_peri_vseq, | 
|  | - clkmgr_smoke_vseq, | 
|  | - clkmgr_trans_vseq | 
|  | ''' | 
|  | milestone: V2 | 
|  | tests: ["clkmgr_stress_all"] | 
|  | } | 
|  | ] | 
|  |  | 
|  | covergroups: [ | 
|  | { | 
|  | name: peri_cg | 
|  | desc: ''' | 
|  | Collects coverage for each peripheral clock. | 
|  |  | 
|  | The peripheral clocks depend on a bit in the clk_enables CSR, | 
|  | the ip_clk_en input from pwrmgr, and the scanmode input. | 
|  | This collects the cross of them for each peripheral. | 
|  |  | 
|  | FIXME This is collected in an array, one instance for each clock, | 
|  | but the dvsim coverage flow doesn't yet support arrays. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: trans_cg | 
|  | desc: ''' | 
|  | Collects coverage for each transactional unit clock. | 
|  |  | 
|  | The transactional unit clocks depend on a bit in the clk_hints CSR, | 
|  | the ip_clk_en input from pwrmgr, the respective idle input bit from | 
|  | the unit, and the scanmode input. | 
|  | This collects the cross of them for each transactional unit. | 
|  |  | 
|  | FIXME This is collected in an array, one instance for each clock, | 
|  | but the dvsim coverage flow doesn't yet support arrays. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: extclk_cg | 
|  | desc: ''' | 
|  | Collects coverage for the external clock selection. | 
|  |  | 
|  | The external clock selection depends on the `extclk_ctrl` CSR | 
|  | fields `sel` and `low_speed_sel`, and the `lc_hw_debug_en_i`, | 
|  | `lc_clk_byp_req_i`, and `scanmode_i` input pins. This covergroup | 
|  | collects their cross. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: freq_measure_cg | 
|  | desc: ''' | 
|  | Collects coverage for the frequency measurement counters. | 
|  |  | 
|  | The relevant information is whether it got an okay, slow, or | 
|  | fast measurement, or a timeout. | 
|  | ''' | 
|  | } | 
|  | ] | 
|  | } |