// 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",
                     "hw/dv/tools/dvsim/testplans/sec_cm_count_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.
            '''
    }
  ]
}
