| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| { |
| name: "pinmux" |
| import_testplans: ["hw/dv/tools/dvsim/testplans/fpv_csr_testplan.hjson"] |
| testpoints: [ |
| // `mio_to_periph_o` tests. |
| // Symbolic variable `periph_sel_i` is used to select a specific `mio_to_periph_o` pin. |
| { |
| name: InSel0_A |
| desc: '''When register `periph_insel` is set to 0, which means the selected input is constant |
| zero, the corresponding `mio_to_periph_o` must be 0.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: InSel1_A |
| desc: '''When register `periph_insel` is set to 1, which means the selected input is constant |
| one, the corresponding `mio_to_periph_o` must be 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: InSelN_A |
| desc: '''When register `periph_insel` is set to any value between 2 and |
| (2 + number of MioPads) and the select index is not jtag, the corresponding |
| `mio_to_periph_o` must be equal to the related `mio_in_i` value.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: InSelOOB_A |
| desc: '''When register `periph_insel` is set to any value larger than |
| (2 + number of MioPads), the corresponding `mio_to_periph_o` must be 0.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `mio_to_periph_o` backward tests |
| // Symbolic variable `periph_sel_i` is used to select a specific `mio_to_periph_o` pin. |
| { |
| name: MioToPeriph0Backward_A |
| desc: '''`mio_to_periph_o` should output 0 only if one of the following conditions meets: |
| - Register `periph_insel` is set to 0. |
| - The corresponding `mio_in_i` is 0. |
| - Jtag is enabled. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: MioToPeriph1Backward_A |
| desc: '''`mio_to_periph_o` should output 1 only if one of the following conditions meets: |
| - Register `periph_insel` is set to 1. |
| - The corresponding `mio_in_i` is 1. |
| - Jtag is enabled. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `dio_to_periph_o` tests |
| // Symbolic variable `dio_sel_i` is used to select a specific `dio_to_periph_o` pin. |
| { |
| name: DioInSelN_A |
| desc: "This assertion checks that `dio_to_periph_o` is directly connected to `dio_in_i`." |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `mio_out_o` not in sleep_mode tests |
| // Symbolic variable `mio_sel_i` is used to select a specific `mio_out_o` pin. |
| { |
| name: OutSel0_A |
| desc: '''When register `mio_outsel` is set to 0 and is not in sleep mode or jtag, which means |
| the selected output is constant zero, the corresponding `mio_out_o` must be 0.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: OutSel1_A |
| desc: '''When register `mio_outsel` is set to 1 and is not in sleep mode or jtag, which means |
| the selected output is constant one, the corresponding `mio_out_o` must be 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: OutSel2_A |
| desc: '''When register `mio_outsel` is set to 2 and is not in sleep mode or jtag, which means |
| the selected output is driving high-Z, the corresponding `mio_out_o` must be 0.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: OutSelN_A |
| desc: '''When register `mio_outsel` is set to any value between 3 and |
| (3 + Number of periph out) and is not in sleep mode or jtag, the corresponding |
| `mio_out_o` must be equal to the related `periph_to_mio_i` value.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: OutSelOOB_A |
| desc: '''When register `mio_outsel` is set to any value larger than |
| (3 + Number of periph out) and is not in sleep mode, the corresponding `mio_out_o` must |
| be 0.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `mio_out_o` backward tests |
| // Symbolic variable `mio_sel_i` is used to select a specific `mio_out_o` pin. |
| { |
| name: MioOut0Backward_A |
| desc: '''`mio_out_o` should output 0 only if one of the following conditions meets: |
| - Register `mio_insel` is set to 0 or 2. |
| - The corresponding `periph_to_mio_i` is 0. |
| - Sleep mode is enabled. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: MioOut1Backward_A |
| desc: '''`mio_out_o` should output 1 only if one of the following conditions meets: |
| - Register `mio_insel` is set to 1. |
| - The corresponding `periph_to_mio_i` is 1. |
| - Sleep mode is enabled. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `mio_oe_o` not in sleep_mode tests |
| // Symbolic variable `mio_sel_i` is used to select a specific `mio_out_o` pin. |
| { |
| name: OutSelOe0_A |
| desc: '''When register `mio_outsel` is set to 0 and is not in sleep mode or jtag, the |
| corresponding `mio_oe_o` must be 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: OutSelOe1_A |
| desc: '''When register `mio_outsel` is set to 1 and is not in sleep mode or jtag, the |
| corresponding `mio_oe_o` must be 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: OutSelOe2_A |
| desc: '''When register `mio_outsel` is set to 2 and is not in sleep mode or jtag, which |
| indicates driving high-Z to the selected output, the corresponding `mio_oe_o` must |
| be 0.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: OutSelOeN_A |
| desc: '''When register `mio_outsel` is set to any value between 3 and |
| (3 + Number of periph out) and is not in sleep mode or jtag, the corresponding |
| `mio_oe_o` must be equal to the related `periph_to_mio_oe_i` value.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: OutSelOeOOB_A |
| desc: '''When register `mio_outsel` is set to any value larger than |
| (3 + Number of periph out) and is not in sleep mode, the corresponding `mio_oe_o` must |
| be 0.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `mio_oe_o` backward tests |
| // Symbolic variable `mio_sel_i` is used to select a specific `mio_oe_o` pin. |
| { |
| name: MioOe0Backward_A |
| desc: '''`mio_oe_o` should output 0 only if one of the following conditions meets: |
| - Register `mio_insel` is set to 2. |
| - The corresponding `periph_to_mio_oe_i` is 0. |
| - Sleep mode is enabled. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: MioOe1Backward_A |
| desc: '''`mio_oe_o` should output 1 only if one of the following conditions meets: |
| - Register `mio_insel` is set to 0 or 1. |
| - The corresponding `periph_to_mio_oe_i` is 1. |
| - Sleep mode is enabled. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `mio_out_o` in sleep mode tests |
| // Symbolic variable `mio_sel_i` is used to select a specific `mio_out_o` pin. |
| { |
| name: MioSleepMode0_A |
| desc: '''At posedge of `sleep_en_i`, if register `mio_pad_sleep_en` is 1 and |
| `mio_pad_sleep_mode` is 0, which means the pad is driven zero in deep sleep mode. |
| If, in the meantime, register `mio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `mio_out_o` must be 0.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: MioSleepMode1_A |
| desc: '''At posedge of `sleep_en_i`, if register `mio_pad_sleep_en` is 1 and |
| `mio_pad_sleep_mode` is 1, which means the pad is driven one in deep sleep mode. |
| In the meantime, if register `mio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `mio_out_o` must be 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: MioSleepMode2_A |
| desc: '''At posedge of `sleep_en_i`, if register `mio_pad_sleep_en` is 1 and |
| `mio_pad_sleep_mode` is 2, which means the pad is driven high-Z in deep sleep mode. |
| In the meantime, if register `mio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `mio_out_o` must be 0.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: MioSleepMode3_A |
| desc: '''At posedge of `sleep_en_i`, if register `mio_pad_sleep_en` is 1 and |
| `mio_pad_sleep_mode` is 3, which means the pad keeps last driven value in deep sleep |
| mode. |
| In the meantime, if register `mio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `mio_out_o` should be stable. |
| ''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: MioSleepStable_A |
| desc: '''If not at posedge of `sleep_en_i`, and in the meantime register |
| `mio_pad_sleep_status` is not written via TLUL interface to clear the sleep status, the |
| corresponding `mio_out_o` should be stable. |
| ''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `mio_oe_o` in sleep mode tests |
| // Symbolic variable `mio_sel_i` is used to select a specific `mio_oe_o` pin. |
| { |
| name: MioOeSleepMode0_A |
| desc: '''At posedge of `sleep_en_i`, if register `mio_pad_sleep_en` is 1 and |
| `mio_pad_sleep_mode` is 0, which means the pad is driven zero in deep sleep mode. |
| In the meantime, if register `mio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `mio_oe_o` must be 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: MioOeSleepMode1_A |
| desc: '''At posedge of `sleep_en_i`, if register `mio_pad_sleep_en` is 1 and |
| `mio_pad_sleep_mode` is 1, which means the pad is driven one in deep sleep mode. |
| In the meantime, if register `mio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `mio_oe_o` must be 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: MioOeSleepMode2_A |
| desc: '''At posedge of `sleep_en_i`, if register `mio_pad_sleep_en` is 1 and |
| `mio_pad_sleep_mode` is 2, which means the pad is driven high-Z in deep sleep mode. |
| In the meantime, if register `mio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `mio_oe_o` must be 0.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: MioOeSleepMode3_A |
| desc: '''At posedge of `sleep_en_i`, if register `mio_pad_sleep_en` is 1 and |
| `mio_pad_sleep_mode` is 3, which means the pad keeps last driven value in deep sleep |
| mode. |
| In the meantime, if register `mio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `mio_oe_o` should be stable. |
| ''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: MioOeSleepStable_A |
| desc: '''If not at posedge of `sleep_en_i`, and in the meantime, if register |
| `mio_pad_sleep_status` is not written via TLUL interface to clear the sleep status, the |
| corresponding `mio_oe_o` should be stable. |
| ''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `mio_out_o` sleep mode related backward tests |
| // Symbolic variable `mio_sel_i` is used to select a specific `mio_out_o` pin. |
| { |
| name: MioSleep0Backward_A |
| desc: '''`mio_out_o` should output 0 only if one of the following conditions meets: |
| - In sleep mode, register `mio_pad_sleep_mode` is set to 0 or 2. |
| - In sleep mode, previous `mio_out_o` is 0 and `mio_pad_sleep_mode` is set to 3. |
| - In sleep mode, previous `mio_out_o` is 0 and input `sleep_en_i` is not at posedge. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: MioSleep1Backward_A |
| desc: '''`mio_out_o` should output 1 only if one of the following conditions meets: |
| - In sleep mode, register `mio_pad_sleep_mode` is set to 1. |
| - In sleep mode, previous `mio_out_o` is 1 and `mio_pad_sleep_mode` is set to 3. |
| - In sleep mode, previous `mio_out_o` is 1 and input `sleep_en_i` is not at posedge. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `mio_oe_o` sleep mode related backward tests |
| // Symbolic variable `mio_sel_i` is used to select a specific `mio_oe_o` pin. |
| { |
| name: MioOeSleep0Backward_A |
| desc: '''`mio_oe_o` should output 0 only if one of the following conditions meets: |
| - In sleep mode, register `mio_pad_sleep_mode` is set to 2. |
| - In sleep mode, previous `mio_oe_o` is 0 and `mio_pad_sleep_mode` is set to 3. |
| - In sleep mode, previous `mio_oe_o` is 0 and input `sleep_en_i` is not at posedge. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: MioOeSleep1Backward_A |
| desc: '''`mio_oe_o` should output 1 only if one of the following conditions meets: |
| - In sleep mode, register `mio_pad_sleep_mode` is set to 0 or 1. |
| - In sleep mode, previous `mio_oe_o` is 1 and `mio_pad_sleep_mode` is set to 3. |
| - In sleep mode, previous `mio_oe_o` is 1 and input `sleep_en_i` is not at posedge. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `dio_out_o` not in sleep mode tests |
| // Symbolic variable `dio_sel_i` is used to select a specific `dio_out_o` pin. |
| { |
| name: DOutSelN_A |
| desc: "`dio_out_o` is connected to `periph_to_dio_i` if not in sleep mode." |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `dio_oe_o` not in sleep mode tests |
| // Symbolic variable `dio_sel_i` is used to select a specific `dio_oe_o` pin. |
| { |
| name: DOutSelOeN_A |
| desc: "`dio_oe_o` is connected to `periph_to_dio_oe_i` if not in sleep mode." |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `dio_out_o` in sleep mode tests |
| // Symbolic variable `dio_sel_i` is used to select a specific `dio_out_o` pin. |
| { |
| name: DioSleepMode0_A |
| desc: '''At posedge of `sleep_en_i`, if register `dio_pad_sleep_en` is 1 and |
| `dio_pad_sleep_mode` is 0, which means the pad is driven zero in deep sleep mode. |
| In the meantime, if register `dio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `dio_out_o` must be 0.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DioSleepMode1_A |
| desc: '''At posedge of `sleep_en_i`, if register `dio_pad_sleep_en` is 1 and |
| `dio_pad_sleep_mode` is 1, which means the pad is driven one in deep sleep mode. |
| In the meantime, if register `dmio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `dio_out_o` must be 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DioSleepMode2_A |
| desc: '''At posedge of `sleep_en_i`, if register `dio_pad_sleep_en` is 1 and |
| `dio_pad_sleep_mode` is 2, which means the pad is driven high-Z in deep sleep mode. |
| In the meantime, if register `dio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `dio_out_o` must be 0.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DioSleepMode3_A |
| desc: '''At posedge of `sleep_en_i`, if register `dio_pad_sleep_en` is 1 and |
| `dio_pad_sleep_mode` is 3, which means the pad keeps last driven value in deep sleep |
| mode. |
| In the meantime, if register `dio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `dio_out_o` should be stable. |
| ''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DioSleepStable_A |
| desc: '''If not at posedge of `sleep_en_i`, and in the meantime, if register |
| `dio_pad_sleep_status` is not written via TLUL interface to clear the sleep status, the |
| corresponding `dio_out_o` should be stable. |
| ''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `dio_oe_o` in sleep mode tests |
| // Symbolic variable `dio_sel_i` is used to select a specific `dio_oe_o` pin. |
| { |
| name: DioOeSleepMode0_A |
| desc: '''At posedge of `sleep_en_i`, if register `dio_pad_sleep_en` is 1 and |
| `dio_pad_sleep_mode` is 0, which means the pad is driven zero in deep sleep mode. |
| In the meantime, if register `dio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `dio_oe_o` must be 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DioOeSleepMode1_A |
| desc: '''At posedge of `sleep_en_i`, if register `dio_pad_sleep_en` is 1 and |
| `dio_pad_sleep_mode` is 1, which means the pad is driven one in deep sleep mode. |
| In the meantime, if register `dio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `dio_oe_o` must be 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DioOeSleepMode2_A |
| desc: '''At posedge of `sleep_en_i`, if register `dio_pad_sleep_en` is 1 and |
| `dio_pad_sleep_mode` is 2, which means the pad is driven high-Z in deep sleep mode. |
| In the meantime, if register `dio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `dio_oe_o` must be 0.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DioOeSleepMode3_A |
| desc: '''At posedge of `sleep_en_i`, if register `dio_pad_sleep_en` is 1 and |
| `dio_pad_sleep_mode` is 3, which means the pad keeps last driven value in deep sleep |
| mode. |
| In the meantime, if register `dio_pad_sleep_status` is not written via TLUL interface |
| to clear the sleep status, the corresponding `dio_oe_o` should be stable. |
| ''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DioOeSleepStable_A |
| desc: '''If not at posedge of `sleep_en_i`, and in the meantime, if register |
| `dio_pad_sleep_status` is not written via TLUL interface to clear the sleep status, the |
| corresponding `dio_oe_o` should be stable. |
| ''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `dio_out_o` backward tests |
| // Symbolic variable `dio_sel_i` is used to select a specific `dio_out_o` pin. |
| { |
| name: Dio0Backward_A |
| desc: '''`dio_out_o` should output 0 only if one of the following conditions meets: |
| - The corresponding `periph_to_dio_i` is 0. |
| - In sleep mode, register `dio_pad_sleep_mode` is set to 0 or 2. |
| - In sleep mode, previous `dio_out_o` is 0 and `dio_pad_sleep_mode` is set to 3. |
| - In sleep mode, previous `dio_out_o` is 0 and input `sleep_en_i` is not at posedge. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: Dio1Backward_A |
| desc: '''`dio_out_o` should output 1 only if one of the following conditions meets: |
| - The corresponding `periph_to_dio_i` is 1. |
| - In sleep mode, register `dio_pad_sleep_mode` is set to 1. |
| - In sleep mode, previous `dio_out_o` is 1 and `dio_pad_sleep_mode` is set to 3. |
| - In sleep mode, previous `dio_out_o` is 1 and input `sleep_en_i` is not at posedge. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `dio_oe_o` backward tests |
| // Symbolic variable `dio_sel_i` is used to select a specific `dio_oe_o` pin. |
| { |
| name: DioOe0Backward_A |
| desc: '''`dio_oe_o` should output 0 only if one of the following conditions meets: |
| - The corresponding `periph_to_dio_i` is 0. |
| - In sleep mode, register `dio_pad_sleep_mode` is set to 2. |
| - In sleep mode, previous `dio_oe_o` is 0 and `dio_pad_sleep_mode` is set to 3. |
| - In sleep mode, previous `dio_oe_o` is 0 and input `sleep_en_i` is not at posedge. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DioOe1Backward_A |
| desc: '''`dio_oe_o` should output 1 only if one of the following conditions meets: |
| - The corresponding `periph_to_dio_i` is 1. |
| - In sleep mode, register `dio_pad_sleep_mode` is set to 0 or 1. |
| - In sleep mode, previous `dio_oe_o` is 1 and `dio_pad_sleep_mode` is set to 3. |
| - In sleep mode, previous `dio_oe_o` is 1 and input `sleep_en_i` is not at posedge. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `mio_pad_attr_o` tests |
| { |
| name: MioAttrO_A |
| desc: '''`mio_attr_o` should be equal to corresponding `mio_pad_attr` register value and |
| TargetCfg's mio_pad_type configuration.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: MioJtagAttrO_A |
| desc: "If jtag is enabled, the jtag `mio_attr_o` index should be equal to 0." |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `dio_pad_attr_o` tests |
| { |
| name: DioAttrO_A |
| desc: '''`dio_attr_o` should be equal to corresponding `dio_pad_attr` register value and |
| TargetCfg's dio_pad_type configuration.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `pin_wkup_req_o` tests |
| // Symbolic variable `wkup_sel_i` is used to select a specific wkup_cause. |
| // Variable `final_pin_val` is created to capture selected wakeup pins based on register |
| // `wkup_detector_padsel` and `wkup_detector.filter`. |
| { |
| name: WkupPosedge_A |
| desc: '''When register `wkup_detector_en` is set to 1 and `wkup_detector.mode` is set to 0, |
| which means rising edge is used to detect wakeup. If variable `final_pin_val` is at |
| posedge then `wkup_cause` register's `de` attribute should be set to 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: WkupNegedge_A |
| desc: '''When register `wkup_detector_en` is set to 1 and `wkup_detector.mode` is set to 1, |
| which means falling edge is used to detect wakeup. If variable `final_pin_val` is at |
| negedge, then `wkup_cause` register's `de` attribute should be set to 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: WkupEdge_A |
| desc: '''When register `wkup_detector_en` is set to 1 and `wkup_detector.mode` is set to 2, |
| which means either rising or falling edge is used to detect wakeup. If variable |
| `final_pin_val` is at posedge or negedge, then `wkup_cause` register's `de` attribute |
| should be set to 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: WkupTimedHigh_A |
| desc: '''When register `wkup_detector_en` is set to 1 and `wkup_detector.mode` is set to 3, |
| which means postive pulse cycles are used to detect wakeup. If variable `final_pin_val` |
| stays high longer than the threshold, then `wkup_cause` register's `de` attribute |
| should be set to 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: WkupTimedLow_A |
| desc: '''When register `wkup_detector_en` is set to 1 and `wkup_detector.mode` is set to 4, |
| which means negative pulse cycles are used to detect wakeup. If variable `final_pin_val` |
| stays low longer than the threshold, then `wkup_cause` register's `de` attribute should |
| be set to 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: WkupCauseQ_A |
| desc: '''When `wkup_cause` register's `de` attribute is set to 1 and user is not writing to |
| `wkup_cause` at the same cycle, then `wkup_cause.q` should be set to 1.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: AonWkupO_A |
| desc: '''When register `wkup_cause` is 1, `pin_wkup_req_o` should also be 1. |
| `pin_wkup_req_o` is 0 only when all `wkup_cause` registers are 0.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `pin_wkup_req_o` backward tests |
| { |
| name: WkupCause0_A |
| desc: "Register `wkup_cause` is 0 only when none of the above wakeup conditions is met." |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: WkupCause1_A |
| desc: "Register `wkup_cause` is 1 when at least one of the above wakeup conditions is met." |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `lc_jtag_o` tests |
| { |
| name: LcJtagWoScanmode_A |
| desc: '''Not in scanmode, when tap_strap select LC_tap, `lc_jtag_o` must be equal to the |
| corresponding `mio_in_i` pins based on the `TargetCfg` configuration.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: LcJtagWScanmode_A |
| desc: '''In scanmode, when tap_strap select LC_tap, `lc_jtag_o` must be equal to the |
| corresponding `mio_in_i` pins based on the `TargetCfg` configuration except the |
| `jtag_trst` pin, which must be equal to `rst_ni`.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: LcJtagODefault_A |
| desc: "`lc_jtag_o` should stay 0 if tap_strap did not select LC_tap." |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: LcJtagOBackward_A |
| desc: '''`lc_jtag_o` pins are equal to the corresponding `mio_in_i` inputs if one of the |
| following conditions are met: |
| - Lc Jtag is disabled and the corresponding pins are 0. |
| - Lc Jtag is enabled. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `rv_jtag_o` tests |
| { |
| name: RvJtagWoScanmode_A |
| desc: '''Not in scanmode, when tap_strap select RV_tap and `lc_hw_debug_en_i` input is On for |
| the past two clock cycles due to the synchronizer, then `rv_jtag_o` must be equal to |
| the corresponding `mio_in_i` pins based on the `TargetCfg` configuration.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: RvJtagWScanmode_A |
| desc: '''In scanmode, When tap_strap select RV_tap and `lc_hw_debug_en_i` is On for the past |
| two clock cycles due to the synchronizer, then `rv_jtag_o` must be equal to the |
| corresponding `mio_in_i` pins based on the `TargetCfg` configuration except the |
| `jtag_trst` pin, which must be equal to `rst_ni`. |
| ''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: RvJtagODefault_A |
| desc: '''`rv_jtag_o` should stay 0 if tap_strap did not select RV_tap or `lc_hw_debug_en_i` |
| input is Off for the past two clock cycles due to the synchronizer.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: RvJtagOBackward_A |
| desc: '''`rv_jtag_o` pins are equal to the corresponding `mio_in_i` inputs if one of the |
| following conditions are met: |
| - Rv Jtag is disabled and the corresponding pins are 0. |
| - Rv Jtag is enabled. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| |
| // `dft_jtag_o` tests |
| { |
| name: DftJtagWoScanmode_A |
| desc: '''Not in scanmode, when tap_strap select DFT_tap and `lc_dft_en_i` is On for the past |
| two clock cycles due to the synchronizer, `lc_jtag_o` must be equal to the |
| corresponding `mio_in_i` pins based on the `TargetCfg` configuration.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DftJtagWScanmode_A |
| desc: '''In scanmode, when tap_strap select DFT_tap and `lc_dft_en_i` is On for the past |
| two clock cycles due to the synchronizer, `lc_jtag_o` must be equal to the |
| corresponding `mio_in_i` pins based on the `TargetCfg` configuration except the |
| `jtag_trst` pin, which must be equal to `rst_ni`.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DftJtagODefault_A |
| desc: '''`dft_jtag_o` should stay 0 if tap_strap did not select DFT_tap or the `lc_dft_en_i` |
| input is Off for the past two clock cycles due to the synchronizer.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DftJtagOBackward_A |
| desc: '''`dft_jtag_o` pins are equal to the corresponding `mio_in_i` inputs if one of the |
| following conditions are met: |
| - Dft Jtag is disabled and the corresponding pins are 0. |
| - Dft Jtag is enabled. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DftJtagO1Backward_A |
| desc: '''`dft_jtag_o` pins are ones if one of the following conditions are met: |
| - Dft Jtag is enabled and the corresponding pins are 1. |
| ''' |
| stage: V2 |
| tests: ["pinmux_assert"] |
| } |
| |
| { |
| name: TapStrap_A |
| desc: '''If `dft_hold_tap_sel_i` is 0 and `lc_dft_en_i` is On for the past two clock cycles |
| due to the synchronizer, or `strap_en_i` is 1. |
| And in the meantime, if `lc_hw_debug_en_i` is On for the past two clock cycles due to |
| the synchronizer, then tap_strap must be equal to the past value of corresponding |
| `mio_in_i`. |
| ''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: TapStrap0_A |
| desc: '''If `dft_hold_tap_sel_i` is 0 and `lc_dft_en_i` is On for the past two clock cycles |
| due to the synchronizer, or `strap_en_i` is 1. |
| Then tap_strap[0] must be equal to the past value of corresponding `mio_in_i`. |
| ''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // Jtag pinmux output tests |
| { |
| name: LcJtagI_A |
| desc: '''When Lc tap is selected, the corresponding `mio_out_o` and `mio_out_oe` should be |
| equal to `lc_jtag_i`.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: RvJtagI_A |
| desc: '''When Rv tap is selected and `lc_hw_debug_en_i` is On for the past two clock cycles |
| due to the synchronizer, the corresponding `mio_out_o` and `mio_out_oe` should be equal |
| to `rv_jtag_i`.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DftJtagI_A |
| desc: '''When Dft tap is selected and `lc_dft_en_i` is On for the past two clock cycles |
| due to the synchronizer, the corresponding `mio_out_o` and `mio_out_oe` should be equal |
| to `dft_jtag_i`.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // Dft `strap_test_o` tests |
| { |
| name: DftStrapTestO_A |
| desc: '''When `lc_dft_en_i` is On for the past two clock cycles due to the synchronizer, |
| `dft_strap_test_o.valid` must be 1, and `dft_strap_test_o.straps` should be equal to |
| the corresponding `mio_in_i` index.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DftStrapTestOValidStable_A |
| desc: "`dft_strap_test_o.valid` once set to 1 will stay high until reset." |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: DftStrapTestOStrapStable_A |
| desc: "`dft_strap_test_o.valid` once set, `dft_strap_test_o.straps` should stay stable." |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| |
| // USB related IOs. |
| // Current plan is to only check connectivity via assertions because usbdev design is fully |
| // verified separately in a DV testbench. |
| { |
| name: UsbSleepEnI_A |
| desc: "`sleep_en_i` should be connected directly to usbdev's `low_power_alw_i`." |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: UsbDppullupEnUpwrI_A |
| desc: '''`usb_dppullup_en_upwr_i` should be connected directly to usbdev's |
| `usb_dppullup_en_upwr_i`.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: UsbDnpullupEnUpwrI_A |
| desc: '''`usb_dnpullup_en_upwr_i` should be connected directly to usbdev's |
| `usb_dnpullup_en_upwr_i`.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: UsbDppullupEnO_A |
| desc: '''`usb_dppullup_en_o` should be connected directly to usbdev's |
| `usb_dppullup_en_o`.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: UsbDnpullupEnO_A |
| desc: '''`usb_dnpullup_en_o` should be connected directly to usbdev's |
| `usb_dnpullup_en_o`.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: UsbOutOfRstI_A |
| desc: "`usb_out_of_rst_i` should be connected directly to usbdev's `usb_out_of_rst_upwr_i`." |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: UsbAonWakeEnUpwrI_A |
| desc: '''`usb_aon_wake_en_i` should be connected directly to usbdev's |
| `usb_aon_wake_en_upwr_i`.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: UsbAonWakeAckUpwrI_A |
| desc: '''`usb_aon_wake_ack_i` should be connected directly to usbdev's |
| `usb_aon_woken_upwr_i`.''' |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: UsbSuspendI_A |
| desc: "`usb_suspend_i` should be connected directly to usbdev's `usb_suspended_upwr_i`." |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: UsbWkupReqO_A |
| desc: "`usb_wkup_req_o` should be connected directly to usbdev's `wake_rep_alw_o`." |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: UsbBusResetO_A |
| desc: "`usb_bus_reset_o` should be connected directly to usbdev's `bus_reset_alw_o`." |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: UsbSenseLostO_A |
| desc: "`usb_sense_lost_o` should be connected directly to usbdev's `bus_lost_alw_o`." |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| { |
| name: UsbStateDebugO_A |
| desc: "`usb_state_debug_o` should be connected directly to usbdev's `bus_debug_o`." |
| stage: V1 |
| tests: ["pinmux_assert"] |
| } |
| ] |
| } |