[csrng/doc] Application Interface and Genbits update
This PR dramaitically expands the technical specification for the CSRNG IP. It
includes:
-Decription of the application interface
-Structure of the per-instance working state
-Command Structure, and
-Block Diagrams.
Co-Authored by @mwbranstad and @martin-lueker
Signed-off-by: Martin Lueker-Boden <martin.lueker-boden@wdc.com>
diff --git a/hw/ip/csrng/data/csrng.hjson b/hw/ip/csrng/data/csrng.hjson
new file mode 100755
index 0000000..dfb6a9d
--- /dev/null
+++ b/hw/ip/csrng/data/csrng.hjson
@@ -0,0 +1,234 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+{ name: "csrng",
+ clock_primary: "clk_i",
+ bus_device: "tlul",
+ bus_host: "none",
+ param_list: [
+ { name: "NHwApps",
+ type: "int",
+ default: "3",
+ desc: "Number of CSRNG hardware applications",
+ local: "true"
+ }
+ ],
+ interrupt_list: [
+ { name: "cs_cmd_req_done"
+ desc: "Asserted when a command request is completed."}
+ { name: "cs_fifo_err"
+ desc: "Asserted when a FIFO error occurs."}
+ { name: "cs_hw_inst_exc"
+ desc: "Asserted when a hardware-attached CSRNG instance encounters a command exception"}
+ ],
+ inter_signal_list: [
+ { struct: "csrng", // csrng_req_t, csrng_rsp_t
+ type: "req_rsp",
+ name: "csrng_cmd",
+ act: "rsp",
+ width: "3",
+ package: "csrng_pkg",
+ }
+ { struct: "entropy_src_hw_if"
+ type: "req_rsp",
+ name: "entropy_src_hw_if"
+ act: "req"
+ width: 1
+ package: "entropy_src_pkg"
+ }
+ { struct: "logic"
+ type: "uni"
+ name: "efuse_sw_app_enable"
+ act: "rcv"
+ width: 1
+ package: ""
+ }
+ ],
+ regwidth: "32",
+ registers: [
+ { name: "REGEN",
+ desc: "Register write enable for all control registers",
+ swaccess: "rw1c",
+ hwaccess: "hro",
+ fields: [
+ {
+ bits: "0",
+ desc: '''
+ When true, the writeable registers can be modified.
+ When false, they become read-only. Defaults true, write one to clear. Note that this needs to be
+ cleared after initial configuration at boot in order to lock in the listed register settings.
+ '''
+ resval: 1
+ },
+ ]
+ },
+ { name: "CTRL",
+ desc: "Control register",
+ swaccess: "rw",
+ hwaccess: "hro",
+ regwen: "REGEN",
+ fields: [
+ {
+ bits: "0",
+ name: "ENABLE",
+ desc: '''
+ Setting this bit will enable the CSRNG module. The application interface for software
+ (register based) will be enabled only if the respective efuse input is enabled.
+ '''
+ },
+ {
+ bits: "1",
+ name: "AES_CIPHER_DISABLE",
+ desc: '''
+ Setting this bit will disable the AES cipher core module. If set, then commands will
+ bypass the AES cipher core, but still move through the logical flow of CSRNG.
+ This mode is primarily for debug purposes.
+ '''
+ },
+ {
+ bits: "19:16",
+ name: "FIFO_DEPTH_STS_SEL",
+ desc: "This field will select which FIFO depth will be read out for diagnostic purposes."
+ },
+ ]
+ },
+ {
+ name: "SUM_STS",
+ desc: "Summary status register",
+ swaccess: "ro",
+ hwaccess: "hwo",
+ fields: [
+ { bits: "23:0",
+ name: "FIFO_DEPTH_STS",
+ desc: "These bits show the current status of the CRSNG FIFO depths."
+ }
+ { bits: "31",
+ name: "DIAG",
+ desc: "This this an internal generic diagnostic bit."
+ }
+ ]
+ },
+ {
+ name: "CMD_REQ",
+ desc: "Command request register",
+ swaccess: "wo",
+ hwaccess: "hro",
+ hwqe: "true",
+ regwen: "REGEN",
+ fields: [
+ { bits: "31:0",
+ name: "CMD_REQ",
+ desc: '''
+ Writing this request with defined CSRNG commands will initiate all
+ possible CSRNG actions. The application interface must wait for the
+ "ack" to return before issuing new commands.
+ '''
+ }
+ ]
+ },
+ {
+ name: "CMD_STS",
+ desc: "Command status register",
+ swaccess: "rw",
+ hwaccess: "hwo",
+ fields: [
+ { bits: "0",
+ name: "CMD_RDY",
+ desc: '''This bit indicates when the command interface is ready to accept commands.
+ '''
+ }
+ { bits: "1",
+ name: "CMD_ACK",
+ desc: '''This bit is set when the command request has completed. This bit must
+ be cleared before a new request is made.
+ '''
+ }
+ { bits: "4",
+ name: "CMD_STS",
+ desc: '''
+ This one bit field is the status code returned with the application command ack.
+ 0b0: Request completed successfully
+ 0b1: Request completed with an error
+ '''
+ }
+ ]
+ },
+ {
+ name: "GENBITS_VLD",
+ desc: "Generate bits returned valid register",
+ swaccess: "ro",
+ hwaccess: "hwo",
+ hwext: "true",
+ fields: [
+ { bits: "0",
+ name: "GENBITS_VLD",
+ desc: "This bit is set when genbits are available on this application interface."
+ }
+ { bits: "1",
+ name: "GENBITS_FIPS",
+ desc: "This bit is set when genbits are FIPS/CC compliant."
+ }
+ ]
+ },
+ {
+ name: "GENBITS",
+ desc: "Generate bits returned register",
+ swaccess: "ro",
+ hwaccess: "hrw",
+ hwext: "true",
+ hwre: "true",
+ fields: [
+ { bits: "31:0",
+ name: "GENBITS",
+ desc: '''
+ Reading this register will get the generated bits that were requested with
+ the generate request. This register must be four times for each request
+ number made. For example, a application command generate request with
+ a `creq` value of 4 requires this register to be read 16 times to get all
+ of the data out of the FIFO path.
+ '''
+ }
+ ]
+ },
+ {
+ name: "HW_EXC_STS",
+ desc: "Hardware instance exception status register",
+ swaccess: "ro",
+ hwaccess: "hwo",
+ fields: [
+ { bits: "14:0",
+ name: "HW_EXC_STS",
+ desc: '''
+ Reading this register indicates whether one of the CSRNG HW instances has
+ encountered an exception. Each bit corresponds to a particular hardware
+ instance, with bit 0 corresponding to instance HW0, bit 1 corresponding
+ to instance HW1, and so forth. (To monitor the status of requests made
+ to the SW instance, check the CMD_STS register). Uninstantiating the
+ effected hardware instance, usually by a reset of the attached EDN,
+ resets the corresponding status bit.
+ '''
+ }
+ { bits: "16",
+ name: "CMD_ERR",
+ desc: '''
+ Indicates that at least one of the instances encountered an exception
+ due to an illegal command sequence (for example, requesting a generate
+ operation from an uninstantiated instance, or exceeding the
+ allowed seed life). In this case, one can recover by uninstantiating
+ the instance, and reinstantiating it.
+ '''
+ }
+ { bits: "17",
+ name: "ENTROPY_ERR",
+ desc: '''
+ Indicates that at least one of the affected instances was unable to perform an
+ instantiation or reseed operation due to a failure of the entropy source.
+ Troubleshooting the entropy source may be required. Once the entropy
+ source has been reinitiated, the effected instances can be reinitialized
+ by uninstantiating and reinstantiating them.
+ '''
+ }
+ ]
+ }
+ ]
+}
diff --git a/hw/ip/csrng/doc/_index.md b/hw/ip/csrng/doc/_index.md
index 9422e61..41898eb 100644
--- a/hw/ip/csrng/doc/_index.md
+++ b/hw/ip/csrng/doc/_index.md
@@ -16,11 +16,12 @@
However, the terms "DRBG" or "NRBG" are specifically used when respectively referring to SP 800-90A or SP 800-90C requirements.
Meanwhile, when addressing requirements which originate from AIS31 we refer to the specific DRG.3 or PTG.3 classes of RNGs.
-This IP block is attached to the chip interconnect bus as a peripheral module conforming to the [Comportable guideline for peripheral functionality]({{< relref "doc/rm/comportability_specification" >}}), but also has direct hardware links to other IPs for secure and software-inaccessible transmission of random numbers.
+This IP block is attached to the chip interconnect bus as a peripheral module conforming to the [Comportable guideline for peripheral functionality]({{< relref "doc/rm/comportability_specification" >}}), but also has direct hardware links to other IPs for secure and software-inaccessible transmission of random numbers. The bus connections to peripheral modules is done using the CSRNG application interface. This interface allows peripherals to manage CSRNG instances, and request for obfuscated entropy to be returned from the CSRNG module.
## Features
- Provides support for both deterministic (DRNG) and true random number generation (TRNG), when combined with a secure entropy source (i.e. one constructed and implemented in compliance with SP 800-90A,B,C and AIS31).
- Compliant with NIST and BSI recommendations for random number generation.
+- Hardware peripherals and software applications issue commands to dedicated RNG instances through a common application interface.
- In deterministic mode, meets the requirements given in AIS31 for a DRG.3 class deterministic random number generator (DRNG) meaning it provides Forward Secrecy and Enhanced Backward Secrecy.
- Utilizes the CTR_DRBG construction specified in NIST SP 800-90A, qualifying it as a NIST-approved DRBG (deterministic random bit generator).
- Operates at 256 bit security strength.
@@ -43,19 +44,18 @@
- Implementation follows the NRBG "Oversampling Construction" approved by SP 800-90C, to meet both CC and FIPS TRNG constructions.
- In addition to the approved DRNG mode, any instance can also operate in "Fully Deterministic mode", meaning the seed depends entirely on application inputs or personalization strings.
- This provides an approved means of seed construction in FIPS 140-2 as described in the [FIPS 140-2 Implementation Guidance](https://csrc.nist.gov/csrc/media/projects/cryptographic-module-validation-program/documents/fips140-2/fips1402ig.pdf), section 7.14, resolution point 2(a).
-
+
## Description
Though the recommendations in AIS31 are based around broad functional requirements, the recommendations in SP 800-90 are very prescriptive in nature, outlining the exact constructs needed for approval.
Thus the interface and implementation are largely driven by these explicit constructs, particularly the CTR_DBRG construct.
-
The CSRNG IP consists of four main components:
1. An AES primitive
-2. The CTR_DRBG state-machine (CTR_DRBG_FSM) which drives the AES primitive, performing the various encryption sequences prescribed for approved DRBGs in SP 800-90A.
+2. The CTR_DRBG state-machine (`ctr_drbg_fsm`) which drives the AES primitive, performing the various encryption sequences prescribed for approved DRBGs in SP 800-90A.
These include:
- 1. **The Derivation Function:**
+ 1. **The Derivation Function:**
Part of the instantiation and reseed routines, this routine assembles the previous seed material (on reseed only), application inputs, and entropy.
2. **The Instantiation Routine:**
Combines application inputs, external entropy and nonce (more entropy) via the derivation function.
@@ -64,8 +64,8 @@
4. **The Generate Routine:**
Generates up to CSRNG_MAX_GENERATE random bits.
If called with prediction_resistance_flag, forces a reseed.
- 5. **The Update Routine:**
- Updates the internal state of the DRNG instance after each generate call.
+ 5. **The Update Routine:**
+ Updates the internal state of the DRNG instance after each generate call.
3. State vectors for each DRNG instance.
4. Interface logic and access control for each instance.
@@ -91,3 +91,425 @@
However, if used unqualified, the term "entropy" should be understood to refer to physical entropy strings which are obtained in accordance with SP 800-90C.
That is either physical entropy, or the output of a DRNG which itself has been seeded (and possibly reseeded) with physical entropy.
In CC terms, "entropy strings" (when used in this document without a qualifier) should be understood to come from either a PTG.2 or PTG.3 class RNG.
+
+## Compatibility
+None.
+
+# Theory of Operations
+
+The CSRNG block has been constructed to follow the NIST recommendation for a DRBG mechanism based on block ciphers.
+Specifically, it is a CTR_DRBG that uses an approved block cipher algorithm in counter mode.
+As such, the block diagram below makes reference to hardware blocks that either directly or closely follow NIST descriptions for the equivalent functions.
+
+There are two major hardware interfaces: the application interface and the entropy request interface.
+The application interface, which is described in more detail later, is provided for an application to manage an `instance` in CSRNG.
+Once setup, the application interface user can request for entropy bits to be generated, as well as other functions.
+The application interface supports up to 15 hardware interfaces, and one software interface.
+
+A walk through of how CSRNG generates entropy bits begins with the application interface.
+An `instantiate` command is issued from one of the application interfaces.
+This request moves into the `cmd_stage` block.
+Here the request is arbitrated between all of the `cmd_stage` blocks.
+The winner will get its command moved into the command dispatch logic.
+A common state machine will process all application interface commands in order of arbitration.
+At this point, some seed entropy may be required depending on the command and any flags.
+If needed, a request to the entropy source hardware interface will be made.
+This step can take milliseconds if seed entropy is not immediately available.
+Once all of the prerequisites have been collected, a CTR_DRBG command can be launched.
+This command will go into the `ctr_drbg_cmd` block.
+This `ctr_drbg_cmd` block uses two NIST-defined functions, the update and the block_encrypt functions.
+If the command is a generate, the `ctr_drbg_cmd` block will process the first half of the algorithm, and then pass it on to the `ctr_drbg_gen` block.
+Additionally, the `ctr_drbg_gen` block also uses the update block and the block_encrypt block.
+To keep resources to a minimum, both of these blocks have arbiters to allow sharing between the `ctr_drbg_cmd` and `ctr_drbg_gen` blocks.
+The command field called `ccmd` (for current command) is sent along the pipeline to not only identify the command, but is also reused as a routing tag for the arbiters to use when returning the block response.
+
+Once the command has traversed through all of the CTR_DRBG blocks, the result will eventually land into the `state_db` block.
+This block will hold the instance state for each application interface.
+The specific state information held in the instance is documented below.
+If the command was a `generate` command, the genbits data word will be returned to the requesting `cmd_stage` block.
+Finally, an `ack` response and status will be returned to the application interface once the command has been completely processed.
+
+## Block Diagram
+
+
+
+## Hardware Interfaces
+
+ {{< hwcfg "hw/ip/csrng/data/csrng.hjson" >}}
+
+## Design Details
+
+#### Non-blocking Commands
+Regarding command processing, all commands process immediately except for the generate command.
+The command generate length count (`glen`) is kept in the `cmd_stage` block.
+When the state_db block issues an ack to the `cmd_stage` block, the `cmd_stage` block increments an internal counter.
+This process repeats until the `glen` field value has been matched.
+Because each request is pipelined, requests from other `cmd_stage` blocks can be processed before the original generate command is completely done.
+This provides some interleaving of commands since a generate command can be programmed to take a very long time.
+
+#### Working State Values
+The state_db has the follow attributes shown in the following table:
+
+<table>
+<caption>State Instance Description</caption>
+<thead>
+ <tr>
+ <th>Bits</th>
+ <th>Name</th>
+ <th>Description</th>
+ </tr>
+</thead>
+<tbody>
+ <tr>
+ <td>31:0</td>
+ <td>Reseed Counter</td>
+ <td> Value required by NIST to be held in the state instance.
+ </td>
+ </tr>
+ <tr>
+ <td>159:32</td>
+ <td>V</td>
+ <td> Value required by NIST to be held in the state instance, and is of size <tt>BlockLen</tt>.
+ </td>
+ </tr>
+ <tr>
+ <td>543:160</td>
+ <td>Key</td>
+ <td> Value required by NIST to be held in the state instance, and is of size <tt>SeedLen</tt>.
+ </td>
+ </tr>
+ <tr>
+ <td>544</td>
+ <td>Status</td>
+ <td> Set when instantiated.
+ </td>
+ </tr>
+ <tr>
+ <td>545</td>
+ <td>Compliance</td>
+ <td> Set when FIPS/CC compliant entropy was used to seed this instance.
+ </td>
+ </tr>
+</table>
+
+#### AES Cipher
+The `block_encrypt` block is where the `aes_cipher_core` block is located.
+This is the same block used in the AES design.
+Parameters are selected such that this is the unmasked version.
+
+#### Software Support
+The software application interface uses a set of TL-UL registers to send commands and receive generated bits.
+Since the registers are 32-bit words wide, some sequencing will need to be done by firmware to make this interface work properly.
+
+### Application Interface
+
+This section describes the application interface, which is required for performing any operations using a CSRNG instance (i.e. instantiation, reseeding, RNG generation, or uninstantiation).
+Each CSRNG instance corresponds to a unique application interface port, which implements the application interface described here.
+Any hardware peripherals which require complete control of an instance may connect directly to a dedicated interface port.
+Meanwhile peripherals without any special requirements (i.e. personalization strings or non-FIPS-approved, fully-deterministic number sequences) may share access to an instance via the entropy distribution network (EDN) IP.
+The EDN's manage the instantiation and reseeding of CSRNG instances for general use-cases, providing either on-demand or timed-delivery entropy streams to hardware peripherals.
+Firmware applications can obtain access to random bit sequences directly through application interface port 0, which is directly mapped to a set of TL-UL registers.
+
+The total number of application interface ports (for TL-UL, directly attached peripherals or EDN instances) is determined by the `NHwApp` parameter.
+
+The command bus operates like a FIFO, in which a command is pushed into the interface.
+An optional stream of additional data may follow, such as seed material for an `instantiate` application command.
+For the `generate` application command, the obfuscated entropy will be returned on the `genbits` bus.
+This bus also operates like a FIFO, and the receiving module can provide back pressure to the `genbits` bus.
+There is one instance of a firmware application interface, and uses the TL-UL registers.
+For more details on how the application interface works, see the Theory of Operations section above.
+
+In general, users of the application interface are either firmware or some hardware module entity.
+For hardware, a module can either directly control the application interface, or it can connect to an `entropy distribution network`module (EDN).
+Attaching to an EDN block allows for a simpler interface connection to a more layout-friendly distributed-chip network.
+
+#### General Command Format
+
+The general format for the application interface is a 32-bit command header, optionally followed by additional data, such as a personalization string, typically twelve 32-bit words in length.
+Depending on the command, these strings are typically required to be 384-bits in length, to match the size of the seed-length when operating with 256-bit security-strength.
+The exact function of the additional data field depends in the command.
+However, in general, the additional data can be any length as specified by the command length field.
+The command header is defined below.
+
+#### Command Header
+The application interface requires that a 32-bit command header be provided to instruct the CSRNG how to manage the internal working states.
+Below is a description of the fields of this header:
+
+<table>
+<caption>Application Interface Command Header</caption>
+<thead>
+ <tr>
+ <th>Bits</th>
+ <th>Name</th>
+ <th>Description</th>
+ </tr>
+</thead>
+<tbody>
+ <tr>
+ <td>3:0</td>
+ <td>acmd</td>
+ <td> Application Command: Selects one of five operations to perform.
+ The commands supported are <tt>instantiate</tt>, <tt>reseed</tt>, <tt>generate</tt>, <tt>update</tt>, and <tt>uninstantiate</tt>.
+ Each application interface port used by peripheral hardware commands a unique instance number in CSRNG.
+ </td>
+ </tr>
+ <tr>
+ <td>7:4</td>
+ <td>clen</td>
+ <td> Command Length: Number of 32-bit words that can optionally be appended to the command.
+ A value of zero will only transfer the command header.
+ A value of 4'hc will transfer the header plus an additional twelve 32-bit words of data.
+ </td>
+ </tr>
+ <tr>
+ <td>11:8</td>
+ <td>flags</td>
+ <td> Command Flags: Specific flags associated with a command.
+ Used to allow additional features per command. Flags are defined as <tt>flag0</tt>, <tt>flag1</tt>, <tt>flag2</tt>, and <tt>flag3</tt>, where <tt>flag0</tt> is bit 8, and <tt>flag1</tt> is bit 9, etc.
+ Note that <tt>flag0</tt> is used for the <tt>instantiate</tt> command. All others are reserved.
+ </td>
+ </tr>
+ <tr>
+ <td>30:12</td>
+ <td>glen</td>
+ <td> Generate Length: Only defined for the generate command, this field is the total number of crytographic entropy bits requested.
+ The NIST reference name is <tt>max_number_of_bit_per_request</tt>, and this field size supports the maximum size allowed.
+ Each unit represents 128 bits of entropy returned.
+ For example, a value of 8 would return a total of 1024 bits.
+ The maximum value for this field is 2<sup>19</sup>.
+ </td>
+ </tr>
+ <tr>
+ <td>31</td>
+ <td>resv</td>
+ <td> Unused and reserved.
+ </td>
+ </tr>
+</table>
+
+#### Command Description
+The command field of the application command header is described in detail in the table below.
+The actions performed by each command, as well as which flags are supported, are described in this table.
+
+<table>
+<caption>Application Interface Command Description</caption>
+<thead>
+ <tr>
+ <th>Command Name</th>
+ <th>Encoded Value</th>
+ <th>Description</th>
+ </tr>
+</thead>
+<tbody>
+ <tr>
+ <td>Instantiate</td>
+ <td>0x1</td>
+ <td> Initializes an instance in CSRNG.
+ When seeding, if <tt>flag0</tt> is not set and <tt>clen</tt> is zero, then a seed of of only the entropy source seed will be used.
+ If <tt>flag0</tt> is not set and <tt>clen</tt> is non-zero, then the seed will xor'ed with the provided additional data.
+ If <tt>flag0</tt> is set and <tt>clen</tt> is zero, then a seed of zero with no entropy source seed material will be used.
+ If <tt>flag0</tt> is set and <tt>clen</tt> is non-zero, then only the provided additional data will be used as the seed.
+ WARNING: Though <tt>flag0</tt> may be useful for generating fully-determininistic bit sequences, the use of this flag will render the instance non-FIPS compliant until it is re-instantiated.
+ When the <tt>instantiate</tt> command is completed, the active bit in the CSRNG working state will be set.
+ </td>
+ </tr>
+ <tr>
+ <td>Reseed</td>
+ <td>0x2</td>
+ <td> Reseeds an existing instance in CSRNG.
+ When <tt>clen</tt> is set to zero for this command, only the entropy source seed will be used to reseed the instance.
+ If <tt>clen</tt> is set to non-zero (up to twelve), the additional data provided with be xor'ed with the entropy source seed.
+ </td>
+ </tr>
+ <tr>
+ <td>Generate</td>
+ <td>0x3</td>
+ <td> Starts a request to CSRNG to generate crytographic entropy bits.
+ The <tt>glen</tt> field represents how many 128-bit words are to be returned to the application interface.
+ The <tt>glen</tt> field needs to be a minimum value of one.
+ The NIST reference to the <tt>prediction_resistance_flag</tt> is not directly supported as a flag.
+ It is the resposibility of the calling application to reseed as needed before the generate command to properly support prediction resistance.
+ </td>
+ </tr>
+ <tr>
+ <td>Update</td>
+ <td>0x4</td>
+ <td> Updates an existing instance in CSRNG.
+ This command does the same function as the <tt>reseed</tt> command, except that:
+ <ol>
+ <li>only the additional data provided will be used in the update function (i.e. no physical entropy is gathered), and
+ <li>the <tt>update</tt> command does not reset the reseed counter.
+ </ol>
+ When the <tt>update</tt> command is completed, the results will be reflected in the CSRNG working state.
+ </td>
+ </tr>
+ <tr>
+ <td>Uninstantiate</td>
+ <td>0x5</td>
+ <td> Resets an instance in CSRNG.
+ Values in the instance are zeroed out.
+ When the <tt>uninstantiate</tt> comand is completed, the <tt>active</tt> bit in the CSRNG working state will be cleared.
+ Uninstantiating an instance effectively resets it, clearing any errors that it may have encountered due to bad command syntax or entropy source failures.
+ </td>
+ </tr>
+ <tr>
+ <td>Reserved</td>
+ <td>0x0,0x6-0xf</td>
+ <td> Unused and reserved.
+ </td>
+ </tr>
+</table>
+
+#### Command Response
+
+Once a command has been completed, successfully or unsuccessfully, the CSRNG responds with a single cycle pulse on the `csrng_rsp_ack` signal associated with the same application interface port.
+If the command is successful the `csrng_rsp_sts` signal will indicate the value 0 (`CSRNG_OK`) in the same cycle.
+Otherwise the application will receive the value 1 (`CSRNG_ERROR`) on the `csrng_rsp_sts` signal.
+A number of exception cases to be considered are enumerated in NIST SP 800-90A, and may include events such as:
+* Failure of the entropy source
+* Attempts to use an instance which has not been properly instantiated, or
+* Attempts to generate data when an instance has exceeded its maximum seed.life.
+In such cases, a 32-bit exception message will be propagated to firmware via the `hw_exc_sts` register, and a `cs_hw_inst_exc` interrupt will be raised.
+
+#### Generated Bits (`genbits`) Interface
+
+In addition to the command response signals there is all the bus for returning the generated bits.
+This 129-bit bus consists of 128-bits, `genbits_bus`, for the random bit sequence itself, along with a single bit flag, `genbits_fips`, indicating whether the bits were considered fully in accordance with FIPS standards.
+
+There are two cases when the sequence will not be FIPS compliant:
+- Early in the boot sequence, the `entropy_src` generates a seed from the first 384 bits pulled from the noise source.
+This initial seed is tested to ensure some minimum quality for obfuscation use- cases, but this boot seed is not expected to be full-entropy nor do these health checks meet the 1024-bit requirement for start-up health checks required by NIST 800-90B.
+- If `flag0` is asserted during instantiation, the resulting DRBG instance will have a fully-deterministic seed, determined only by user input data.
+Such a seed will be created only using factory-entropy and will lack the physical-entropy required by NIST SP 800-90A, and thus this DRBG instance will not be FIPS compliant.
+
+#### Handshaking signals
+
+The application command signal `csrng_req_bus` is accompanied by a `csrng_valid_signal`, which is asserted by the requester when the command is valid.
+CSRNG may stall incoming commands by desserting the `csrng_req_ready` signal.
+A command is considered received whenever both `csrng_req_valid` and `csrng_req_ready` are asserted in the same clock cycle.
+
+Likewise a requester must only consider data on the `genbits` bus to be valid when the `genbits_valid` signal is asserted, and should assert `genbits_ready` whenever it is ready to accept the `genbits` data.
+The `genbits` data is considered successfully transmitted whenever `genbits_valid` and `genbits_ready` are asserted in the same clock cycle.
+
+A requester must always be ready to receive `csrng_req_sts` signals.
+(There is no "ready" signal for command response messages sent to hardware.)
+
+#### Waveforms
+
+##### Application Interface: Instantiate Request
+
+{{< wavejson >}}
+{signal: [
+ {name: 'clk' , wave: 'p...............|.....'},
+ {name: 'csrng_req_valid' , wave: '01............0.|.....'},
+ {name: 'csrng_req_ready' , wave: '1.............0.|..1..'},
+ {name: 'csrng_req_bus' , wave: 'x5333333333333x.|.....',data: ['ins','sd1','sd2','sd3','sd4','sd5','sd6','sd7','sd8','sd9','sd10','sd11','sd12']},
+ {name: 'csrng_rsp_ack' , wave: '0...............|.10..'},
+ {name: 'csrng_rsp_sts' , wave: 'x...............|.5x..', data: ['ok']},
+ {},
+]}{{< /wavejson >}}
+
+##### Application Interface: Reseed Request
+
+{{< wavejson >}}
+{signal: [
+ {name: 'clk' , wave: 'p...............|.....'},
+ {name: 'csrng_req_valid' , wave: '01............0.|.....'},
+ {name: 'csrng_req_ready' , wave: '1.............0.|..1..'},
+ {name: 'csrng_req_bus' , wave: 'x5333333333333x.|.....',data: ['res','ad1','ad2','ad3','ad4','ad5','ad6','ad7','ad8','ad9','ad10','ad11','ad12']},
+ {name: 'csrng_rsp_ack' , wave: '0...............|.10..'},
+ {name: 'csrng_rsp_sts' , wave: 'x...............|.5x..', data: ['ok']},
+ {},
+]}{{< /wavejson >}}
+
+##### Application Interface: Generate Request
+
+{{< wavejson >}}
+{signal: [
+ {name: 'clk' , wave: 'p...|...|....|....|...'},
+ {name: 'csrng_req_valid' , wave: '010.|...|....|....|...'},
+ {name: 'csrng_req_ready' , wave: '1...|...|....|....|...'},
+ {name: 'csrng_req_bus' , wave: 'x5x.|...|....|....|...',data: ['gen']},
+ {name: 'csrng_rsp_ack' , wave: '0...|...|....|....|.10'},
+ {name: 'csrng_rsp_sts' , wave: 'x...|...|....|....|.5x', data: ['ok']},
+ {name: 'genbits_valid' , wave: '0...|.10|.1.0|.10.|...'},
+ {name: 'csrng_rsp_fips' , wave: '0...|.10|.1.0|.10.|...'},
+ {name: 'genbits_bus' , wave: 'x...|.4x|.4.x|.4x.|...', data: ['bits','bits','bits']},
+ {name: 'genbits_ready' , wave: '1...|...|0.1.|........'},
+ {}, {},
+]}
+{{< /wavejson >}}
+
+##### Application Interface: Update Request
+
+{{< wavejson >}}
+{signal: [
+ {name: 'clk' , wave: 'p...............|.....'},
+ {name: 'csrng_req_valid' , wave: '01............0.|.....'},
+ {name: 'csrng_req_ready' , wave: '1.............0.|..1..'},
+ {name: 'csrng_req_bus' , wave: 'x5333333333333x.|.....',data: ['upd','ad1','ad2','ad3','ad4','ad5','ad6','ad7','ad8','ad9','ad10','ad11','ad12']},
+ {name: 'csrng_rsp_ack' , wave: '0...............|.10..'},
+ {name: 'csrng_rsp_sts' , wave: 'x...............|.5x..', data: ['ok']},
+ {},
+]}{{< /wavejson >}}
+
+##### Application Interface: Uninstantiate Request
+
+{{< wavejson >}}
+{signal: [
+ {name: 'clk' , wave: 'p...............|.....'},
+ {name: 'csrng_req_valid' , wave: '010.............|.....'},
+ {name: 'csrng_req_ready' , wave: '1.0.............|..1..'},
+ {name: 'csrng_req_bus' , wave: 'x5x.............|.....',data: ['uni']},
+ {name: 'csrng_rsp_ack' , wave: '0...............|.10..'},
+ {name: 'csrng_rsp_sts' , wave: 'x...............|.5x..', data: ['ok']},
+ {},
+]}{{< /wavejson >}}
+
+
+##### Entropy Source Hardware Interface
+The following waveform shows an example of how the entropy source hardware interface works.
+
+
+{{< wavejson >}}
+{signal: [
+ {name: 'clk' , wave: 'p...|...|....|......'},
+ {name: 'es_enable' , wave: '01..|...|....|......'},
+ {name: 'es_req' , wave: '0..1|..0|.1..|..0...'},
+ {name: 'es_ack' , wave: '0...|.10|.10.|.10...'},
+ {name: 'es_bits' , wave: 'x...|.3x|x3x.|.3x...', data: ['es0','es1','es2','es3','es4','es5','es6','es7']},
+ {name: 'es_fips' , wave: '0...|...|.10.|.10...'},
+ {},
+]}
+{{< /wavejson >}}
+
+### Interrupts
+
+The CSRNG module has two interrupts: `cs_cmd_req_done` and `cs_fifo_err`.
+
+The `cs_cmd_req_done` interrupt will assert when a csrng command has been completed.
+
+The `cs_fifo_err` interrupt will assert when any of the csrng FIFOs has a malfunction.
+The conditions that cause this to happen are either when there is a push to a full FIFO or a pull from an empty FIFO.
+
+The `cs_hw_inst_exc` interrupt will assert when any of the hardware-controlled CSRNG instances encounters an exception while executing a command, either due to errors on the command sequencing, or an exception within the `entropy_src` IP.
+
+# Programmers Guide
+
+## Initialization
+
+The following code snippet demonstrates initializing the CSRNG block.
+
+```cpp
+void csrng_init(unsigned int enable) {
+
+ // set the control register enable bit
+ *CTRL_REG = enable; // should be 0x1 by default
+
+ // the CSRNG interrupts can optionally be enabled
+}
+```
+
+## Register Table
+
+{{< registers "hw/ip/csrng/data/csrng.hjson" >}}
diff --git a/hw/ip/csrng/doc/csrng_blk_diag.svg b/hw/ip/csrng/doc/csrng_blk_diag.svg
new file mode 100644
index 0000000..1e6fc4e
--- /dev/null
+++ b/hw/ip/csrng/doc/csrng_blk_diag.svg
@@ -0,0 +1,635 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by Microsoft Visio, SVG Export csrng_blk_diag.svg Page-1 -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
+ xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="11in" height="8.5in" viewBox="0 0 792 612"
+ xml:space="preserve" color-interpolation-filters="sRGB" class="st13">
+ <v:documentProperties v:langID="1033" v:viewMarkup="false">
+ <v:userDefs>
+ <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/>
+ <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/>
+ </v:userDefs>
+ </v:documentProperties>
+
+ <style type="text/css">
+ <![CDATA[
+ .st1 {fill:#ffffff;stroke:#000000;stroke-width:0.75}
+ .st2 {fill:#000000;font-family:Arial;font-size:0.833336em}
+ .st3 {font-size:1em}
+ .st4 {fill:none;stroke:none;stroke-width:0.75}
+ .st5 {marker-end:url(#mrkr13-21);marker-start:url(#mrkr13-19);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.25}
+ .st6 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.47169811320755}
+ .st7 {fill:none;stroke:none;stroke-width:0.25}
+ .st8 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st9 {marker-end:url(#mrkr5-59);stroke:#000000;stroke-width:0.75}
+ .st10 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.22935779816514}
+ .st11 {marker-end:url(#mrkr5-59);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st12 {font-size:1em;text-decoration:underline}
+ .st13 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+ ]]>
+ </style>
+
+ <defs id="Markers">
+ <g id="lend13">
+ <path d="M 3 1 L 0 0 L 3 -1 L 3 1 " style="stroke:none"/>
+ </g>
+ <marker id="mrkr13-19" class="st6" v:arrowType="13" v:arrowSize="2" v:setback="6.2" refX="6.2" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend13" transform="scale(2.12) "/>
+ </marker>
+ <marker id="mrkr13-21" class="st6" v:arrowType="13" v:arrowSize="2" v:setback="6.36" refX="-6.36" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend13" transform="scale(-2.12,-2.12) "/>
+ </marker>
+ <g id="lend5">
+ <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/>
+ </g>
+ <marker id="mrkr5-59" class="st10" v:arrowType="5" v:arrowSize="2" v:setback="7.63" refX="-7.63" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend5" transform="scale(-4.36,-4.36) "/>
+ </marker>
+ </defs>
+ <g v:mID="0" v:index="1" v:groupContext="foregroundPage">
+ <v:userDefs>
+ <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/>
+ </v:userDefs>
+ <title>Page-1</title>
+ <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/>
+ <v:layer v:name="Flowchart" v:index="0"/>
+ <v:layer v:name="Connector" v:index="1"/>
+ <g id="shape480-1" v:mID="480" v:groupContext="shape" transform="translate(73.8258,-297)">
+ <title>Sheet.480</title>
+ <desc>CSRNG Registers</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="71.7998" cy="490.5" width="143.6" height="243"/>
+ <rect x="0" y="369" width="143.6" height="243" class="st1"/>
+ <text x="53.74" y="382" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>CSRNG<v:newlineChar/><tspan
+ x="50.68" dy="1.2em" class="st3">Registers</tspan></text> </g>
+ <g id="shape484-5" v:mID="484" v:groupContext="shape" transform="translate(118.18,-291.255)">
+ <title>Sheet.484</title>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <rect x="0" y="551.545" width="99.2459" height="60.4551" class="st4"/>
+ </g>
+ <g id="shape490-7" v:mID="490" v:groupContext="shape" transform="translate(118.18,-438.75)">
+ <title>Sheet.490</title>
+ <desc>cs_cntl.q cs_cmd_req.q</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="49.6229" cy="561.375" width="99.25" height="101.25"/>
+ <rect x="0" y="510.75" width="99.2459" height="101.25" class="st4"/>
+ <text x="55.78" y="571.75" class="st2" v:langID="1033"><v:paragraph v:horizAlign="2"/><v:tabList/><v:space/><v:newlineChar/><v:newlineChar/><v:newlineChar/><v:space/><v:space/><v:newlineChar/>cs_cntl.q<tspan
+ x="29.66" dy="1.2em" class="st3"> </tspan>cs_cmd_req.q<tspan dy="1.2em" class="st3"> </tspan><tspan
+ x="95.25" dy="1.2em" class="st3"> </tspan><v:newlineChar/> <v:newlineChar/> </text> </g>
+ <g id="shape491-13" v:mID="491" v:groupContext="shape" transform="translate(18,-441)">
+ <title>Sheet.491</title>
+ <path d="M13.95 612 L14.31 612 L41.52 612" class="st5"/>
+ </g>
+ <g id="shape492-22" v:mID="492" v:groupContext="shape" transform="translate(73.8258,-392.772)">
+ <title>Sheet.492</title>
+ <desc>TLUL Interface</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="49.6229" cy="581.772" width="99.25" height="60.4551"/>
+ <rect x="0" y="551.545" width="99.2459" height="60.4551" class="st4"/>
+ <text x="6.78" y="564.55" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>TLUL Interface<v:newlineChar/></text> </g>
+ <g id="shape589-25" v:mID="589" v:groupContext="shape" transform="translate(118.18,-330.75)">
+ <title>Sheet.589</title>
+ <desc>cs_cmd_status.d cs_genbits.d</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="49.6229" cy="561.375" width="99.25" height="101.25"/>
+ <rect x="0" y="510.75" width="99.2459" height="101.25" class="st4"/>
+ <text x="20.21" y="571.75" class="st2" v:langID="1033"><v:paragraph v:horizAlign="2"/><v:tabList/><v:space/><v:newlineChar/><v:newlineChar/><v:newlineChar/><v:space/><v:newlineChar/>cs_cmd_status.d<tspan
+ x="36.32" dy="1.2em" class="st3"> </tspan>cs_genbits.d<tspan dy="1.2em" class="st3"> </tspan><tspan
+ x="95.25" dy="1.2em" class="st3"> </tspan><v:newlineChar/> <v:newlineChar/> </text> </g>
+ <g id="shape591-31" v:mID="591" v:groupContext="shape" transform="translate(230.625,-477)">
+ <title>Sheet.591</title>
+ </g>
+ <g id="shape769-32" v:mID="769" v:groupContext="shape" transform="translate(69.2254,-235.36)">
+ <title>Sheet.769</title>
+ <desc>CSRNG application interface SW</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="71.7998" cy="599.18" width="143.6" height="25.6401"/>
+ <rect x="0" y="586.36" width="143.6" height="25.6401" class="st7"/>
+ <text x="11.76" y="599.36" class="st2" v:langID="1033"><v:paragraph v:horizAlign="2"/><v:tabList/>CSRNG application interface <tspan
+ x="123.49" dy="1.2em" class="st3">SW</tspan></text> </g>
+ <g id="shape957-36" v:mID="957" v:groupContext="shape" transform="translate(260.574,-333)">
+ <title>Sheet.957</title>
+ <rect x="0" y="551.545" width="13.2734" height="60.4551" class="st1"/>
+ </g>
+ <g id="shape958-38" v:mID="958" v:groupContext="shape" transform="translate(243,-395.573)">
+ <title>Sheet.958</title>
+ <desc>128 to 32 unpacker</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="30.3325" cy="599.18" width="60.67" height="25.6401"/>
+ <rect x="0" y="586.36" width="60.665" height="25.6401" class="st4"/>
+ <text x="9.48" y="596.18" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>128 to 32 <v:newlineChar/><tspan
+ x="9.76" dy="1.2em" class="st3">unpacker</tspan></text> </g>
+ <g id="shape974-42" v:mID="974" v:groupContext="shape" transform="translate(252,-243)">
+ <title>Sheet.974</title>
+ <desc>Cmd Stage</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="26.0234" cy="594.75" width="52.05" height="34.5"/>
+ <rect x="0" y="577.5" width="52.0468" height="34.5" class="st1"/>
+ <text x="15.47" y="591.75" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Cmd <v:newlineChar/><tspan
+ x="12.96" dy="1.2em" class="st3">Stage</tspan></text> </g>
+ <g id="shape995-46" v:mID="995" v:groupContext="shape" transform="translate(797.036,611.871) rotate(120.964)">
+ <title>Sheet.995</title>
+ <path d="M0 612 L13.12 612" class="st8"/>
+ </g>
+ <g id="shape996-49" v:mID="996" v:groupContext="shape" transform="translate(220.5,-70.09)">
+ <title>Sheet.996</title>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <rect x="0" y="590.18" width="48.3116" height="21.82" class="st4"/>
+ </g>
+ <g id="shape998-51" v:mID="998" v:groupContext="shape" transform="translate(247.5,-308.59)">
+ <title>Sheet.998</title>
+ <desc>128 bit</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="24.1558" cy="601.09" width="48.32" height="21.82"/>
+ <rect x="0" y="590.18" width="48.3116" height="21.82" class="st4"/>
+ <text x="9.14" y="604.09" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>128 bit</text> </g>
+ <g id="shape1000-54" v:mID="1000" v:groupContext="shape" transform="translate(217.425,-252)">
+ <title>Sheet.1000</title>
+ <path d="M0 396 L15.82 396 L15.82 612 L28.85 612" class="st9"/>
+ </g>
+ <g id="shape1001-60" v:mID="1001" v:groupContext="shape" transform="translate(260.574,864) rotate(180)">
+ <title>Sheet.1001</title>
+ <path d="M0 612 L37.43 612" class="st11"/>
+ </g>
+ <g id="shape1002-65" v:mID="1002" v:groupContext="shape" transform="translate(242.25,-270)">
+ <title>Sheet.1002</title>
+ <path d="M9.75 612 L0 612 L0 571.5 L54.75 571.5 L54.75 522 L37.32 522" class="st9"/>
+ </g>
+ <g id="shape1003-70" v:mID="1003" v:groupContext="shape" transform="translate(251.703,-174)">
+ <title>Sheet.1003</title>
+ <desc>Cmd Stage</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="26.0234" cy="594.75" width="52.05" height="34.5"/>
+ <rect x="0" y="577.5" width="52.0468" height="34.5" class="st1"/>
+ <text x="15.47" y="591.75" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Cmd <v:newlineChar/><tspan
+ x="12.96" dy="1.2em" class="st3">Stage</tspan></text> </g>
+ <g id="shape1004-74" v:mID="1004" v:groupContext="shape" transform="translate(252,-108)">
+ <title>Sheet.1004</title>
+ <desc>Cmd Stage</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="26.0234" cy="594.75" width="52.05" height="34.5"/>
+ <rect x="0" y="577.5" width="52.0468" height="34.5" class="st1"/>
+ <text x="15.47" y="591.75" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Cmd <v:newlineChar/><tspan
+ x="12.96" dy="1.2em" class="st3">Stage</tspan></text> </g>
+ <g id="shape1005-78" v:mID="1005" v:groupContext="shape" transform="translate(63,-180)">
+ <title>Sheet.1005</title>
+ <desc>CSRNG application interface HW1</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="74.9125" cy="599.18" width="149.83" height="25.6401"/>
+ <rect x="0" y="586.36" width="149.825" height="25.6401" class="st7"/>
+ <text x="17.99" y="599.36" class="st2" v:langID="1033"><v:paragraph v:horizAlign="2"/><v:tabList/>CSRNG application interface <tspan
+ x="123.6" dy="1.2em" class="st3">HW</tspan>1</text> </g>
+ <g id="shape1006-82" v:mID="1006" v:groupContext="shape" transform="translate(63,-117)">
+ <title>Sheet.1006</title>
+ <desc>CSRNG application interface HW0</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="74.9125" cy="599.18" width="149.83" height="25.6401"/>
+ <rect x="0" y="586.36" width="149.825" height="25.6401" class="st7"/>
+ <text x="17.99" y="599.36" class="st2" v:langID="1033"><v:paragraph v:horizAlign="2"/><v:tabList/>CSRNG application interface <tspan
+ x="123.6" dy="1.2em" class="st3">HW</tspan>0</text> </g>
+ <g id="shape1007-86" v:mID="1007" v:groupContext="shape" transform="translate(251.703,1026) rotate(180)">
+ <title>Sheet.1007</title>
+ <path d="M0 612 L29.98 612" class="st11"/>
+ </g>
+ <g id="shape1008-91" v:mID="1008" v:groupContext="shape" transform="translate(216,-180)">
+ <title>Sheet.1008</title>
+ <path d="M0 612 L29.98 612" class="st11"/>
+ </g>
+ <g id="shape1009-96" v:mID="1009" v:groupContext="shape" transform="translate(252,1089) rotate(180)">
+ <title>Sheet.1009</title>
+ <path d="M0 612 L30.28 612" class="st11"/>
+ </g>
+ <g id="shape1011-101" v:mID="1011" v:groupContext="shape" transform="translate(216,-117)">
+ <title>Sheet.1011</title>
+ <path d="M0 612 L30.28 612" class="st11"/>
+ </g>
+ <g id="shape1012-106" v:mID="1012" v:groupContext="shape" transform="translate(215.175,-109.36)">
+ <title>Sheet.1012</title>
+ <desc>cmd</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="17.2873" cy="599.18" width="34.58" height="25.6401"/>
+ <rect x="0" y="586.36" width="34.5746" height="25.6401" class="st4"/>
+ <text x="7.84" y="602.18" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>cmd</text> </g>
+ <g id="shape1013-109" v:mID="1013" v:groupContext="shape" transform="translate(215.175,-173.18)">
+ <title>Sheet.1013</title>
+ <desc>cmd</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="17.2873" cy="599.18" width="34.58" height="25.6401"/>
+ <rect x="0" y="586.36" width="34.5746" height="25.6401" class="st4"/>
+ <text x="7.84" y="602.18" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>cmd</text> </g>
+ <g id="shape1014-112" v:mID="1014" v:groupContext="shape" transform="translate(215.175,-232.43)">
+ <title>Sheet.1014</title>
+ <desc>cmd</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="17.2873" cy="599.18" width="34.58" height="25.6401"/>
+ <rect x="0" y="586.36" width="34.5746" height="25.6401" class="st4"/>
+ <text x="7.84" y="602.18" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>cmd</text> </g>
+ <g id="shape1015-115" v:mID="1015" v:groupContext="shape" transform="translate(210.346,-135)">
+ <title>Sheet.1015</title>
+ <desc>genbits</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="20.8268" cy="599.18" width="41.66" height="25.6401"/>
+ <rect x="0" y="586.36" width="41.6536" height="25.6401" class="st4"/>
+ <text x="4.7" y="602.18" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>genbits</text> </g>
+ <g id="shape1016-118" v:mID="1016" v:groupContext="shape" transform="translate(208.307,-194.18)">
+ <title>Sheet.1016</title>
+ <desc>genbits</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="24.1558" cy="599.18" width="48.32" height="25.6401"/>
+ <rect x="0" y="586.36" width="48.3116" height="25.6401" class="st4"/>
+ <text x="8.03" y="602.18" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>genbits</text> </g>
+ <g id="shape1017-121" v:mID="1017" v:groupContext="shape" transform="translate(270,-288.68)">
+ <title>Sheet.1017</title>
+ <desc>genbits</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="24.1558" cy="599.18" width="48.32" height="25.6401"/>
+ <rect x="0" y="586.36" width="48.3116" height="25.6401" class="st4"/>
+ <text x="8.03" y="602.18" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>genbits</text> </g>
+ <g id="shape1018-124" v:mID="1018" v:groupContext="shape" transform="translate(63.4004,-554.18)">
+ <title>Sheet.1018</title>
+ <desc>Entropy Bus</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="71.7998" cy="599.18" width="143.6" height="25.6401"/>
+ <rect x="0" y="586.36" width="143.6" height="25.6401" class="st7"/>
+ <text x="85.13" y="599.36" class="st2" v:langID="1033"><v:paragraph v:horizAlign="2"/><v:tabList/>Entropy Bus</text> </g>
+ <g id="shape1019-127" v:mID="1019" v:groupContext="shape" transform="translate(365.262,-225.894)">
+ <title>Sheet.1019</title>
+ <rect x="0" y="551.545" width="13.2734" height="60.4551" class="st1"/>
+ </g>
+ <g id="shape1020-129" v:mID="1020" v:groupContext="shape" transform="translate(347.688,-288.466)">
+ <title>Sheet.1020</title>
+ <desc>Cmd arb</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="24.1558" cy="599.18" width="48.32" height="25.6401"/>
+ <rect x="0" y="586.36" width="48.3116" height="25.6401" class="st4"/>
+ <text x="13.6" y="596.18" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Cmd <v:newlineChar/><tspan
+ x="16.93" dy="1.2em" class="st3">arb</tspan></text> </g>
+ <g id="shape1021-133" v:mID="1021" v:groupContext="shape" transform="translate(431.574,-344.697)">
+ <title>Sheet.1021</title>
+ <rect x="0" y="551.545" width="13.2734" height="60.4551" class="st1"/>
+ </g>
+ <g id="shape1022-135" v:mID="1022" v:groupContext="shape" transform="translate(414,-407.269)">
+ <title>Sheet.1022</title>
+ <desc>32 to 384 packer</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="30.3325" cy="599.18" width="60.67" height="25.6401"/>
+ <rect x="0" y="586.36" width="60.665" height="25.6401" class="st4"/>
+ <text x="9.48" y="596.18" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>32 to 384 <v:newlineChar/><tspan
+ x="15.33" dy="1.2em" class="st3">packer</tspan></text> </g>
+ <g id="shape1023-139" v:mID="1023" v:groupContext="shape" transform="translate(497.335,-497.25)">
+ <title>Sheet.1023</title>
+ <desc>Main Cmd Disp SM</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="30.3325" cy="587.25" width="60.67" height="49.5"/>
+ <rect x="0" y="562.5" width="60.665" height="49.5" class="st1"/>
+ <text x="7.55" y="578.25" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Main Cmd<v:newlineChar/><tspan
+ x="11.44" dy="1.2em" class="st3">Disp SM</tspan><v:newlineChar/></text> </g>
+ <g id="shape1025-143" v:mID="1025" v:groupContext="shape" transform="translate(420.189,-465.303)">
+ <title>Sheet.1025</title>
+ <desc>cmd</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="17.2873" cy="603" width="34.58" height="18"/>
+ <rect x="0" y="594" width="34.5746" height="18" class="st1"/>
+ <text x="7.84" y="606" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>cmd</text> </g>
+ <g id="shape1026-146" v:mID="1026" v:groupContext="shape" transform="translate(420.189,-438.633)">
+ <title>Sheet.1026</title>
+ <desc>shid</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="17.2873" cy="603" width="34.58" height="18"/>
+ <rect x="0" y="594" width="34.5746" height="18" class="st1"/>
+ <text x="8.11" y="606" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>shid</text> </g>
+ <g id="shape1027-149" v:mID="1027" v:groupContext="shape" transform="translate(553.173,-261)">
+ <title>Sheet.1027</title>
+ <desc>Ctr_drbg cmd</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="30.3325" cy="587.25" width="60.67" height="49.5"/>
+ <rect x="0" y="562.5" width="60.665" height="49.5" class="st1"/>
+ <text x="10.88" y="584.25" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Ctr_drbg <tspan
+ x="20.89" dy="1.2em" class="st3">cmd</tspan></text> </g>
+ <g id="shape1028-153" v:mID="1028" v:groupContext="shape" transform="translate(553.173,-128.25)">
+ <title>Sheet.1028</title>
+ <desc>Ctr_drbg gen</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="30.3325" cy="587.25" width="60.67" height="49.5"/>
+ <rect x="0" y="562.5" width="60.665" height="49.5" class="st1"/>
+ <text x="10.88" y="584.25" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Ctr_drbg <tspan
+ x="21.99" dy="1.2em" class="st3">gen</tspan></text> </g>
+ <g id="shape1029-157" v:mID="1029" v:groupContext="shape" transform="translate(713.335,-261)">
+ <title>Sheet.1029</title>
+ <desc>Ctr_drbg update</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="30.3325" cy="587.25" width="60.67" height="49.5"/>
+ <rect x="0" y="562.5" width="60.665" height="49.5" class="st1"/>
+ <text x="10.88" y="584.25" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Ctr_drbg <tspan
+ x="15.04" dy="1.2em" class="st3">update</tspan></text> </g>
+ <g id="shape1030-161" v:mID="1030" v:groupContext="shape" transform="translate(713.335,-128.25)">
+ <title>Sheet.1030</title>
+ <desc>Block Encrypt</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="30.3325" cy="587.25" width="60.67" height="49.5"/>
+ <rect x="0" y="562.5" width="60.665" height="49.5" class="st1"/>
+ <text x="18.11" y="584.25" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Block <tspan
+ x="13.38" dy="1.2em" class="st3">Encrypt</tspan></text> </g>
+ <g id="shape1031-165" v:mID="1031" v:groupContext="shape" transform="translate(423,-184.875)">
+ <title>Sheet.1031</title>
+ <desc>State DB: - Key,V, Status, Reseed Counter - Per Instance</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="45" cy="568.125" width="90" height="87.75"/>
+ <rect x="0" y="524.25" width="90" height="87.75" class="st1"/>
+ <text x="4" y="553.13" class="st2" v:langID="1033"><v:paragraph/><v:tabList/><tspan class="st12">State DB</tspan>:<v:newlineChar/><tspan
+ x="4" dy="1.2em" class="st3">-</tspan> Key,V, Status,<v:newlineChar/><tspan x="4" dy="1.2em" class="st3">Reseed Counter<v:newlineChar/></tspan><tspan
+ x="4" dy="1.2em" class="st3">-</tspan> Per Instance</text> </g>
+ <g id="shape1032-172" v:mID="1032" v:groupContext="shape" transform="translate(656.418,-276.709)">
+ <title>Sheet.1032</title>
+ <rect x="0" y="586.36" width="13.2734" height="25.6401" class="st1"/>
+ </g>
+ <g id="shape1033-174" v:mID="1033" v:groupContext="shape" transform="translate(638.844,-304.466)">
+ <title>Sheet.1033</title>
+ <desc>Update Arb</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="24.1558" cy="599.18" width="48.32" height="25.6401"/>
+ <rect x="0" y="586.36" width="48.3116" height="25.6401" class="st4"/>
+ <text x="8.03" y="596.18" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Update<v:newlineChar/><tspan
+ x="16.38" dy="1.2em" class="st3">Arb</tspan></text> </g>
+ <g id="shape1034-178" v:mID="1034" v:groupContext="shape" transform="translate(657.762,-144.602)">
+ <title>Sheet.1034</title>
+ <rect x="0" y="586.36" width="13.2734" height="25.6401" class="st1"/>
+ </g>
+ <g id="shape1035-180" v:mID="1035" v:groupContext="shape" transform="translate(640.188,-172.36)">
+ <title>Sheet.1035</title>
+ <desc>Blk Enc Arb</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="24.1558" cy="599.18" width="48.32" height="25.6401"/>
+ <rect x="0" y="586.36" width="48.3116" height="25.6401" class="st4"/>
+ <text x="7.2" y="596.18" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Blk Enc<v:newlineChar/><tspan
+ x="16.38" dy="1.2em" class="st3">Arb</tspan></text> </g>
+ <g id="shape1036-184" v:mID="1036" v:groupContext="shape" transform="translate(455.262,-117)">
+ <title>Sheet.1036</title>
+ <rect x="0" y="586.36" width="13.2734" height="25.6401" class="st1"/>
+ </g>
+ <g id="shape1037-186" v:mID="1037" v:groupContext="shape" transform="translate(437.688,-144.758)">
+ <title>Sheet.1037</title>
+ <desc>Time Slice Arb</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="24.1558" cy="599.18" width="48.32" height="25.6401"/>
+ <rect x="0" y="586.36" width="48.3116" height="25.6401" class="st4"/>
+ <text x="13.04" y="596.18" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Time <tspan x="4.15"
+ dy="1.2em" class="st3">Slice Arb</tspan></text> </g>
+ <g id="shape1038-190" v:mID="1038" v:groupContext="shape" transform="translate(1197,351) rotate(90)">
+ <title>Sheet.1038</title>
+ <path d="M0 612 L77.53 612" class="st11"/>
+ </g>
+ <g id="shape1039-195" v:mID="1039" v:groupContext="shape" transform="translate(468.536,-135)">
+ <title>Sheet.1039</title>
+ <path d="M116.46 524.25 L53.46 524.25 L53.46 612 L5.72 612" class="st9"/>
+ </g>
+ <g id="shape1040-200" v:mID="1040" v:groupContext="shape" transform="translate(468.536,-99)">
+ <title>Sheet.1040</title>
+ <path d="M102.96 582.75 L102.96 612 L53.46 612 L53.46 585 L5.72 585" class="st9"/>
+ </g>
+ <g id="shape1041-205" v:mID="1041" v:groupContext="shape" transform="translate(378.536,-256.5)">
+ <title>Sheet.1041</title>
+ <path d="M0 612 L17.46 612 L17.46 391.5 L35.93 391.5" class="st9"/>
+ </g>
+ <g id="shape1042-210" v:mID="1042" v:groupContext="shape" transform="translate(396,-450)">
+ <title>Sheet.1042</title>
+ <path d="M0 612 L18.47 612" class="st11"/>
+ </g>
+ <g id="shape1043-215" v:mID="1043" v:groupContext="shape" transform="translate(396,-378)">
+ <title>Sheet.1043</title>
+ <path d="M0 612 L29.85 612" class="st11"/>
+ </g>
+ <g id="shape1044-220" v:mID="1044" v:groupContext="shape" transform="translate(444.847,-310.5)">
+ <title>Sheet.1044</title>
+ <path d="M0 544.5 L122.15 544.5 L122.15 606.28" class="st9"/>
+ </g>
+ <g id="shape1045-225" v:mID="1045" v:groupContext="shape" transform="translate(436.5,-483.303)">
+ <title>Sheet.1045</title>
+ <path d="M0 612 L0 573.3 L55.11 573.3" class="st9"/>
+ </g>
+ <g id="shape1046-230" v:mID="1046" v:groupContext="shape" transform="translate(454.764,-310.5)">
+ <title>Sheet.1046</title>
+ <path d="M0 472.5 L121.24 472.5 L121.24 606.28" class="st9"/>
+ </g>
+ <g id="shape1048-235" v:mID="1048" v:groupContext="shape" transform="translate(558,-310.5)">
+ <title>Sheet.1048</title>
+ <path d="M0 400.5 L36 400.5 L36 606.28" class="st9"/>
+ </g>
+ <g id="shape1049-240" v:mID="1049" v:groupContext="shape" transform="translate(217.425,-310.5)">
+ <title>Sheet.1049</title>
+ <path d="M0 355.5 L385.57 355.5 L385.57 606.28" class="st9"/>
+ </g>
+ <g id="shape1051-245" v:mID="1051" v:groupContext="shape" transform="translate(454.764,-310.5)">
+ <title>Sheet.1051</title>
+ <path d="M0 445.5 L130.24 445.5 L130.24 606.28" class="st9"/>
+ </g>
+ <g id="shape1052-250" v:mID="1052" v:groupContext="shape" transform="translate(585,-310.5)">
+ <title>Sheet.1052</title>
+ </g>
+ <g id="shape1058-251" v:mID="1058" v:groupContext="shape" transform="translate(554.688,-519.75)">
+ <title>Sheet.1058</title>
+ <desc>request</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="24.1558" cy="603" width="48.32" height="18"/>
+ <rect x="0" y="594" width="48.3116" height="18" class="st4"/>
+ <text x="7.48" y="606" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>request</text> </g>
+ <g id="shape1059-254" v:mID="1059" v:groupContext="shape" transform="translate(496.168,-474.75)">
+ <title>Sheet.1059</title>
+ <desc>command</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="30.3325" cy="603" width="60.67" height="18"/>
+ <rect x="0" y="594" width="60.665" height="18" class="st4"/>
+ <text x="8.38" y="606" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>command</text> </g>
+ <g id="shape1060-257" v:mID="1060" v:groupContext="shape" transform="translate(490.5,-447.303)">
+ <title>Sheet.1060</title>
+ <desc>state handle id</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="45" cy="603" width="90" height="18"/>
+ <rect x="0" y="594" width="90" height="18" class="st4"/>
+ <text x="12.48" y="606" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>state handle id</text> </g>
+ <g id="shape1061-260" v:mID="1061" v:groupContext="shape" transform="translate(490.5,-375.75)">
+ <title>Sheet.1061</title>
+ <desc>additional data</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="42.75" cy="603" width="85.51" height="18"/>
+ <rect x="0" y="594" width="85.5" height="18" class="st4"/>
+ <text x="10.22" y="606" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>additional data</text> </g>
+ <g id="shape1062-263" v:mID="1062" v:groupContext="shape" transform="translate(304.047,-270)">
+ <title>Sheet.1062</title>
+ <path d="M0 612 L55.49 612" class="st11"/>
+ </g>
+ <g id="shape1063-268" v:mID="1063" v:groupContext="shape" transform="translate(304.047,-207)">
+ <title>Sheet.1063</title>
+ <path d="M118.95 612 L37.95 612 L37.95 553.5 L5.72 553.5" class="st9"/>
+ </g>
+ <g id="shape1064-273" v:mID="1064" v:groupContext="shape" transform="translate(303.75,-202.5)">
+ <title>Sheet.1064</title>
+ <path d="M0 612 L13.5 612 L13.5 553.5 L55.79 553.5" class="st9"/>
+ </g>
+ <g id="shape1065-278" v:mID="1065" v:groupContext="shape" transform="translate(304.047,-135)">
+ <title>Sheet.1065</title>
+ <path d="M0 612 L19.95 612 L19.95 495 L55.49 495" class="st9"/>
+ </g>
+ <g id="shape1066-283" v:mID="1066" v:groupContext="shape" transform="translate(303.75,-198)">
+ <title>Sheet.1066</title>
+ <path d="M38.25 603 L38.25 612 L5.72 612" class="st9"/>
+ </g>
+ <g id="shape1067-288" v:mID="1067" v:groupContext="shape" transform="translate(304.047,-130.5)">
+ <title>Sheet.1067</title>
+ <path d="M37.95 544.5 L37.95 612 L5.72 612" class="st9"/>
+ </g>
+ <g id="shape1068-293" v:mID="1068" v:groupContext="shape" transform="translate(306,-271.044)">
+ <title>Sheet.1068</title>
+ <desc>cmd, req</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="25.5925" cy="604.348" width="51.19" height="15.305"/>
+ <rect x="0" y="596.695" width="51.1849" height="15.305" class="st4"/>
+ <text x="6.14" y="607.35" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>cmd, req</text> </g>
+ <g id="shape1069-296" v:mID="1069" v:groupContext="shape" transform="translate(374.688,-202.5)">
+ <title>Sheet.1069</title>
+ <desc>cmd ack</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="24.1558" cy="601.424" width="48.32" height="21.1525"/>
+ <rect x="0" y="590.848" width="48.3116" height="21.1525" class="st4"/>
+ <text x="5.54" y="604.42" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>cmd ack</text> </g>
+ <g id="shape1070-299" v:mID="1070" v:groupContext="shape" transform="translate(436.5,-130.5)">
+ <title>Sheet.1070</title>
+ <path d="M18.76 612 L0 612 L0 563.35" class="st9"/>
+ </g>
+ <g id="shape1071-304" v:mID="1071" v:groupContext="shape" transform="translate(465.75,-105.973)">
+ <title>Sheet.1071</title>
+ <desc>K,V,RC,S</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="30.7562" cy="604.348" width="61.52" height="15.305"/>
+ <rect x="0" y="596.695" width="61.5123" height="15.305" class="st4"/>
+ <text x="9.36" y="607.35" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>K,V,RC,S</text> </g>
+ <g id="shape1072-307" v:mID="1072" v:groupContext="shape" transform="translate(304.047,-72)">
+ <title>Sheet.1072</title>
+ <path d="M289.95 555.75 L289.95 612 L46.95 612 L46.95 427.5 L5.72 427.5" class="st9"/>
+ </g>
+ <g id="shape1073-312" v:mID="1073" v:groupContext="shape" transform="translate(351,1037.25) rotate(180)">
+ <title>Sheet.1073</title>
+ <path d="M0 612 L41.53 612" class="st11"/>
+ </g>
+ <g id="shape1074-317" v:mID="1074" v:groupContext="shape" transform="translate(351,1102.5) rotate(180)">
+ <title>Sheet.1074</title>
+ <path d="M0 612 L41.23 612" class="st11"/>
+ </g>
+ <g id="shape1076-322" v:mID="1076" v:groupContext="shape" transform="translate(969.283,848.801) rotate(120.964)">
+ <title>Sheet.1076</title>
+ <path d="M0 612 L13.12 612" class="st8"/>
+ </g>
+ <g id="shape1077-325" v:mID="1077" v:groupContext="shape" transform="translate(418.267,-70.09)">
+ <title>Sheet.1077</title>
+ <desc>128 bit</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="30.7562" cy="601.09" width="61.52" height="21.82"/>
+ <rect x="0" y="590.18" width="61.5123" height="21.82" class="st4"/>
+ <text x="15.74" y="604.09" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>128 bit</text> </g>
+ <g id="shape1078-328" v:mID="1078" v:groupContext="shape" transform="translate(442.247,-51.75)">
+ <title>Sheet.1078</title>
+ <desc>genbits</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="24.1558" cy="599.18" width="48.32" height="25.6401"/>
+ <rect x="0" y="586.36" width="48.3116" height="25.6401" class="st4"/>
+ <text x="8.03" y="602.18" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>genbits</text> </g>
+ <g id="shape1079-331" v:mID="1079" v:groupContext="shape" transform="translate(520.344,-229.498)">
+ <title>Sheet.1079</title>
+ <desc>id != GEN</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="30.3325" cy="604.348" width="60.67" height="15.305"/>
+ <rect x="0" y="596.695" width="60.665" height="15.305" class="st4"/>
+ <text x="8.52" y="607.35" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>id != GEN</text> </g>
+ <g id="shape1080-334" v:mID="1080" v:groupContext="shape" transform="translate(613.838,-297)">
+ <title>Sheet.1080</title>
+ <path d="M0 612 L36.86 612" class="st11"/>
+ </g>
+ <g id="shape1082-339" v:mID="1082" v:groupContext="shape" transform="translate(613.838,-166.5)">
+ <title>Sheet.1082</title>
+ <path d="M0 612 L4.45 612 L19.15 612 L19.15 495 L37.44 495" class="st9"/>
+ </g>
+ <g id="shape1083-344" v:mID="1083" v:groupContext="shape" transform="translate(669.692,-292.5)">
+ <title>Sheet.1083</title>
+ <path d="M0 612 L37.92 612" class="st11"/>
+ </g>
+ <g id="shape1084-349" v:mID="1084" v:groupContext="shape" transform="translate(613.838,-148.5)">
+ <title>Sheet.1084</title>
+ <path d="M0 612 L38.2 612" class="st11"/>
+ </g>
+ <g id="shape1086-354" v:mID="1086" v:groupContext="shape" transform="translate(671.036,-162)">
+ <title>Sheet.1086</title>
+ <path d="M0 612 L36.58 612" class="st11"/>
+ </g>
+ <g id="shape1088-359" v:mID="1088" v:groupContext="shape" transform="translate(148.5,434.25) rotate(-90)">
+ <title>Sheet.1088</title>
+ <path d="M0 612 L77.53 612" class="st11"/>
+ </g>
+ <g id="shape1089-364" v:mID="1089" v:groupContext="shape" transform="translate(713.335,958.5) rotate(180)">
+ <title>Sheet.1089</title>
+ <path d="M0 612 L93.77 612" class="st11"/>
+ </g>
+ <g id="shape1090-369" v:mID="1090" v:groupContext="shape" transform="translate(613.838,-135)">
+ <title>Sheet.1090</title>
+ <path d="M146.66 558 L79.16 558 L79.16 612 L5.72 612" class="st9"/>
+ </g>
+ <g id="shape1091-374" v:mID="1091" v:groupContext="shape" transform="translate(613.838,-157.5)">
+ <title>Sheet.1091</title>
+ <path d="M11.66 504 L11.66 612 L5.72 612" class="st9"/>
+ </g>
+ <g id="shape1092-379" v:mID="1092" v:groupContext="shape" transform="translate(13.5,427.5) rotate(-90)">
+ <title>Sheet.1092</title>
+ <desc>id == GENG</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="33.75" cy="604.348" width="67.5" height="15.305"/>
+ <rect x="0" y="596.695" width="67.5" height="15.305" class="st4"/>
+ <text x="6.52" y="607.35" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>id == GENG</text> </g>
+ <g id="shape1093-382" v:mID="1093" v:groupContext="shape" transform="translate(627.118,-117.448)">
+ <title>Sheet.1093</title>
+ <desc>id == GENG</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="36" cy="604.348" width="72" height="15.305"/>
+ <rect x="0" y="596.695" width="72" height="15.305" class="st4"/>
+ <text x="8.77" y="607.35" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>id == GENG</text> </g>
+ <g id="shape1094-385" v:mID="1094" v:groupContext="shape" transform="translate(641.25,-164.25)">
+ <title>Sheet.1094</title>
+ <path d="M90 515.25 L90 564.75 L0 564.75 L0 612 L10.79 612" class="st9"/>
+ </g>
+ <g id="shape1095-390" v:mID="1095" v:groupContext="shape" transform="translate(867.029,354.416) rotate(120.964)">
+ <title>Sheet.1095</title>
+ <path d="M0 612 L13.12 612" class="st8"/>
+ </g>
+ <g id="shape1096-393" v:mID="1096" v:groupContext="shape" transform="translate(317.494,-566.045)">
+ <title>Sheet.1096</title>
+ <desc>384 bit</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="24.1558" cy="601.09" width="48.32" height="21.82"/>
+ <rect x="0" y="590.18" width="48.3116" height="21.82" class="st4"/>
+ <text x="9.14" y="604.09" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>384 bit</text> </g>
+ <g id="shape1097-396" v:mID="1097" v:groupContext="shape" transform="translate(339.994,-546.135)">
+ <title>Sheet.1097</title>
+ <desc>entropy</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="20.8268" cy="599.18" width="41.66" height="25.6401"/>
+ <rect x="0" y="586.36" width="41.6536" height="25.6401" class="st4"/>
+ <text x="4.15" y="602.18" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>entropy</text> </g>
+ <g id="shape1098-399" v:mID="1098" v:groupContext="shape" transform="translate(990.536,544.031) rotate(120.964)">
+ <title>Sheet.1098</title>
+ <path d="M0 612 L13.12 612" class="st8"/>
+ </g>
+ <g id="shape1099-402" v:mID="1099" v:groupContext="shape" transform="translate(441,-376.43)">
+ <title>Sheet.1099</title>
+ <desc>384 bit</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="24.1558" cy="601.09" width="48.32" height="21.82"/>
+ <rect x="0" y="590.18" width="48.3116" height="21.82" class="st4"/>
+ <text x="9.14" y="604.09" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>384 bit</text> </g>
+ <g id="shape1100-405" v:mID="1100" v:groupContext="shape" transform="translate(463.5,-356.52)">
+ <title>Sheet.1100</title>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <rect x="0" y="586.36" width="38.0063" height="25.6401" class="st4"/>
+ </g>
+ </g>
+</svg>
diff --git a/util/build_docs.py b/util/build_docs.py
index 8b0c647..ebf0dbe 100755
--- a/util/build_docs.py
+++ b/util/build_docs.py
@@ -51,6 +51,7 @@
"hw/ip/aes/data/aes.hjson",
"hw/top_earlgrey/ip/alert_handler/data/autogen/alert_handler.hjson",
"hw/ip/entropy_src/data/entropy_src.hjson",
+ "hw/ip/csrng/data/csrng.hjson",
"hw/ip/flash_ctrl/data/flash_ctrl.hjson",
"hw/ip/gpio/data/gpio.hjson",
"hw/ip/hmac/data/hmac.hjson",