[aes/dv] added reseeding to test

Signed-off-by: Rasmus Madsen <rasmus.madsen@wdc.com>
diff --git a/hw/ip/aes/dv/env/aes_env_cfg.sv b/hw/ip/aes/dv/env/aes_env_cfg.sv
index 0a779ee..20a5140 100644
--- a/hw/ip/aes/dv/env/aes_env_cfg.sv
+++ b/hw/ip/aes/dv/env/aes_env_cfg.sv
@@ -42,6 +42,11 @@
   int                key_192b_weight            = 10;
   int                key_256b_weight            = 10;
 
+  // reseed weigth
+  int                per8_weight                = 60;
+  int                per64_weight               = 30;
+  int                per8k_weight               = 10;
+
   // use manual operation mode percentage
   int                manual_operation_pct       = 10;
   // enable reseed on key touch
@@ -70,7 +75,7 @@
 
   //   [1]: mode error
   //   [0]: key_len
-  cfg_error_type_t   config_error_type          = 2'b00;
+  cfg_error_type_t   config_error_type          = 3'b000;
   int                config_error_pct           = 30;
 
   // min and max wait (clk) before an error injection
@@ -162,10 +167,7 @@
         m_tl_agent_cfg.d_ready_delay_max = 0;
         zero_delays                      = 1;
       end
-    endcase // case (host_resp_speed)
-
-
-    if (config_error_type[0] == 1'b1) num_corrupt_messages += 1;
+    endcase
   endfunction
 
 
diff --git a/hw/ip/aes/dv/env/aes_env_pkg.sv b/hw/ip/aes/dv/env/aes_env_pkg.sv
index 81abd04..d4b6c96 100644
--- a/hw/ip/aes/dv/env/aes_env_pkg.sv
+++ b/hw/ip/aes/dv/env/aes_env_pkg.sv
@@ -47,6 +47,7 @@
   typedef struct packed {
     bit          key_len;
     bit          mode;
+    bit          rsd_rate;
   } cfg_error_type_t;
 
 
diff --git a/hw/ip/aes/dv/env/aes_message_item.sv b/hw/ip/aes/dv/env/aes_message_item.sv
index ecfa0e2..69ecb92 100644
--- a/hw/ip/aes/dv/env/aes_message_item.sv
+++ b/hw/ip/aes/dv/env/aes_message_item.sv
@@ -66,6 +66,11 @@
   int    key_192b_weight      = 10;
   int    key_256b_weight      = 10;
 
+  // reseed weight
+  int    per8_weight          = 60;
+  int    per64_weight         = 30;
+  int    per8k_weight         = 10;
+
   // set if this message should not be
   // validated
   // due to a premature trigger
@@ -94,6 +99,8 @@
   rand cfg_error_type_t  cfg_error_type;
   // run AES in manual mode
   rand bit               manual_operation;
+  // reseed rate
+  rand bit [2:0]         reseed_rate;
 
 
   ///////////////////////////////////////
@@ -130,6 +137,20 @@
     };
   }
 
+  constraint rsd_rate_c {
+    solve has_config_error before reseed_rate;
+    solve cfg_error_type before reseed_rate;
+    if (!(has_config_error && cfg_error_type.rsd_rate) ) {
+      reseed_rate inside { 3'b001, 3'b010, 3'b100 };
+      reseed_rate dist   { 3'b001 :/ per8_weight,
+                           3'b010 :/ per64_weight,
+                           3'b100 :/ per8k_weight };
+    } else {
+      !( reseed_rate  inside { 3'b001, 3'b010, 3'b100 });
+    }
+  }
+
+
   constraint key_c {
     if (fixed_key_en) {
       aes_key[0] == fixed_key[0],
@@ -179,9 +200,9 @@
     solve has_config_error before cfg_error_type;
     solve sideload_en before cfg_error_type;
     if (has_config_error & !sideload_en) {
-      cfg_error_type inside {[1:3]};
+      cfg_error_type inside {[1:7]};
     } else {
-      cfg_error_type == 2'b00;
+      cfg_error_type == 3'b000;
     }
   }
 
@@ -335,5 +356,6 @@
     fixed_iv_en      = rhs_.fixed_iv_en;
     skip_msg         = rhs_.skip_msg;
     sideload_en      = rhs_.sideload_en;
+    reseed_rate      = rhs_.reseed_rate;
   endfunction // copy
 endclass
diff --git a/hw/ip/aes/dv/env/aes_seq_item.sv b/hw/ip/aes/dv/env/aes_seq_item.sv
index 4519bc3..196f670 100644
--- a/hw/ip/aes/dv/env/aes_seq_item.sv
+++ b/hw/ip/aes/dv/env/aes_seq_item.sv
@@ -33,6 +33,7 @@
   // indicate if the initialization vector is valid
   bit [3:0]       iv_vld;
   aes_mode_e      mode;
+  bit [2:0]       reseed_rate;
 
   bit             en_b2b_transactions  = 1;
   int             b2b_pct              = 80;
@@ -302,6 +303,7 @@
     split_item       = rhs_.split_item;
     data_was_cleared = rhs_.data_was_cleared;
     sideload_en      = rhs_.sideload_en;
+    reseed_rate      = rhs_.reseed_rate;
   endfunction // copy
 
 
diff --git a/hw/ip/aes/dv/env/seq_lib/aes_base_vseq.sv b/hw/ip/aes/dv/env/seq_lib/aes_base_vseq.sv
index 2d5b953..32cee04 100644
--- a/hw/ip/aes/dv/env/seq_lib/aes_base_vseq.sv
+++ b/hw/ip/aes/dv/env/seq_lib/aes_base_vseq.sv
@@ -206,6 +206,7 @@
       ral.ctrl_shadowed.key_len.set(item.key_len);
       ral.ctrl_shadowed.sideload.set(item.sideload_en);
       ral.ctrl_shadowed.manual_operation.set(item.manual_op);
+      ral.ctrl_shadowed.prng_reseed_rate.set(item.reseed_rate);
       csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
     end
   endtask
@@ -787,6 +788,7 @@
     aes_item.manual_op        = message_item.manual_operation;
     aes_item.key_mask         = message_item.keymask;
     aes_item.sideload_en      = message_item.sideload_en;
+    aes_item.reseed_rate      = message_item.reseed_rate;
     aes_item.clear_reg_pct    = cfg.clear_reg_pct;
     aes_item.clear_reg_w_rand = cfg.clear_reg_w_rand;
   endfunction // aes_item_init
@@ -831,6 +833,9 @@
     aes_message.fixed_keylen         = cfg.fixed_keylen;
     aes_message.fixed_iv_en          = cfg.fixed_iv_en;
     aes_message.sideload_pct         = cfg.sideload_pct;
+    aes_message.per8_weight          = cfg.per8_weight;
+    aes_message.per64_weight         = cfg.per64_weight;
+    aes_message.per8k_weight         = cfg.per8k_weight;
   endfunction
 
 
@@ -838,7 +843,7 @@
     aes_message_item cloned_message;
     for (int i=0; i < cfg.num_messages; i++) begin
       `DV_CHECK_RANDOMIZE_FATAL(aes_message)
-      if (aes_message.cfg_error_type[0] == 1'b1) cfg.num_corrupt_messages += 1;
+      if (aes_message.cfg_error_type[1] == 1'b1) cfg.num_corrupt_messages += 1;
       `downcast(cloned_message, aes_message.clone());
       message_queue.push_front(cloned_message);
       `uvm_info(`gfn, $sformatf("\n\t ----| MESSAGE # %d \n %s",i, cloned_message.convert2string())