blob: 479f465c08f91c2b4e5e3bbb7564dcb0e019c2e1 [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: "clkmgr"
// TODO: remove the common testplans if not applicable
import_testplans: ["hw/dv/tools/dvsim/testplans/csr_testplan.hjson",
// Disable alert and interrupt tests until RTL adds support.'
// "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"]
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.
**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.
'''
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 `clk_hints` bit is off, or `pwr_i.ip_clk_en` is off,
and `scanmode_i` is not `lc_ctrl_pkg::On`.
This test randomize `ip_clk_en`, the initial setting of `idle_i`
and `clk_hints`, and flips any bit in `clk_hints`. If the
corresponding unit is not idle it waits some cycles and clears its
`idle_i` bit.
**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 clocks can be enabled writing `lc_ctrl_pkg::On` to CSR
`extclk_sel`.
- Writes to CSR `extclk_sel` are ignored unless the value of CSR
`extclk_sel_regwen` is 1.
- Regardless of the `extclk_sel` contents, external clocks won't
be enabled unless `lc_dtl_en_i == lc_ctrl_pkg::On`.
- External clocks can also be enabled if the input
`lc_clk_byp_req_i == lc_ctrl_pkg::On`.
- A successful switch to external clocks will cause the clkmgr
to undo a divide by 2 for io_div4 and io_div2 clocks unless in
scan mode `(scanmode_i == lc_ctrl_pkg::On)`.
**Stimulus**:
- CSR writes to `extclk_sel` and `extclk_sel_regwen`.
- Setting `lc_dft_en_i`, `lc_clk_byp_req_i`, and the handshake to
ast via `ast_clk_byp_req_o` and `ast_clk_byp_ack_i`.
**Checks**:
- SVA assertions:
- `lc_clk_byp_req_i == lc_ctrl_pkg::On` causes
`ast_clk_byp_req_o == lc_ctrl_pkg::On`.
- `extclk_sel == lc_ctrl_pkg::On` and
`lc_dft_en_i == lc_ctrl_pkg::On` causes
`ast_clk_byp_req_o == lc_ctrl_pkg::On`.
- `ast_clk_byp_ack_i == lc_ctrl_pkg::On` causes the divided
clocks to ramp up unless `scanmode_i == lc_ctrl_pkg::On`.
'''
milestone: V2
tests: []
}
]
// The covergroups are arrays, which are yet to be supported by the tools.
covergroups: [
// peri_cg_wrap cover the dependencies of each peripheral clock.
// trans_cg_wrap cover the dependencies of each transactional unit clock.
]
}