../src/lowrisc_ip_aes_0.6/rtl/aes_prng.sv Cov: 100%

   1: // Copyright lowRISC contributors.
   2: // Licensed under the Apache License, Version 2.0, see LICENSE for details.
   3: // SPDX-License-Identifier: Apache-2.0
   4: //
   5: // AES pseudo-random number generator
   6: //
   7: // This module uses an LFSR connected to a PRINCE S-Box to provide pseudo-random data to the AES
   8: // module primarily for clearing registers. The LFSR can be reseeded using an external interface.
   9: 
  10: module aes_prng (
  11:   input  logic        clk_i,
  12:   input  logic        rst_ni,
  13: 
  14:   // Connections to AES internals, PRNG consumers
  15:   input  logic        data_req_i,
  16:   output logic        data_ack_o,
  17:   output logic [63:0] data_o,
  18:   input  logic        reseed_req_i,
  19:   output logic        reseed_ack_o,
  20: 
  21:   // Connections to outer world, LFSR re-seed
  22:   output logic        entropy_req_o,
  23:   input  logic        entropy_ack_i,
  24:   input  logic [63:0] entropy_i
  25: );
  26: 
  27:   localparam int unsigned DATA_WIDTH = 64;
  28: 
  29:   logic                  seed_en;
  30:   logic                  lfsr_en;
  31:   logic [DATA_WIDTH-1:0] lfsr_state;
  32:   logic [DATA_WIDTH-1:0] scrambled;
  33: 
  34:   // The data requests are fed from the LFSR, reseed requests have the highest priority.
  35:   assign data_ack_o    = reseed_req_i ? 1'b0 : data_req_i;
  36: 
  37:   // Reseed requests are directly forwarded to the external interface.
  38:   assign reseed_ack_o  = entropy_ack_i;
  39:   assign entropy_req_o = reseed_req_i;
  40: 
  41:   // LFSR control
  42:   assign lfsr_en = data_req_i & data_ack_o;
  43:   assign seed_en = entropy_req_o & entropy_ack_i;
  44: 
  45:   // LFSR instance
  46:   prim_lfsr #(
  47:     .LfsrType    ( "GAL_XOR"  ),
  48:     .LfsrDw      ( DATA_WIDTH ),
  49:     .StateOutDw  ( DATA_WIDTH )
  50:   ) aes_prng_lfsr (
  51:     .clk_i     ( clk_i      ),
  52:     .rst_ni    ( rst_ni     ),
  53:     .seed_en_i ( seed_en    ),
  54:     .seed_i    ( entropy_i  ),
  55:     .lfsr_en_i ( lfsr_en    ),
  56:     .entropy_i (         '0 ),
  57:     .state_o   ( lfsr_state )
  58:   );
  59: 
  60:   // "Scramble" the LFSR state.
  61:   assign scrambled = prim_cipher_pkg::sbox4_64bit(lfsr_state, prim_cipher_pkg::PRINCE_SBOX4);
  62:   assign data_o    = prim_cipher_pkg::perm_64bit(scrambled, prim_cipher_pkg::PRESENT_PERM64);
  63: 
  64: endmodule
  65: