../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: