|  | // Copyright lowRISC contributors. | 
|  | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  | { | 
|  | name: "entropy_src" | 
|  | 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", | 
|  | "entropy_src_sec_cm_testplan.hjson"] | 
|  | testpoints: [ | 
|  | { | 
|  | name: smoke | 
|  | desc: ''' | 
|  | Enable entropy_src, wait for interrupt, verify entropy. | 
|  | ''' | 
|  | stage: V1 | 
|  | tests: ["entropy_src_smoke"] | 
|  | } | 
|  | { | 
|  | name: firmware | 
|  | desc: ''' | 
|  | Verify ability to access entropy register based on value of efuse input | 
|  | Verify sw_regupd, me_regwen bits enables/disables write access to control registers | 
|  | Verify control registers are read-only while DUT is enabled | 
|  | Verify registers at End-Of-Test | 
|  | ''' | 
|  | stage: V2 | 
|  | tests: ["entropy_src_smoke", "entropy_src_fw_ov", "entropy_src_rng"] | 
|  | } | 
|  | { | 
|  | name: firmware_mode | 
|  | desc: ''' | 
|  | Verify health_checks aren't active | 
|  | Verify bypass active | 
|  | Verify read FIFO | 
|  | - Random FIFO depths | 
|  | ''' | 
|  | stage: V2 | 
|  | tests: ["entropy_src_fw_ov"] | 
|  | } | 
|  | { | 
|  | name: rng_mode | 
|  | desc: ''' | 
|  | Verify rng entropy | 
|  | - Random FIFO depths | 
|  | - Random rates | 
|  | - Verify single_bit_mode for all bit_selector values | 
|  | Verify FIPS bits match predicted | 
|  | ''' | 
|  | stage: V2 | 
|  | tests: ["entropy_src_rng"] | 
|  | } | 
|  | { | 
|  | name: health_checks | 
|  | desc: ''' | 
|  | Verify AdaptProp, RepCnt, RepCntSym, Bucket, Markov health check results | 
|  | match predicted. | 
|  | - Generate passing and failing raw entropy streams | 
|  | - Random window sizes | 
|  | - Default and random hi/lo bypass/fips thresholds | 
|  | - Enables/fail counts/clears | 
|  | - Verify hi/lo bypass/fips watermarks | 
|  | - Verify External health check behaves as predicted | 
|  | - Verify outputs match internal reg values/entropy bus | 
|  | - Pulse inputs and verify captured | 
|  | - Verify health testing stops when no demand for entropy | 
|  | ''' | 
|  | stage: V2 | 
|  | tests: ["entropy_src_rng"] | 
|  | } | 
|  | { | 
|  | name: conditioning | 
|  | desc: ''' | 
|  | Verify genbits seeds in bypass mode as predicted. | 
|  | Verify genbits seeds after sha3 conditioning as predicted. | 
|  | ''' | 
|  | stage: V2 | 
|  | tests: ["entropy_src_rng"] | 
|  | } | 
|  | { | 
|  | name: interrupts | 
|  | desc: ''' | 
|  | Verify es_entropy_valid interrupt asserts as predicted. | 
|  | Verify es_health_test_failed interrupt asserts as predicted. | 
|  | Verify es_fifo_err interrupt asserts as predicted. | 
|  | ''' | 
|  | stage: V2 | 
|  | tests: ["entropy_src_rng"] | 
|  | } | 
|  | { | 
|  | name: alerts | 
|  | desc: ''' | 
|  | Verify that all recoverable alerts are asserted as expected. | 
|  | Any alerts not encountered as part of the usual entropy_src_rng test will be generated | 
|  | by the `entropy_src_functional_alerts` test. | 
|  | ''' | 
|  | stage: V2 | 
|  | tests: ["entropy_src_functional_alerts", "entropy_src_rng"] | 
|  | } | 
|  | { | 
|  | name: stress_all | 
|  | desc: ''' | 
|  | Combine the individual test points while injecting TL errors and | 
|  | running CSR tests in parallel. | 
|  | ''' | 
|  | stage: V2 | 
|  | tests: ["entropy_src_stress_all"] | 
|  | } | 
|  | { | 
|  | name: functional_errors | 
|  | desc: ''' | 
|  | Verify that all possible classes of fatal errors (FIFOs, Counters, state machine | 
|  | exceptions, etc.) have been generated.  These errors typically violate assumptions | 
|  | made by the scoreboard, and thus cannot be managed by other tests. | 
|  | ''' | 
|  | stage: V2 | 
|  | tests: ["entropy_src_functional_errors"] | 
|  | } | 
|  | ] | 
|  | covergroups: [ | 
|  | { | 
|  | name: err_test_cg | 
|  | desc: ''' | 
|  | Covers that the ERR_CODE_TEST register has been tested for all 9 valid test values: | 
|  | - 0: SFIFO_ESRNG_ERR | 
|  | - 1: SFIFO_OBSERVE_ERR | 
|  | - 2: SFIFO_ESFINAL_ERR | 
|  | - 20: ES_ACK_SM_ERR | 
|  | - 21: ES_MAIN_SM_ERR | 
|  | - 22: ES_CNTR_ERR | 
|  | - 28: FIFO_WRITE_ERR | 
|  | - 29: FIFO_READ_ERR | 
|  | - 30: FIFO_STATE_ERR | 
|  | Each test bit should then trigger the corresponding alerts and error status bits. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: mubi_err_cg | 
|  | desc: ''' | 
|  | Covers that all 11 register fields with built in redundancy (All multi-bit encoded | 
|  | except for ALERT_THRESHOLD) have been programmed with at least one one invalid mubi | 
|  | value, and that the corresponding recoverable alert has been registered.  This | 
|  | includes the 10 boolean register fields which are MultiBit encoded as well as the | 
|  | ALERT_THRESHOLD register, which is a pair of numeric values which must be inverses | 
|  | of each other. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: sm_err_cg | 
|  | desc: ''' | 
|  | Covers that both the MAIN_SM and ACK_SM have been forced into an invalid state, | 
|  | and this state error has been successfully detected, the appropriate alerts have | 
|  | been signalled, and the error has been sucessfully reported in the error CSRs. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: fifo_err_cg | 
|  | desc: ''' | 
|  | Covers that all three fifos (the esrng fifo, the observe fifo, and the esfinal fifo) | 
|  | have all been forced into the three error states (write overflow, read underflow, | 
|  | and invalid state), and the error has sucessfully generated an alert and that | 
|  | the alert is successfully reported in the the ERR_CODE register. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: cntr_err_cg | 
|  | desc: ''' | 
|  | Covers that all counter-related fatal errors have been tested by forcing the | 
|  | respective redundant counters to be mismatched from each other. | 
|  | - which_cntr (0 to 5), 6 possible counter errors, window counter, repcnt ht counter, | 
|  | repcnts ht counter, adaptive proportion ht counter, bucket ht counter and | 
|  | markov ht counter | 
|  | - which_cntr_replicate (0 to RNG_BUS_WIDTH-1), reptcnt, adaptp, markov health tests | 
|  | have RNG_BUS_WIDTH copies of counters | 
|  | - which_bin (0 to 2<sup>RNG_BUS_WIDTH</sup>-1), bucket health test has | 
|  | 2<sup>RNG_BUS_WIDTH</sup> copies of counters | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: csrng_hw_cg | 
|  | desc: ''' | 
|  | Covers that data output is observed at the CSRNG HW interface for | 
|  | all possible modes of operation, including: | 
|  | - CONF.FIPS_ENABLE (True and False) | 
|  | - CONF.ENTROPY_DATA_REG_ENABLE (True and False) | 
|  | - CONF.THRESHOLD_SCOPE (True and False) | 
|  | - CONF.RNG_BIT_ENABLE (True and False) | 
|  | - CONF.RNG_BIT_SEL (0 to 3) | 
|  | - ENTROPY_CONTROL.ES_TYPE (True and False) | 
|  | - FW_OV_MODE (True or False) | 
|  | - FW_OV_ENTROPY_INSERT (True or False) | 
|  | In addition to the above, the following settings are illegal when sampling on | 
|  | this covergroup, and merit the creation of illegal_bins | 
|  | - ENTROPY_CONTROL.ES_ROUTE = True | 
|  |  | 
|  | Since the scoreboard permits data to be dropped or rejected by the entropy source we | 
|  | must explicitly confirm that the data is observed at the outputs for all possible | 
|  | configurations. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: seed_output_csr_cg | 
|  | desc: ''' | 
|  | Covers that data output is observed at the entropy_data CSR interfaces for | 
|  | all possible modes of operation, including: | 
|  | - CONF.FIPS_ENABLE (True and False) | 
|  | - CONF.THRESHOLD_SCOPE (True and False) | 
|  | - CONF.RNG_BIT_ENABLE (True and False) | 
|  | - CONF.RNG_BIT_SEL (0 to 3) | 
|  | - ENTROPY_CONTROL.ES_TYPE (True and False) | 
|  | - FW_OV_MODE (True or False) | 
|  | - FW_OV_ENTROPY_INSERT (True or False) | 
|  | In addition to the above, the following settings are illegal when sampling on the | 
|  | this covergroup, and merit the creation of illegal_bins | 
|  | - ENTROPY_CONTROL.ES_ROUTE = False | 
|  | - CONF.ENTROPY_DATA_REG_ENABLE = False | 
|  |  | 
|  | Since the scoreboard permits data to be dropped or rejected by the entropy source we | 
|  | must explicitly confirm that the data is observed at the outputs for all possible | 
|  | configurations. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: observe_fifo_event_cg | 
|  | desc: ''' | 
|  | Covers that data output is observed at the fw_ov_rd_data CSE interface for | 
|  | all possible modes of operation, including: | 
|  | - CONF.FIPS_ENABLE (True and False) | 
|  | - CONF.ENTROPY_DATA_REG_ENABLE (True and False) | 
|  | - CONF.THRESHOLD_SCOPE (True and False) | 
|  | - CONF.RNG_BIT_ENABLE (True and False) | 
|  | - CONF.RNG_BIT_SEL (0 to 3) | 
|  | - ENTROPY_CONTROL.ES_ROUTE (True and False), If True, data must be observed at the | 
|  | ENTROPY_DATA CSR.  If False, data must be observed at the CSRNG port. | 
|  | - ENTROPY_CONTROL.ES_TYPE (True and False) | 
|  | - FW_OV_MODE (True or False) | 
|  | - FW_OV_ENTROPY_INSERT (True or False) | 
|  | Since the scoreboard permits data to be dropped by the entropy source we | 
|  | must explicitly confirm that the data is observed at this output for all possible | 
|  | configurations. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: sw_update_cg | 
|  | desc: ''' | 
|  | Covers that the TB has attempted to update DUT configurations while the module is | 
|  | enabled, to ensure that the sw_regupd CSR is working | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: win_ht_cg | 
|  | desc: ''' | 
|  | Covers a range of window sizes for each windowed health test.  For each test we need: | 
|  | - Test: ADAPTB, BUCKET, MARKOV. | 
|  | No cross between tests. EXT HT, though windowed, is not used or covered at this time | 
|  | - window_size: {384, 512, 1024, 2048, 4096, plus other non-powers of two} | 
|  | - Result: HT Pass and Failure | 
|  | - Hi or Low: Was the current sample a pass or a fail for the high threshold or the | 
|  | low threshold? | 
|  | Note: This covergroup covers a wide range of window sizes but does not cover a range | 
|  | of threshold values. See win_ht_deep_threshold_cg for threshold coverpoints. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: win_ht_deep_threshold_cg | 
|  | desc: ''' | 
|  | Covers a range of thresholds values for a focused set of window sizes.  For each test we | 
|  | need: | 
|  | - Test: ADAPTB, BUCKET, MARKOV, REPCNT, and REPTCNTS. | 
|  | No cross between tests. EXT HT, though it is a windowed test, is not covered at this | 
|  | time. | 
|  | - Window Size: Covers only the most common window sizes of 384, 1024 and 2048 | 
|  | - Result: HT Pass and Failure. | 
|  | - Hi or Low: Was the current sample a pass or a fail for the high threshold or the | 
|  | low threshold? | 
|  | - By-line: Was the test applied on a by-line basis or across all lines? | 
|  | - Threshold Significance Buckets.  There is some sublety in choosing the range of | 
|  | thresholds bins as the choice of thresholds depends heavily choice of window size. | 
|  | The output of each health test will be tighly clustered near some average | 
|  | value, and the health test threshold serves to tag outliers from this average. | 
|  | - For instance, when averaging over all lines, the output of the ADAPTP test should | 
|  | on average be close to WINSIZE/2, and the high and low thresholds will be placed | 
|  | on either side of this midpoint.  This means however that the thresholds used for | 
|  | a window size of 2048 should both be somewhere close to 1024.  Such thresholds | 
|  | would be meaningless for a window size of 384, as there is no way the test can | 
|  | ever output values near 1024 for such a small window. | 
|  | - Rather than choosing fixed threshold bins we choose bins based on <it>threshold | 
|  | significance</it>, or how stringent the given threshold would be in detecting | 
|  | deviations from the average value.  Tighter thresholds will more quickly detect | 
|  | statistical defects in the incoming noise stream, but will also more frequently | 
|  | indicate false positives for health test defects. | 
|  | - We use the following bins for threshold significance: | 
|  | - 0 to 1 sigma: Greater than 1 in 3 chance of false positive. With frequent | 
|  | failures, this range is very good for testing the alert subsystem. | 
|  | - 1 to 2 sigma: 2.5% chance of a false positive. | 
|  | - 2 to 4.5 sigma: False positives are more frequent than 1 in 2<sup>20</sup> | 
|  | - 4.5 to 7 sigma: Covers the NIST recommended range for keeping the rate of | 
|  | false positives within the range of 1 in 2<sup>20</sup> to 1 in 2<sup>40<sup>. | 
|  | - Above 7 sigma: If using idealized noise sources these thresholds would yield | 
|  | false positive rates less than 1 part in 2<sup>40</sup> making these | 
|  | thresholds too relaxed for the recommendations in NIST SP 80-900B.  However | 
|  | for imperfect noise sources with realistic statistical defects, which are to | 
|  | be expected and must be compensated for, thresholds in these ranges may be | 
|  | needed for practical operation, and so there should be at least one bin for | 
|  | these threshold significance values. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: cont_ht_cg | 
|  | desc: ''' | 
|  | Covers a range of thresholds and configurations for the continuous health tests: REPCNT | 
|  | (the repetition count test), and REPCNTS (the symbol based repetition count test). | 
|  | The primary cover points are the test_type (REPCNT vs. REPCNTS), the pass or fail value | 
|  | of the test, and the "score". The score is a generalization of the numerical value of | 
|  | the test output, which accounts for the fact it is far more likely to see high values | 
|  | from the REPCNT test than the REPCNTS test, and is computed by multiplying the numerical | 
|  | values of the REPCNTS test by RNG_BUS_WIDTH.  Much like the windowed health tests which | 
|  | generalize the test thresholds in terms of "sigma" values, the "score" places the REPCNT | 
|  | and REPCNTS values on equal footing when generating cross bins. For an ideal noise | 
|  | distribution on each RNG bus line, the probablity of a given "score" should be the same | 
|  | for the two tests, under the observation that a coincidental repetition of all bus lines | 
|  | is as likely as RNG_BUS_WIDTH repetitions of a single line. | 
|  |  | 
|  | The `cp_score` coverpoint covers a range of values for the test output score (1-5, 6-10, | 
|  | 11-20, 21-40, and above 41).  For an idealized noise source the coincidental probability | 
|  | of a given score, n, is roughly 2<sup>-n</sup>, and thus it is envisioned that typically | 
|  | thresholds will be set to detect failures somewhere in the score range of 20-40, to fall | 
|  | in line with the guidance in SP 800-90B that the false positive rate for these tests | 
|  | should lie in the range of 2<sup>-40</sup> to 2<sup>-20</sup>. | 
|  |  | 
|  | In addition to the score, pass-fail status and the test type, this covergroup also has | 
|  | coverpoints for other configurations such as the RNG bit select mode and the fips-mode | 
|  | selection status (True or False), as well as a large number of crosspoints. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: alert_cnt_cg | 
|  | desc: ''' | 
|  | Covers a range of values (1, 2, 3-6, 6-10, plus > 10) for ALERT_THRESHOLD. | 
|  | To be sampled when a HT alert fires. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: observe_fifo_threshold_cg | 
|  | desc: ''' | 
|  | Covers a range of values (1-63) for OBSERVE_FIFO_THRESH. Coverage bins | 
|  | include the lowest value (1), the highest value (63) and four bins in between. | 
|  | Interrupts and data must be observed for all bins.  Thus this covergroup | 
|  | should be sampled after an interrupt has fired and OBSERVE_FIFO_THRESH | 
|  | words have been read from the FIFO. | 
|  | Note: The value of 0 should never generate an interrupt, a constraint that | 
|  | must be checked in the scoreboard. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: one_way_ht_threshold_reg_cg | 
|  | desc: ''' | 
|  | Checks that all of the health test registers have been exercised and that the one-way | 
|  | update feature (which prohibits thresholds being relaxed after reset) works for both | 
|  | the FIPS and Bypass thresholds. | 
|  | ''' | 
|  | } | 
|  | { | 
|  | name: recov_alert_cg | 
|  | desc: ''' | 
|  | This covergroup has a single coverpoint that ensures that every active bit in the | 
|  | "recov_alert_sts" register has been triggered. This coverpoint is thus complementary to | 
|  | the mubi_err_cg, fifo_err_cg, and sm_err_cg covergroups though it also covers a number | 
|  | of other recoverable errors, such as violations of the FW_OV usage model, or errors | 
|  | internal to the SHA conditioning unit. | 
|  | ''' | 
|  | } | 
|  | ] | 
|  | } |