[aes] Clear internal registers with pseudo-random data

This commit adds an LFSR-based pseudo-random number generator to the AES
module that is used to clear various registers (input data, output data,
IV, key, internal state). The LFSR can be reseeded at runtime using a
bit in the TRIGGER register.

The reset for all these registers is removed. After a reset, the AES unit
first reseeds the LFSR and then clears all these registers with
pseudo-random data.

Signed-off-by: Pirmin Vogel <vogelpi@lowrisc.org>
diff --git a/hw/ip/aes/rtl/aes.sv b/hw/ip/aes/rtl/aes.sv
index 605bc6c..4040067 100644
--- a/hw/ip/aes/rtl/aes.sv
+++ b/hw/ip/aes/rtl/aes.sv
@@ -13,7 +13,14 @@
   input                     clk_i,
   input                     rst_ni,
 
-  // Bus Interface
+  // Entropy source interface
+  // TODO: This still needs to be connected.
+  // See https://github.com/lowRISC/opentitan/issues/1005
+  //output logic              entropy_req_o,
+  //input  logic              entropy_ack_i,
+  //input  logic [63:0]       entropy_i,
+
+  // Bus interface
   input  tlul_pkg::tl_h2d_t tl_i,
   output tlul_pkg::tl_d2h_t tl_o
 );
@@ -23,7 +30,13 @@
   aes_reg2hw_t reg2hw;
   aes_hw2reg_t hw2reg;
 
-  aes_reg_top u_reg (
+  logic        prng_data_req;
+  logic        prng_data_ack;
+  logic [63:0] prng_data;
+  logic        prng_reseed_req;
+  logic        prng_reseed_ack;
+
+  aes_reg_top aes_reg_top (
     .clk_i,
     .rst_ni,
     .tl_i,
@@ -39,10 +52,34 @@
   ) aes_core (
     .clk_i,
     .rst_ni,
+
+    .prng_data_req_o   ( prng_data_req   ),
+    .prng_data_ack_i   ( prng_data_ack   ),
+    .prng_data_i       ( prng_data       ),
+    .prng_reseed_req_o ( prng_reseed_req ),
+    .prng_reseed_ack_i ( prng_reseed_ack ),
+
     .reg2hw,
     .hw2reg
   );
 
+  aes_prng aes_prng (
+    .clk_i,
+    .rst_ni,
+
+    .data_req_i   ( prng_data_req   ),
+    .data_ack_o   ( prng_data_ack   ),
+    .data_o       ( prng_data       ),
+    .reseed_req_i ( prng_reseed_req ),
+    .reseed_ack_o ( prng_reseed_ack ),
+
+    // TODO: This still needs to be connected to the entropy source.
+    // See https://github.com/lowRISC/opentitan/issues/1005
+    .entropy_req_o(                      ),
+    .entropy_ack_i(                 1'b1 ),
+    .entropy_i    ( 64'hFEDCBA9876543210 )
+  );
+
   // All outputs should have a known value after reset
   `ASSERT_KNOWN(TlODValidKnown, tl_o.d_valid)
   `ASSERT_KNOWN(TlOAReadyKnown, tl_o.a_ready)