| // Copyright lowRISC contributors. | |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| // SPDX-License-Identifier: Apache-2.0 | |
| { name: "entropy_src", | |
| human_name: "Entropy Source", | |
| one_line_desc: "Filters and checks raw entropy bits from a random noise source and forwards them to CSRNG", | |
| one_paragraph_desc: ''' | |
| Entropy Source takes bits from a physically random noise source (external to Entropy Source) and produces random values in a manner that is compliant both with FIPS (through [NIST SP 800-90B][nist-sp-800-90b]) and [CC (AIS31)][bsi-ais31] recommendations. | |
| The random values produced by Entropy Source serve as non-deterministic seeds for CSRNG. | |
| Depending on the mode of operation, Entropy Source can apply a secure hash function to the raw noise bits for conditioning. | |
| To detect statistical defects in the raw noise bits, Entropy Source performs multiple health checks. | |
| [bsi-ais31]: https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Zertifizierung/Interpretationen/AIS_31_Functionality_classes_for_random_number_generators_e.pdf | |
| [nist-sp-800-90b]: https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-90B.pdf | |
| ''' | |
| design_spec: "../doc", | |
| dv_doc: "../doc/dv", | |
| hw_checklist: "../doc/checklist", | |
| sw_checklist: "/sw/device/lib/dif/dif_entropy_src", | |
| version: "1.0", | |
| life_stage: "L1", | |
| design_stage: "D2S", | |
| verification_stage: "V2S", | |
| dif_stage: "S2", | |
| clocking: [{clock: "clk_i", reset: "rst_ni"}], | |
| bus_interfaces: [ | |
| { protocol: "tlul", direction: "device" } | |
| ], | |
| interrupt_list: [ | |
| { name: "es_entropy_valid" | |
| desc: "Asserted when entropy source bits are available."} | |
| { name: "es_health_test_failed" | |
| desc: "Asserted when the alert count has been met."} | |
| { name: "es_observe_fifo_ready" | |
| desc: "Asserted when the observe FIFO has filled to the threshold level."} | |
| { name: "es_fatal_err" | |
| desc: "Asserted when a FIFO error occurs, or if an illegal state machine state is reached."} | |
| ], | |
| inter_signal_list: [ | |
| { struct: "entropy_src_hw_if", | |
| type: "req_rsp", | |
| name: "entropy_src_hw_if", | |
| act: "rsp", | |
| package: "entropy_src_pkg", | |
| } | |
| { struct: "cs_aes_halt" | |
| type: "req_rsp", | |
| name: "cs_aes_halt" | |
| act: "req" | |
| package: "entropy_src_pkg" | |
| } | |
| { struct: "entropy_src_rng", | |
| type: "req_rsp", | |
| name: "entropy_src_rng", | |
| act: "req", | |
| package: "entropy_src_pkg", | |
| } | |
| { struct: "entropy_src_xht", | |
| type: "req_rsp", | |
| name: "entropy_src_xht", | |
| act: "req", | |
| package: "entropy_src_pkg", | |
| } | |
| { struct: "mubi8" | |
| type: "uni" | |
| name: "otp_en_entropy_src_fw_read" | |
| act: "rcv" | |
| package: "prim_mubi_pkg" | |
| } | |
| { struct: "mubi8" | |
| type: "uni" | |
| name: "otp_en_entropy_src_fw_over" | |
| act: "rcv" | |
| package: "prim_mubi_pkg" | |
| } | |
| { struct: "logic" | |
| type: "uni" | |
| name: "rng_fips" | |
| act: "req" | |
| width: 1 | |
| package: "" | |
| } | |
| ], | |
| param_list: [ | |
| { name: "Stub", | |
| type: "bit", | |
| default: "0", | |
| desc: "Stub out the core of entropy_src logic" | |
| local: "false", | |
| expose: "true" | |
| }, | |
| ] | |
| alert_list: [ | |
| { name: "recov_alert", | |
| desc: "This alert is triggered upon the alert health test threshold criteria not met." | |
| } | |
| { name: "fatal_alert", | |
| desc: ''' | |
| This alert triggers for any condition detected in the !!ERR_CODE register, | |
| which includes FIFO errors, COUNTER errors, FSM state errors, | |
| and also when integrity failures are detected on the TL-UL bus. | |
| ''', | |
| } | |
| ], | |
| countermeasures: [ | |
| { name: "CONFIG.REGWEN" | |
| desc: "Registers are protected from writes." | |
| } | |
| { name: "CONFIG.MUBI" | |
| desc: "Registers have multi-bit encoded fields." | |
| } | |
| { name: "CONFIG.REDUN" | |
| desc: "Threshold register has an inverted copy to compare against." | |
| } | |
| { name: "INTERSIG.MUBI" | |
| desc: "OTP signal used to enable software access to registers." | |
| } | |
| { name: "MAIN_SM.FSM.SPARSE" | |
| desc: "The ENTROPY_SRC main state machine uses a sparse state encoding." | |
| } | |
| { name: "ACK_SM.FSM.SPARSE" | |
| desc: "The ENTROPY_SRC ack state machine uses a sparse state encoding." | |
| } | |
| { name: "RNG.BKGN_CHK" | |
| desc: "Random number generator is protected with continuous background health checks." | |
| } | |
| { name: "CTR.REDUN" | |
| desc: "Counter hardening for all health test counters." | |
| } | |
| { name: "CTR.LOCAL_ESC" | |
| desc: "Redundant counter failures will cause a local escalation to the main state machine." | |
| } | |
| { name: "ESFINAL_RDATA.BUS.CONSISTENCY" | |
| desc: "Comparison on successive bus values for the post-conditioned entropy seed bus." | |
| } | |
| { name: "TILE_LINK.BUS.INTEGRITY" | |
| desc: "Tilelink end-to-end bus integrity scheme." | |
| } | |
| // See the KMAC/SHA3 module documentation for additional countermeasures provided by that design" | |
| ], | |
| regwidth: "32", | |
| registers: [ | |
| { name: "ME_REGWEN", | |
| desc: "Register write enable for module enable register", | |
| swaccess: "rw0c", | |
| hwaccess: "none", | |
| fields: [ | |
| { | |
| bits: "0", | |
| desc: ''' When true, the !!MODULE_ENABLE register can be modified. | |
| When false, it becomes read-only. | |
| ''' | |
| resval: 1 | |
| } | |
| ] | |
| }, | |
| { name: "SW_REGUPD", | |
| desc: "Register write enable for control and threshold registers", | |
| swaccess: "rw0c", | |
| hwaccess: "hro", | |
| tags: [// Exclude from writes to these field because they cause side affects. | |
| "excl:CsrAllTests:CsrExclAll"] | |
| fields: [ | |
| { | |
| bits: "0", | |
| desc: ''' When this bit true and the MODULE_ENABLE field is false, | |
| the REGWEN write enable bit read as true, and is distributed to | |
| all associated control and threshold registers. | |
| When false, these registers become read-only. | |
| ''' | |
| resval: 1 | |
| } | |
| ] | |
| }, | |
| { name: "REGWEN", | |
| desc: "Register write enable for all control registers", | |
| swaccess: "ro", // this particular enable bit is meant to be fully HW managed | |
| hwaccess: "hwo", | |
| tags: [// Internal HW can modify status register | |
| "excl:CsrNonInitTests:CsrExclCheck"] | |
| fields: [ | |
| { | |
| bits: "0", | |
| desc: ''' This read-only write enable bit will allow write access | |
| to control and theshold registers that are associated with this bit, | |
| but only when the MODULE_ENABLE field is set to kMultiBitBool4False and the | |
| SW_REGUPD write enable bit is set to true. | |
| When read as false, these registers become read-only. | |
| ''' | |
| resval: 1 | |
| } | |
| ] | |
| }, | |
| { name: "REV", | |
| desc: "Revision register", | |
| swaccess: "ro", | |
| hwaccess: "none", | |
| fields: [ | |
| { bits: "23:16", | |
| name: "CHIP_TYPE", | |
| desc: "Read of this register shows the type of chip using this block.", | |
| resval: "0x1" | |
| } | |
| { bits: "15:8", | |
| name: "HW_REVISION", | |
| desc: "Read of this register shows the revision of this block.", | |
| resval: "0x3" | |
| } | |
| { bits: "7:0", | |
| name: "ABI_REVISION", | |
| desc: "Read of this register shows the ABI of this block.", | |
| resval: "0x3" | |
| } | |
| ] | |
| }, | |
| { name: "MODULE_ENABLE", | |
| desc: "Module enable register", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| regwen: "ME_REGWEN", | |
| tags: [// Exclude from writes to these field because they cause side affects. | |
| "excl:CsrAllTests:CsrExclAll"] | |
| fields: [ | |
| { bits: "3:0", | |
| mubi: true, | |
| name: "MODULE_ENABLE", | |
| desc: ''' | |
| Setting this field to kMultiBitBool4True will enable the ENTROPY_SRC module. Setting | |
| this field to kMultiBitBool4False will effectively reset the module. The modules of | |
| the entropy complex may only be enabled and disabled in a specific order, see | |
| Programmers Guide for details. | |
| ''' | |
| resval: false, | |
| }, | |
| ] | |
| }, | |
| { name: "CONF", | |
| desc: "Configuration register", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| regwen: "REGWEN", | |
| tags: [// Exclude from writes to these field because they cause side affects. | |
| "excl:CsrAllTests:CsrExclAll"] | |
| fields: [ | |
| { bits: "3:0", | |
| name: "FIPS_ENABLE", | |
| mubi: true, | |
| desc: ''' | |
| Setting this field to kMultiBitBool4True will enable FIPS qualified entropy to be | |
| generated. | |
| ''' | |
| resval: false, | |
| }, | |
| { bits: "7:4", | |
| name: "ENTROPY_DATA_REG_ENABLE", | |
| mubi: true, | |
| desc: ''' | |
| Setting this field to kMultiBitBool4True will enable reading entropy values from the | |
| ENTROPY_DATA register. This function also requires that the otp_en_entropy_src_fw_read | |
| input vector is set to the enable encoding. | |
| ''' | |
| resval: false | |
| }, | |
| { bits: "15:12", | |
| name: "THRESHOLD_SCOPE", | |
| mubi: true, | |
| desc: ''' | |
| This field controls the scope (either by-line or by-sum) of the health checks. | |
| If set to kMultiBitBool4True, the Adaptive Proportion and Markov Tests will accumulate all | |
| RNG input lines into a single score, and thresholds will be applied to the sum all | |
| the entropy input lines. If set to kMultiBitBool4False, the RNG input lines are all scored | |
| individually. A statistical deviation in any one input line, be it due to | |
| coincidence or failure, will force rejection of the sample, and count toward the | |
| total alert count. | |
| ''' | |
| resval: false | |
| }, | |
| { bits: "23:20", | |
| name: "RNG_BIT_ENABLE", | |
| mubi: true, | |
| desc: ''' | |
| Setting this field to kMultiBitBool4True enables the single RNG bit mode, where only | |
| one bit is sampled. | |
| ''' | |
| resval: false | |
| }, | |
| { bits: "25:24", | |
| name: "RNG_BIT_SEL", | |
| desc: '''When the above bit iset, this field selects which bit from the RNG bus will | |
| be processed when in single RNG bit mode. | |
| This two bit field selects the RNG bit stream: | |
| 0b00: RNG bit 0 | |
| 0b01: RNG bit 1 | |
| 0b10: RNG bit 2 | |
| 0b11: RNG bit 3 | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "ENTROPY_CONTROL", | |
| desc: "Entropy control register", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| regwen: "REGWEN", | |
| tags: [// Exclude from writes to these field because they cause side affects. | |
| "excl:CsrAllTests:CsrExclAll"] | |
| fields: [ | |
| { bits: "3:0", | |
| name: "ES_ROUTE", | |
| mubi: true, | |
| desc: ''' | |
| Setting this field to kMultiBitBool4True routes the generated entropy value to the ENTROPY_DATA | |
| register to be read by firmware. When this field is kMultiBitBool4False, the generated | |
| entropy will be forwarded out of this module to the hardware interface. | |
| ''' | |
| resval: false | |
| }, | |
| { bits: "7:4", | |
| name: "ES_TYPE", | |
| mubi: true, | |
| desc: ''' | |
| Setting this field to kMultiBitBool4True will bypass the conditioning logic and bring raw entropy | |
| data to the ENTROPY_DATA register. When kMultiBitBool4False, FIPS compliant entropy | |
| will be brought the ENTROPY_DATA register, after being conditioned. | |
| ''' | |
| resval: false | |
| }, | |
| ] | |
| }, | |
| { name: "ENTROPY_DATA", | |
| desc: "Entropy data bits", | |
| swaccess: "ro", | |
| hwaccess: "hrw", | |
| hwext: "true", | |
| hwre: "true", | |
| fields: [ | |
| { bits: "31:0", | |
| desc: "A read of this register provides generated entropy bits to firmware." | |
| } | |
| ] | |
| }, | |
| { name: "HEALTH_TEST_WINDOWS", | |
| desc: "Health test windows register", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| regwen: "REGWEN", | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_WINDOW", | |
| desc: '''This is the window size for all health tests. This value is used in normal mode | |
| when entropy is being tested in FIPS/CC compliance mode. | |
| The default value is (2048 bits * 1 clock/4 bits); | |
| ''' | |
| resval: "0x0200" | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_WINDOW", | |
| desc: '''This is the window size for all health tests when running in bypass mode. This mode | |
| is active after reset for the first and only test run, or when this mode is | |
| programmed by firmware. | |
| The default value is (384 bits * 1 clock/4 bits); | |
| Note that currently only a window size of 384 is supported and tested (this | |
| corresponds to the register default value 0x60). Do not use any other values, | |
| unless you know what you are doing. | |
| ''' | |
| resval: "0x0060" | |
| } | |
| ] | |
| }, | |
| { name: "REPCNT_THRESHOLDS", | |
| desc: "Repetition count test thresholds register", | |
| swaccess: "rw", | |
| hwaccess: "hrw", | |
| hwext: "true", | |
| hwqe: "true", | |
| regwen: "REGWEN", | |
| tags: [// Exclude from writes to these field because they are one-way updates | |
| "excl:CsrNonInitTests:CsrExclWrite"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_THRESH", | |
| desc: '''This is the threshold size for the repetition count health test. | |
| This value is used in normal mode when entropy is being tested in | |
| FIPS/CC compliance mode. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is less than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0xFFFF" | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_THRESH", | |
| desc: '''This is the threshold size for the repetition count health test | |
| running in bypass mode. This mode is active after reset for the | |
| first and only test run, or when this mode is programmed by firmware. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is less than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0xFFFF" | |
| } | |
| ] | |
| }, | |
| { name: "REPCNTS_THRESHOLDS", | |
| desc: "Repetition count symbol test thresholds register", | |
| swaccess: "rw", | |
| hwaccess: "hrw", | |
| hwext: "true", | |
| hwqe: "true", | |
| regwen: "REGWEN", | |
| tags: [// Exclude from writes to these field because they are one-way updates | |
| "excl:CsrNonInitTests:CsrExclWrite"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_THRESH", | |
| desc: '''This is the threshold size for the repetition count symbol health test. | |
| This value is used in normal mode when entropy is being tested in | |
| FIPS/CC compliance mode. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is less than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0xFFFF" | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_THRESH", | |
| desc: '''This is the threshold size for the repetition count symbol health test | |
| running in bypass mode. This mode is active after reset for the | |
| first and only test run, or when this mode is programmed by firmware. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is less than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0xFFFF" | |
| } | |
| ] | |
| }, | |
| { name: "ADAPTP_HI_THRESHOLDS", | |
| desc: "Adaptive proportion test high thresholds register", | |
| swaccess: "rw", | |
| hwaccess: "hrw", | |
| hwext: "true", | |
| hwqe: "true", | |
| regwen: "REGWEN", | |
| tags: [// Exclude from writes to these field because they are one-way updates | |
| "excl:CsrNonInitTests:CsrExclWrite"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_THRESH", | |
| desc: '''This is the threshold size for the adaptive proportion health test. | |
| This value is used in normal mode when entropy is being tested in | |
| FIPS/CC compliance mode. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is less than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0xFFFF" | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_THRESH", | |
| desc: '''This is the threshold size for the adaptive proportion health test | |
| running in bypass mode. This mode is active after reset for the | |
| first and only test run, or when this mode is programmed by firmware. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is less than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0xFFFF" | |
| } | |
| ] | |
| }, | |
| { name: "ADAPTP_LO_THRESHOLDS", | |
| desc: "Adaptive proportion test low thresholds register", | |
| swaccess: "rw", | |
| hwaccess: "hrw", | |
| hwext: "true", | |
| hwqe: "true", | |
| regwen: "REGWEN", | |
| tags: [// Exclude from writes to these field because they are one-way updates | |
| "excl:CsrNonInitTests:CsrExclWrite"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_THRESH", | |
| desc: '''This is the threshold size for the adaptive proportion health test. | |
| This value is used in normal mode when entropy is being tested in | |
| FIPS/CC compliance mode. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is greater than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0x0000" | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_THRESH", | |
| desc: '''This is the threshold size for the adaptive proportion health test | |
| running in bypass mode. This mode is active after reset for the | |
| first and only test run, or when this mode is programmed by firmware. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is greater than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0x0000" | |
| } | |
| ] | |
| }, | |
| { name: "BUCKET_THRESHOLDS", | |
| desc: "Bucket test thresholds register", | |
| swaccess: "rw", | |
| hwaccess: "hrw", | |
| hwext: "true", | |
| hwqe: "true", | |
| regwen: "REGWEN", | |
| tags: [// Exclude from writes to these field because they are one-way updates | |
| "excl:CsrNonInitTests:CsrExclWrite"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_THRESH", | |
| desc: '''This is the threshold size for the bucket health test. | |
| This value is used in normal mode when entropy is being tested in | |
| FIPS/CC compliance mode. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is less than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0xFFFF" | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_THRESH", | |
| desc: '''This is the threshold size for the bucket health test | |
| running in bypass mode. This mode is active after reset for the | |
| first and only test run, or when this mode is programmed by firmware. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is less than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0xFFFF" | |
| } | |
| ] | |
| }, | |
| { name: "MARKOV_HI_THRESHOLDS", | |
| desc: "Markov test high thresholds register", | |
| swaccess: "rw", | |
| hwaccess: "hrw", | |
| hwext: "true", | |
| hwqe: "true", | |
| regwen: "REGWEN", | |
| tags: [// Exclude from writes to these field because they are one-way updates | |
| "excl:CsrNonInitTests:CsrExclWrite"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_THRESH", | |
| desc: '''This is the threshold size for the Markov health test. | |
| This value is used in normal mode when entropy is being tested in | |
| FIPS/CC compliance mode. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is less than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0xFFFF" | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_THRESH", | |
| desc: '''This is the threshold size for the Markov health test | |
| running in bypass mode. This mode is active after reset for the | |
| first and only test run, or when this mode is programmed by firmware. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is less than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0xFFFF" | |
| } | |
| ] | |
| }, | |
| { name: "MARKOV_LO_THRESHOLDS", | |
| desc: "Markov test low thresholds register", | |
| swaccess: "rw", | |
| hwaccess: "hrw", | |
| hwext: "true", | |
| hwqe: "true", | |
| regwen: "REGWEN", | |
| tags: [// Exclude from writes to these field because they are one-way updates | |
| "excl:CsrNonInitTests:CsrExclWrite"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_THRESH", | |
| desc: '''This is the threshold size for the Markov health test. | |
| This value is used in normal mode when entropy is being tested in | |
| FIPS/CC compliance mode. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is greater than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0x0000" | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_THRESH", | |
| desc: '''This is the threshold size for the Markov health test | |
| running in bypass mode. This mode is active after reset for the | |
| first and only test run, or when this mode is programmed by firmware. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is greater than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0x0000" | |
| } | |
| ] | |
| }, | |
| { name: "EXTHT_HI_THRESHOLDS", | |
| desc: "External health test high thresholds register", | |
| swaccess: "rw", | |
| hwaccess: "hrw", | |
| hwext: "true", | |
| hwqe: "true", | |
| regwen: "REGWEN", | |
| tags: [// Exclude from writes to these field because they are one-way updates | |
| "excl:CsrNonInitTests:CsrExclWrite"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_THRESH", | |
| desc: '''This is the threshold size for the external health test. | |
| This value is used in normal mode when entropy is being tested in | |
| FIPS/CC compliance mode. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is less than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0xFFFF" | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_THRESH", | |
| desc: '''This is the threshold size for the external health test | |
| running in bypass mode. This mode is active after reset for the | |
| first and only test run, or when this mode is programmed by firmware. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is less than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0xFFFF" | |
| } | |
| ] | |
| }, | |
| { name: "EXTHT_LO_THRESHOLDS", | |
| desc: "External health test low thresholds register", | |
| swaccess: "rw", | |
| hwaccess: "hrw", | |
| hwext: "true", | |
| hwqe: "true", | |
| regwen: "REGWEN", | |
| tags: [// Exclude from writes to these field because they are one-way updates | |
| "excl:CsrNonInitTests:CsrExclWrite"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_THRESH", | |
| desc: '''This is the threshold size for the external health test. | |
| This value is used in normal mode when entropy is being tested in | |
| FIPS/CC compliance mode. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is greater than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0x0000" | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_THRESH", | |
| desc: '''This is the threshold size for the external health test | |
| running in bypass mode. This mode is active after reset for the | |
| first and only test run, or when this mode is programmed by firmware. | |
| This register must be written before the module is enabled. | |
| Writing to this register will only update the register if the | |
| written value is greater than the current value of this register. | |
| A read from this register always reflects the current value. | |
| ''' | |
| resval: "0x0000" | |
| } | |
| ] | |
| }, | |
| { name: "REPCNT_HI_WATERMARKS", | |
| desc: "Repetition count test high watermarks register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| tags: [// Internal HW can modify status register | |
| "excl:CsrAllTests:CsrExclCheck"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_WATERMARK", | |
| desc: "High watermark value of the REPCNT test in FIPS mode." | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_WATERMARK", | |
| desc: "High watermark value of the REPCNT test in bypass mode." | |
| } | |
| ] | |
| }, | |
| { name: "REPCNTS_HI_WATERMARKS", | |
| desc: "Repetition count symbol test high watermarks register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| tags: [// Internal HW can modify status register | |
| "excl:CsrAllTests:CsrExclCheck"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_WATERMARK", | |
| desc: "High watermark value of the REPCNTS test in FIPS mode." | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_WATERMARK", | |
| desc: "High watermark value of the REPCNTS test in bypass mode." | |
| } | |
| ] | |
| }, | |
| { name: "ADAPTP_HI_WATERMARKS", | |
| desc: "Adaptive proportion test high watermarks register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| tags: [// Internal HW can modify status register | |
| "excl:CsrNonInitTests:CsrExclCheck"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_WATERMARK", | |
| desc: "High watermark value of the adaptive proportion test in FIPS mode." | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_WATERMARK", | |
| desc: "High watermark value of the adaptive proportion test in bypass mode." | |
| } | |
| ] | |
| }, | |
| { name: "ADAPTP_LO_WATERMARKS", | |
| desc: "Adaptive proportion test low watermarks register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| tags: [// Internal HW can modify status register | |
| "excl:CsrNonInitTests:CsrExclCheck"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_WATERMARK", | |
| desc: "Low watermark value of the adaptive proportion test in FIPS mode." | |
| resval: "0xFFFF" | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_WATERMARK", | |
| desc: "Low watermark value of the adaptive proportion test in bypass mode." | |
| resval: "0xFFFF" | |
| } | |
| ] | |
| }, | |
| { name: "EXTHT_HI_WATERMARKS", | |
| desc: "External health test high watermarks register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| tags: [// Internal HW can modify status register | |
| "excl:CsrNonInitTests:CsrExclCheck"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_WATERMARK", | |
| desc: "High watermark value of the external health test in FIPS mode." | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_WATERMARK", | |
| desc: "High watermark value of the external health test in bypass mode." | |
| } | |
| ] | |
| }, | |
| { name: "EXTHT_LO_WATERMARKS", | |
| desc: "External health test low watermarks register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| tags: [// Internal HW can modify status register | |
| "excl:CsrNonInitTests:CsrExclCheck"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_WATERMARK", | |
| desc: "Low watermark value of the external health test in FIPS mode." | |
| resval: "0xFFFF" | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_WATERMARK", | |
| desc: "Low watermark value of the external health test in bypass mode." | |
| resval: "0xFFFF" | |
| } | |
| ] | |
| }, | |
| { name: "BUCKET_HI_WATERMARKS", | |
| desc: "Bucket test high watermarks register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| tags: [// Internal HW can modify status register | |
| "excl:CsrNonInitTests:CsrExclCheck"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_WATERMARK", | |
| desc: "High watermark value of the bucket test in FIPS mode." | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_WATERMARK", | |
| desc: "High watermark value of the bucket test in bypass mode." | |
| } | |
| ] | |
| }, | |
| { name: "MARKOV_HI_WATERMARKS", | |
| desc: "Markov test high watermarks register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| tags: [// Internal HW can modify status register | |
| "excl:CsrNonInitTests:CsrExclCheck"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_WATERMARK", | |
| desc: "High watermark value of the Markov test in FIPS mode." | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_WATERMARK", | |
| desc: "High watermark value of the Markov test in bypass mode." | |
| } | |
| ] | |
| }, | |
| { name: "MARKOV_LO_WATERMARKS", | |
| desc: "Markov test low watermarks register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| tags: [// Internal HW can modify status register | |
| "excl:CsrNonInitTests:CsrExclCheck"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "FIPS_WATERMARK", | |
| desc: "Low watermark value of the Markov test in FIPS mode." | |
| resval: "0xFFFF" | |
| } | |
| { bits: "31:16", | |
| name: "BYPASS_WATERMARK", | |
| desc: "Low watermark value of the Markov test in bypass mode." | |
| resval: "0xFFFF" | |
| } | |
| ] | |
| }, | |
| { name: "REPCNT_TOTAL_FAILS", | |
| desc: "Repetition count test failure counter register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "31:0", | |
| name: "REPCNT_TOTAL_FAILS", | |
| desc: '''This register will hold a running count of test failures observed | |
| during normal operation. It will persist until cleared. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "REPCNTS_TOTAL_FAILS", | |
| desc: "Repetition count symbol test failure counter register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "31:0", | |
| name: "REPCNTS_TOTAL_FAILS", | |
| desc: '''This register will hold a running count of test failures observed | |
| during normal operation. It will persist until cleared. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "ADAPTP_HI_TOTAL_FAILS", | |
| desc: "Adaptive proportion high test failure counter register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "31:0", | |
| name: "ADAPTP_HI_TOTAL_FAILS", | |
| desc: '''This register will hold a running count of test failures observed | |
| during normal operation. It will persist until cleared. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "ADAPTP_LO_TOTAL_FAILS", | |
| desc: "Adaptive proportion low test failure counter register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "31:0", | |
| name: "ADAPTP_LO_TOTAL_FAILS", | |
| desc: '''This register will hold a running count of test failures observed | |
| during normal operation. It will persist until cleared. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "BUCKET_TOTAL_FAILS", | |
| desc: "Bucket test failure counter register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "31:0", | |
| name: "BUCKET_TOTAL_FAILS", | |
| desc: '''This register will hold a running count of test failures observed | |
| during normal operation. It will persist until cleared. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "MARKOV_HI_TOTAL_FAILS", | |
| desc: "Markov high test failure counter register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "31:0", | |
| name: "MARKOV_HI_TOTAL_FAILS", | |
| desc: '''This register will hold a running count of test failures observed | |
| during normal operation. It will persist until cleared. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "MARKOV_LO_TOTAL_FAILS", | |
| desc: "Markov low test failure counter register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "31:0", | |
| name: "MARKOV_LO_TOTAL_FAILS", | |
| desc: '''This register will hold a running count of test failures observed | |
| during normal operation. It will persist until cleared. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "EXTHT_HI_TOTAL_FAILS", | |
| desc: "External health test high threshold failure counter register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "31:0", | |
| name: "EXTHT_HI_TOTAL_FAILS", | |
| desc: '''This register will hold a running count of test failures observed | |
| during normal operation. It will persist until cleared. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "EXTHT_LO_TOTAL_FAILS", | |
| desc: "External health test low threshold failure counter register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "31:0", | |
| name: "EXTHT_LO_TOTAL_FAILS", | |
| desc: '''This register will hold a running count of test failures observed | |
| during normal operation. It will persist until cleared. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "ALERT_THRESHOLD", | |
| desc: "Alert threshold register", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| regwen: "REGWEN", | |
| tags: [// Setting this register needs to not be random. | |
| "excl:CsrNonInitTests:CsrExclWrite"] | |
| fields: [ | |
| { bits: "15:0", | |
| name: "ALERT_THRESHOLD", | |
| desc: '''This is the threshold size that will signal an alert when | |
| value is reached. A value of zero will disable alerts. | |
| The default value is 2. | |
| ''' | |
| resval: "0x0002" | |
| } | |
| { bits: "31:16", | |
| name: "ALERT_THRESHOLD_INV", | |
| desc: '''This should be set to the value above, but inverted. | |
| ''' | |
| resval: "0xfffd" | |
| } | |
| ] | |
| }, | |
| { name: "ALERT_SUMMARY_FAIL_COUNTS", | |
| desc: "Alert summary failure counts register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "15:0", | |
| name: "ANY_FAIL_COUNT", | |
| desc: '''This field will hold a running count of | |
| the total alert count, which is a sum of all of the other | |
| counters in the !!ALERT_FAIL_COUNTS register. | |
| It will be reset after every | |
| passing test sequence. If an alert is signaled, this value | |
| will persist until it is cleared. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "ALERT_FAIL_COUNTS", | |
| desc: "Alert failure counts register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "7:4", | |
| name: "REPCNT_FAIL_COUNT", | |
| desc: '''This field will hold a running count of test failures that | |
| contribute to the total alert count. It will be reset after every | |
| passing test sequence. If an alert is signaled, this value | |
| will persist until it is cleared. | |
| ''' | |
| } | |
| { bits: "11:8", | |
| name: "ADAPTP_HI_FAIL_COUNT", | |
| desc: '''This field will hold a running count of test failures that | |
| contribute to the total alert count. It will be reset after every | |
| passing test sequence. If an alert is signaled, this value | |
| will persist until it is cleared. | |
| ''' | |
| } | |
| { bits: "15:12", | |
| name: "ADAPTP_LO_FAIL_COUNT", | |
| desc: '''This field will hold a running count of test failures that | |
| contribute to the total alert count. It will be reset after every | |
| passing test sequence. If an alert is signaled, this value | |
| will persist until it is cleared. | |
| ''' | |
| } | |
| { bits: "19:16", | |
| name: "BUCKET_FAIL_COUNT", | |
| desc: '''This field will hold a running count of test failures that | |
| contribute to the total alert count. It will be reset after every | |
| passing test sequence. If an alert is signaled, this value | |
| will persist until it is cleared. | |
| ''' | |
| } | |
| { bits: "23:20", | |
| name: "MARKOV_HI_FAIL_COUNT", | |
| desc: '''This field will hold a running count of test failures that | |
| contribute to the total alert count. It will be reset after every | |
| passing test sequence. If an alert is signaled, this value | |
| will persist until it is cleared. | |
| ''' | |
| } | |
| { bits: "27:24", | |
| name: "MARKOV_LO_FAIL_COUNT", | |
| desc: '''This field will hold a running count of test failures that | |
| contribute to the total alert count. It will be reset after every | |
| passing test sequence. If an alert is signaled, this value | |
| will persist until it is cleared. | |
| ''' | |
| } | |
| { bits: "31:28", | |
| name: "REPCNTS_FAIL_COUNT", | |
| desc: '''This field will hold a running count of test failures that | |
| contribute to the total alert count. It will be reset after every | |
| passing test sequence. If an alert is signaled, this value | |
| will persist until it is cleared. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "EXTHT_FAIL_COUNTS", | |
| desc: "External health test alert failure counts register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "3:0", | |
| name: "EXTHT_HI_FAIL_COUNT", | |
| desc: '''This field will hold a running count of test failures that | |
| contribute to the total alert count. It will be reset after every | |
| passing test sequence. If an alert is signaled, this value | |
| will persist until it is cleared. | |
| ''' | |
| } | |
| { bits: "7:4", | |
| name: "EXTHT_LO_FAIL_COUNT", | |
| desc: '''This field will hold a running count of test failures that | |
| contribute to the total alert count. It will be reset after every | |
| passing test sequence. If an alert is signaled, this value | |
| will persist until it is cleared. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "FW_OV_CONTROL", | |
| desc: "Firmware override control register", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| regwen: "REGWEN", | |
| tags: [// Exclude from writes to these field because they cause side affects. | |
| "excl:CsrAllTests:CsrExclAll"] | |
| fields: [ | |
| { bits: "3:0", | |
| name: "FW_OV_MODE", | |
| desc: ''' | |
| Setting this field to kMultiBitBool4True will put the entropy flow in firmware override mode. | |
| In this mode, firmware can monitor the post-health test entropy by reading | |
| the observe FIFO. This function also requires that the otp_en_entropy_src_fw_over | |
| input vector is set to the enable encoding. | |
| ''' | |
| mubi: true, | |
| resval: false | |
| }, | |
| { bits: "7:4", | |
| name: "FW_OV_ENTROPY_INSERT", | |
| desc: ''' | |
| Setting this field to kMultiBitBool4True will switch the input into the pre-conditioner | |
| packer FIFO. Firmware can directly write into the packer FIFO, enabling | |
| the ability to insert entropy bits back into the hardware flow. Firmware | |
| can read data from the health check packer FIFO, then do optional health | |
| checks or optional conditioning, then insert the results back into the flow. | |
| Also, the !!FW_OV_CONTROL.FW_OV_MODE bit must be set. | |
| ''' | |
| mubi: true, | |
| resval: false | |
| }, | |
| ] | |
| }, | |
| { name: "FW_OV_SHA3_START", | |
| desc: "Firmware override sha3 block start control register", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| tags: [// Exclude from writes to these field because they cause side affects. | |
| "excl:CsrAllTests:CsrExclAll"] | |
| fields: [ | |
| { bits: "3:0", | |
| name: "FW_OV_INSERT_START", | |
| desc: ''' | |
| Setting this field to kMultiBitBool4True will instruct the ENTROPY_SRC main state machine | |
| to start the SHA3 process and be ready to accept entropy data. This field should | |
| be set prior to writting the FW_OV_WR_DATA register. Once all data has been written, | |
| this field should be set to kMultiBitBool4False. Once that happened, the SHA3 block will finish | |
| processing and push the result into the ESFINAL FIFO. | |
| Note that clearing this bit to kMultiBitBool4False while there is still unprocessed | |
| entropy in the !!FW_OV_WR_DATA will start the SHA3 engine before data can be added | |
| to the input message, and will also signal a recoverable alert in | |
| !!RECOV_ALERT_STS.ES_FW_OV_DISABLE_ALERT. To avoid this, check that | |
| !!FW_OV_WR_FIFO_FULL is clear before setting this field to kMultiBitBool4False. | |
| ''' | |
| mubi: true, | |
| resval: false | |
| }, | |
| ] | |
| }, | |
| { name: "FW_OV_WR_FIFO_FULL", | |
| desc: "Firmware override FIFO write full status register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "0", | |
| name: "FW_OV_WR_FIFO_FULL", | |
| desc: '''"When this bit is clear, writes to the FW_OV_WR_DATA register are allowed. | |
| If this bit is set, it is the equivalent to a FIFO full condition, and writes | |
| to the FW_OV_WR_DATA register must be delayed until this bit is reset. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "FW_OV_RD_FIFO_OVERFLOW", | |
| desc: "Firmware override Observe FIFO overflow status", | |
| swaccess: "rw0c", | |
| hwaccess: "hwo", | |
| hwext: "false", | |
| fields: [ | |
| { bits: "0", | |
| name: "FW_OV_RD_FIFO_OVERFLOW", | |
| desc: ''' | |
| This bit is set by hardware whenever RNG data is lost due to an overflow condition | |
| in the Observe FIFO. The RNG data rate is slow enough that firmware should always | |
| be able to keep up. This register meanwhile provides an additional check to confirm | |
| that bytes read from the !!FW_OV_RD_DATA register represent contiguous RNG samples. | |
| If an overflow event occurs, this bit must be cleared by software. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "FW_OV_RD_DATA", | |
| desc: "Firmware override Observe FIFO read register", | |
| swaccess: "ro", | |
| hwaccess: "hrw", | |
| hwext: "true", | |
| hwre: "true", | |
| fields: [ | |
| { bits: "31:0", | |
| desc: '''A read of this register pops and returns the top of the Observe FIFO. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "FW_OV_WR_DATA", | |
| desc: "Firmware override FIFO write register", | |
| swaccess: "wo", | |
| hwaccess: "hro", | |
| hwext: "true", | |
| hwqe: "true", | |
| fields: [ | |
| { bits: "31:0", | |
| desc: '''A write to this register will insert entropy back into the entropy source | |
| module flow. Both !!FW_OV_CONTROL.FW_OV_MODE and !!FW_OV_CONTROL.FW_OV_ENTROPY_INSERT bits need to be set | |
| to enable the insertion. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "OBSERVE_FIFO_THRESH", | |
| desc: "Observe FIFO threshold register", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| regwen: "REGWEN", | |
| fields: [ | |
| { bits: "6:0", | |
| desc: '''This field will set the threshold that the depth of the Observe FIFO | |
| will be compared with when setting the interrupt status bit. | |
| Note: a value of zero is reserved and not to be used. | |
| ''' | |
| resval: "0x20" | |
| } | |
| ] | |
| }, | |
| { name: "OBSERVE_FIFO_DEPTH", | |
| desc: "Observe FIFO depth register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "6:0", | |
| desc: '''This field will hold the current depth of the Observe FIFO. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "DEBUG_STATUS", | |
| desc: "Debug status register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| hwext: "true", | |
| fields: [ | |
| { bits: "2:0", | |
| name: "ENTROPY_FIFO_DEPTH", | |
| desc: "This is the depth of the entropy source FIFO." | |
| } | |
| { bits: "5:3", | |
| name: "SHA3_FSM", | |
| desc: "This is the SHA3 finite state machine current state." | |
| } | |
| { bits: "6", | |
| name: "SHA3_BLOCK_PR", | |
| desc: "This is the SHA3 block processed signal current state." | |
| } | |
| { bits: "7", | |
| name: "SHA3_SQUEEZING", | |
| desc: "This is the SHA3 squeezing signal current state." | |
| } | |
| { bits: "8", | |
| name: "SHA3_ABSORBED", | |
| desc: "This is the SHA3 absorbed signal current state." | |
| } | |
| { bits: "9", | |
| name: "SHA3_ERR", | |
| desc: "This is a logic-or of all of the SHA3 error signals." | |
| } | |
| { bits: "16", | |
| name: "MAIN_SM_IDLE", | |
| desc: "The entropy_src main state machine is in the idle state." | |
| resval: 1 | |
| } | |
| { bits: "17", | |
| name: "MAIN_SM_BOOT_DONE", | |
| desc: "The entropy_src main state machine is in the boot phase done state." | |
| } | |
| ] | |
| }, | |
| { | |
| name: "RECOV_ALERT_STS", | |
| desc: "Recoverable alert status register", | |
| swaccess: "rw0c", | |
| hwaccess: "hwo", | |
| fields: [ | |
| { bits: "0", | |
| name: "FIPS_ENABLE_FIELD_ALERT", | |
| desc: ''' | |
| This bit is set when the FIPS_ENABLE field in the !!CONF register is set to | |
| a value other than kMultiBitBool4False or kMultiBitBool4True. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| { bits: "1", | |
| name: "ENTROPY_DATA_REG_EN_FIELD_ALERT", | |
| desc: ''' | |
| This bit is set when the ENTROPY_DATA_REG_ENABLE field in the !!CONF register is set to | |
| a value other than kMultiBitBool4False or kMultiBitBool4True. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| { bits: "2", | |
| name: "MODULE_ENABLE_FIELD_ALERT", | |
| desc: ''' | |
| This bit is set when the MODULE_ENABLE field in the !!MODULE_ENABLE register is set to | |
| a value other than kMultiBitBool4False or kMultiBitBool4True. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| { bits: "3", | |
| name: "THRESHOLD_SCOPE_FIELD_ALERT", | |
| desc: ''' | |
| This bit is set when the THRESHOLD_SCOPE field in the !!CONF register is set to | |
| a value other than kMultiBitBool4False or kMultiBitBool4True. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| { bits: "5", | |
| name: "RNG_BIT_ENABLE_FIELD_ALERT", | |
| desc: ''' | |
| This bit is set when the RNG_BIT_ENABLE field in the !!CONF register is set to | |
| a value other than kMultiBitBool4False or kMultiBitBool4True. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| { bits: "7", | |
| name: "FW_OV_SHA3_START_FIELD_ALERT", | |
| desc: ''' | |
| This bit is set when the FW_OV_SHA3_START field in the !!FW_OV_SHA3_START register is set to | |
| a value other than kMultiBitBool4False or kMultiBitBool4True. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| { bits: "8", | |
| name: "FW_OV_MODE_FIELD_ALERT", | |
| desc: ''' | |
| This bit is set when the FW_OV_MODE field in the !!FW_OV_CONTROL register is set to | |
| a value other than kMultiBitBool4False or kMultiBitBool4True. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| { bits: "9", | |
| name: "FW_OV_ENTROPY_INSERT_FIELD_ALERT", | |
| desc: ''' | |
| This bit is set when the FW_OV_ENTROPY_INSERT field in the !!FW_OV_CONTROL register is set to | |
| a value other than kMultiBitBool4False or kMultiBitBool4True. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| { bits: "10", | |
| name: "ES_ROUTE_FIELD_ALERT", | |
| desc: ''' | |
| This bit is set when the ES_ROUTE field in the !!ENTROPY_CONTROL register is set to | |
| a value other than kMultiBitBool4False or kMultiBitBool4True. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| { bits: "11", | |
| name: "ES_TYPE_FIELD_ALERT", | |
| desc: ''' | |
| This bit is set when the ES_TYPE field in the !!ENTROPY_CONTROL register is set to | |
| a value other than kMultiBitBool4False or kMultiBitBool4True. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| { bits: "12", | |
| name: "ES_MAIN_SM_ALERT", | |
| desc: ''' | |
| This bit is set when the main state machine detects a threshhold failure state. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| { bits: "13", | |
| name: "ES_BUS_CMP_ALERT", | |
| desc: ''' | |
| This bit is set when the interal entropy bus value is equal to the prior | |
| valid value on the bus, indicating a possible attack. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| { bits: "14", | |
| name: "ES_THRESH_CFG_ALERT", | |
| desc: ''' | |
| This bit is set when the !!ALERT_THRESHOLD register is not configured properly. | |
| The upper field must be the exact inverse of the lower field. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| { bits: "15", | |
| name: "ES_FW_OV_WR_ALERT", | |
| desc: ''' | |
| This bit is set when the packer FIFO has been written but was full at the time, | |
| and in both FW_OV_MODE and FW_OV_ENTROPY_INSERT modes. | |
| This alert would normally be the result of not monitoring the !!FW_OV_WR_FIFO_FULL | |
| register before each write to the !!FW_OV_WR_DATA register. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| { bits: "16", | |
| name: "ES_FW_OV_DISABLE_ALERT", | |
| desc: ''' | |
| This bit is set when !!FW_OV_SHA3_START has been set to MuBi4 False, without | |
| waiting for the FW_OV packer FIFO to clear. The final entropy entry in the FIFO | |
| will not be included in the SHA3 digest. (Rather it will be added to the | |
| subsequent SHA3 digest.) To avoid this alert, monitor !!FW_OV_WR_FIFO_FULL before | |
| clearing !!FW_OV_SHA3_START. This alert only applies when both FW_OV_MODE and | |
| FW_OV_ENTROPY_INSERT are set to MuBi4True. | |
| Writing a zero resets this status bit. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { | |
| name: "ERR_CODE", | |
| desc: "Hardware detection of error conditions status register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| fields: [ | |
| { bits: "0", | |
| name: "SFIFO_ESRNG_ERR", | |
| desc: ''' | |
| This bit will be set to one when an error has been detected for the | |
| esrng FIFO. The type of error is reflected in the type status | |
| bits (bits 28 through 30 of this register). | |
| This bit will stay set until the next reset. | |
| ''' | |
| } | |
| { bits: "1", | |
| name: "SFIFO_OBSERVE_ERR", | |
| desc: ''' | |
| This bit will be set to one when an error has been detected for the | |
| observe FIFO. The type of error is reflected in the type status | |
| bits (bits 28 through 30 of this register). | |
| This bit will stay set until the next reset. | |
| ''' | |
| } | |
| { bits: "2", | |
| name: "SFIFO_ESFINAL_ERR", | |
| desc: ''' | |
| This bit will be set to one when an error has been detected for the | |
| esfinal FIFO. The type of error is reflected in the type status | |
| bits (bits 28 through 30 of this register). | |
| This bit will stay set until the next reset. | |
| ''' | |
| } | |
| { bits: "20", | |
| name: "ES_ACK_SM_ERR", | |
| desc: ''' | |
| This bit will be set to one when an illegal state has been detected for the | |
| ES ack stage state machine. This error will signal a fatal alert, and also | |
| an interrupt if enabled. | |
| This bit will stay set until the next reset. | |
| ''' | |
| } | |
| { bits: "21", | |
| name: "ES_MAIN_SM_ERR", | |
| desc: ''' | |
| This bit will be set to one when an illegal state has been detected for the | |
| ES main stage state machine. This error will signal a fatal alert, and also | |
| an interrupt if enabled. | |
| This bit will stay set until the next reset. | |
| ''' | |
| } | |
| { bits: "22", | |
| name: "ES_CNTR_ERR", | |
| desc: ''' | |
| This bit will be set to one when a hardened counter has detected an error | |
| condition. This error will signal a fatal alert, and also | |
| an interrupt if enabled. | |
| This bit will stay set until the next reset. | |
| ''' | |
| } | |
| { bits: "23", | |
| name: "SHA3_STATE_ERR", | |
| desc: ''' | |
| This bit will be set to one when a SHA3 state error has been detected. | |
| This error will signal a fatal alert, and also an interrupt if enabled. | |
| This bit will stay set until the next reset. | |
| ''' | |
| } | |
| { bits: "24", | |
| name: "SHA3_RST_STORAGE_ERR", | |
| desc: ''' | |
| This bit will be set to one when a SHA3_RST_STORAGE_ERR signal being | |
| active has been detected. | |
| This error will signal a fatal alert, and also an interrupt if enabled. | |
| This bit will stay set until the next reset. | |
| ''' | |
| } | |
| { bits: "28", | |
| name: "FIFO_WRITE_ERR", | |
| desc: ''' | |
| This bit will be set to one when any of the source bits (bits 0 through 1 of this | |
| this register) are asserted as a result of an error pulse generated from | |
| any full FIFO that has been recieved a write pulse. | |
| This bit will stay set until the next reset. | |
| ''' | |
| } | |
| { bits: "29", | |
| name: "FIFO_READ_ERR", | |
| desc: ''' | |
| This bit will be set to one when any of the source bits (bits 0 through 1 of this | |
| this register) are asserted as a result of an error pulse generated from | |
| any empty FIFO that has recieved a read pulse. | |
| This bit will stay set until the next reset. | |
| ''' | |
| } | |
| { bits: "30", | |
| name: "FIFO_STATE_ERR", | |
| desc: ''' | |
| This bit will be set to one when any of the source bits (bits 0 through 1 of this | |
| this register) are asserted as a result of an error pulse generated from | |
| any FIFO where both the empty and full status bits are set. | |
| This bit will stay set until the next reset. | |
| ''' | |
| } | |
| ] | |
| }, | |
| { name: "ERR_CODE_TEST", | |
| desc: "Test error conditions register", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| hwqe: "true", | |
| tags: [// Setting this register will force an unwanted fatal alert. | |
| "excl:CsrNonInitTests:CsrExclWrite"] | |
| fields: [ | |
| { | |
| bits: "4:0", | |
| name: "ERR_CODE_TEST", | |
| desc: ''' | |
| Setting this field will set the bit number for which an error | |
| will be forced in the hardware. This bit number is that same one | |
| found in the !!ERR_CODE register. The action of writing this | |
| register will force an error pulse. The sole purpose of this | |
| register is to test that any error properly propagates to either | |
| an interrupt or an alert. | |
| ''' | |
| }, | |
| ] | |
| }, | |
| { name: "MAIN_SM_STATE", | |
| desc: "Main state machine state debug register", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| fields: [ | |
| { bits: "8:0", | |
| name: "MAIN_SM_STATE", | |
| desc: '''This is the state of the ENTROPY_SRC main state machine. | |
| See the RTL file `entropy_src_main_sm` for the meaning of the values. | |
| ''' | |
| resval: 0xf5 | |
| } | |
| ] | |
| }, | |
| ] | |
| } |