[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)