[aes/dv] Implemented clering functionality from trigger reg

Signed-off-by: Rasmus Madsen <rasmus.madsen@wdc.com>
diff --git a/hw/ip/aes/dv/aes_sim_cfg.hjson b/hw/ip/aes/dv/aes_sim_cfg.hjson
index fac7eca..ffd194d 100644
--- a/hw/ip/aes/dv/aes_sim_cfg.hjson
+++ b/hw/ip/aes/dv/aes_sim_cfg.hjson
@@ -78,6 +78,11 @@
       uvm_test: aes_b2b_test
       uvm_test_seq: aes_stress_vseq
     }
+    {
+      name: aes_clear
+      uvm_test: aes_clear_test
+      uvm_test_seq: aes_clear_vseq
+    }
   ]
 
   // List of regressions.
diff --git a/hw/ip/aes/dv/env/aes_env.core b/hw/ip/aes/dv/env/aes_env.core
index 636bf8b..0335ccc 100644
--- a/hw/ip/aes/dv/env/aes_env.core
+++ b/hw/ip/aes/dv/env/aes_env.core
@@ -28,6 +28,7 @@
       - seq_lib/aes_common_vseq.sv: {is_include_file: true}
       - seq_lib/aes_wake_up_vseq.sv: {is_include_file: true}
       - seq_lib/aes_stress_vseq.sv: {is_include_file: true}
+      - seq_lib/aes_clear_vseq.sv: {is_include_file: true}
     file_type: systemVerilogSource
 
 generate:
diff --git a/hw/ip/aes/dv/env/aes_env_cfg.sv b/hw/ip/aes/dv/env/aes_env_cfg.sv
index a40942a..73d3cc0 100644
--- a/hw/ip/aes/dv/env/aes_env_cfg.sv
+++ b/hw/ip/aes/dv/env/aes_env_cfg.sv
@@ -76,6 +76,12 @@
   int            mal_error_pct              = 5;
   int            random_reset_pct           = 10;
 
+  // clear register percentage
+  // percentage of items that will try to clear
+  // one or more registers
+  int            clear_reg_pct              = 0;
+
+
 
   // rand variables
   // 0: C model 1: OPEN_SSL/BORING_SSL
@@ -90,9 +96,9 @@
 
 
   // constraints
-  constraint c_num_messages { num_messages inside {[num_messages_min : num_messages_max] };}
-  constraint c_ref_model    { ref_model    dist   { 0 :/ use_c_model_pct,
-                                                    1 :/ (100 - use_c_model_pct) }; }
+  constraint c_num_messages {num_messages inside {[num_messages_min : num_messages_max]};}
+  constraint c_ref_model    {ref_model    dist   { 0 :/ use_c_model_pct,
+                                                    1 :/ (100 - use_c_model_pct)};}
 
 
   function void post_randomize();
@@ -125,19 +131,19 @@
     string str = "";
     str = super.convert2string();
     str = {str,  $sformatf("\n\t ----| AES ENVIRONMENT CONFIG \t ") };
-    str = {str,  $sformatf("\n\t ----| Max Number of message %d \t ", num_messages_max) };
-    str = {str,  $sformatf("\n\t ----| Min Number of message %d \t ", num_messages_min) };
-    str = {str,  $sformatf("\n\t ----| Max message len %d bytes \t ", message_len_max) };
-    str = {str,  $sformatf("\n\t ----| Min message len %d bytes \t ", message_len_min) };
-    str = {str,  $sformatf("\n\t ----| Host response speed %s   \t ", host_resp_speed.name()) };
+    str = {str,  $sformatf("\n\t ----| Max Number of message %d \t ", num_messages_max)};
+    str = {str,  $sformatf("\n\t ----| Min Number of message %d \t ", num_messages_min)};
+    str = {str,  $sformatf("\n\t ----| Max message len %d bytes \t ", message_len_max)};
+    str = {str,  $sformatf("\n\t ----| Min message len %d bytes \t ", message_len_min)};
+    str = {str,  $sformatf("\n\t ----| Host response speed %s   \t ", host_resp_speed.name())};
     str = {str,  $sformatf("\n\t ----| Reference model:\t    %s              \t ",
-         (ref_model==0) ? "C-MODEL" : "OPEN_SSL" ) };
-    str = {str,  $sformatf("\n\t ----| num_messages # %d \t ", num_messages) };
-    str = {str,  $sformatf("\n\t ----| ECB Weight: %d         \t ", ecb_weight) };
-    str = {str,  $sformatf("\n\t ----| CBC Weight: %d         \t ", cbc_weight) };
-    str = {str,  $sformatf("\n\t ----| CFB Weight: %d         \t ", cfb_weight) };
-    str = {str,  $sformatf("\n\t ----| OFB Weight: %d         \t ", ofb_weight) };
-    str = {str,  $sformatf("\n\t ----| CTR Weight: %d         \t ", ctr_weight) };
+         (ref_model==0) ? "C-MODEL" : "OPEN_SSL" )};
+    str = {str,  $sformatf("\n\t ----| num_messages # %d \t ", num_messages)};
+    str = {str,  $sformatf("\n\t ----| ECB Weight: %d         \t ", ecb_weight)};
+    str = {str,  $sformatf("\n\t ----| CBC Weight: %d         \t ", cbc_weight)};
+    str = {str,  $sformatf("\n\t ----| CFB Weight: %d         \t ", cfb_weight)};
+    str = {str,  $sformatf("\n\t ----| OFB Weight: %d         \t ", ofb_weight)};
+    str = {str,  $sformatf("\n\t ----| CTR Weight: %d         \t ", ctr_weight)};
     str = {str,  $sformatf("\n\t ----| key mask:   %b         \t ", key_mask)};
     str = {str, "\n"};
     return str;
diff --git a/hw/ip/aes/dv/env/aes_env_pkg.sv b/hw/ip/aes/dv/env/aes_env_pkg.sv
index 2e58130..4c1c959 100644
--- a/hw/ip/aes/dv/env/aes_env_pkg.sv
+++ b/hw/ip/aes/dv/env/aes_env_pkg.sv
@@ -27,7 +27,13 @@
 
   typedef enum int { AES_CFG=0, AES_DATA=1, AES_ERR_INJ=2 } aes_item_type_e;
 
-  // functions
+  typedef struct packed {
+    bit          data_out;
+    bit          data_in;
+    bit          iv;
+    bit          key;
+  } clear_t;
+
 
   // package sources
  `include "aes_env_cfg.sv"
diff --git a/hw/ip/aes/dv/env/aes_message_item.sv b/hw/ip/aes/dv/env/aes_message_item.sv
index 1c547cc..0cf64aa 100644
--- a/hw/ip/aes/dv/env/aes_message_item.sv
+++ b/hw/ip/aes/dv/env/aes_message_item.sv
@@ -5,7 +5,6 @@
 class aes_message_item extends uvm_sequence_item;
 
   `uvm_object_utils(aes_message_item)
-
   `uvm_object_new
 
   ///////////////////////////////////////
@@ -40,6 +39,10 @@
   // fixed IV
   bit    fixed_iv_en          = 0;
 
+  // clear register percentage
+  // percentage of items that will try to clear
+  // one or more registers
+  int    clear_reg_pct        = 0;
 
 
   // predefined values for fixed mode
@@ -143,12 +146,12 @@
   constraint c_mode {
     solve has_config_error before aes_mode;
     solve cfg_error_type before aes_mode;
-    if (!(has_config_error && cfg_error_type[0]) ) {
+    if (!(has_config_error && cfg_error_type[0])) {
       aes_mode dist   { AES_ECB := ecb_weight,
                         AES_CBC := cbc_weight,
                         AES_CFB := cfb_weight,
                         AES_OFB := ofb_weight,
-                        AES_CTR := ctr_weight };
+                        AES_CTR := ctr_weight};
      } else {
        // the mode will be randomized to a random
        // non legal value later.
@@ -160,35 +163,39 @@
     if (error_types[0])
       {
       has_config_error dist { 0 :/ (100 - config_error_pct),
-                              1 :/ config_error_pct    };
+                              1 :/ config_error_pct};
       }
-    else { has_config_error == 0; }
+    else { has_config_error == 0;}
   }
 
   constraint c_config_error_type {
     solve has_config_error before cfg_error_type;
     if (has_config_error) {
-      cfg_error_type inside { [1:3] };
+      cfg_error_type inside {[1:3]};
     } else {
-      cfg_error_type ==2'b00;
+      cfg_error_type == 2'b00;
     }
   }
 
    constraint c_manual_operation {
                   manual_operation dist { 0:/ (100 - manual_operation_pct),
-                                          1:/ manual_operation_pct };
+                                          1:/ manual_operation_pct};
    };
 
 
   function void add_data_item(aes_seq_item item);
-    for(int i=0; i < 4 ; i++ ) begin
+    for (int i=0; i < 4 ; i++) begin
       // data_in.push_front (data_in[3:0])
       input_msg  = { input_msg , item.data_in[i][7:0], item.data_in[i][15:8], item.data_in[i][23:16]
                     ,item.data_in[i][31:24]};
       // data_in.push_front (data_in[3:0])
       output_msg = { output_msg, item.data_out[i][7:0], item.data_out[i][15:8],
                      item.data_out[i][23:16],item.data_out[i][31:24] };
+      `uvm_info(`gfn, $sformatf("\n\t ---| adding to 0x%0h to data, length is now: %0d",
+               {item.data_in[i][7:0], item.data_in[i][15:8],item.data_in[i][23:16], item.data_in[i][31:24]},
+               input_msg.size()), UVM_LOW)
     end
+
   endfunction // add_data_item
 
 
@@ -199,13 +206,13 @@
     this.aes_iv        = item.iv;
 
     // check for valid keylen
-    if ( item.key_len inside { 3'b001, 3'b010, 3'b100 } ) begin
+    if (item.key_len inside { 3'b001, 3'b010, 3'b100 }) begin
       this.aes_keylen  = item.key_len;
     end else begin
       this.aes_keylen = 3'b100; // force to 256b
-      `uvm_info(`gfn, $sformatf("\n\t ---| Illegal key len detected reverting to default 256"), UVM_MEDIUM)
+      `uvm_info(`gfn, $sformatf("\n\t ---| Illegal key len detected reverting to default 256"),
+                UVM_MEDIUM)
     end
-
     add_data_item(item);
   endfunction // add_start_msg_item
 
@@ -221,50 +228,61 @@
     str = super.convert2string();
     str = {str,  $sformatf("\n\t ----| \t\t AES MESSAGE ITEM   \t      |----\t ")
            };
-    str = {str, "\n\t ----| " };
+    str = {str, "\n\t ----| "};
     str = {str,  $sformatf("\n\t ----| Mode: \t  \t \t %s                         \t ",
-                           aes_mode.name() ) };
+                           aes_mode.name())};
     str = {str,  $sformatf("\n\t ----| Operation:   \t \t %s                         \t ",
-                           aes_operation.name() ) };
+                           aes_operation.name())};
     str = {str,  $sformatf("\n\t ----| has Configuration error:  %s  \t  \t        \t ",
-                           (has_config_error==1) ? "TRUE" : "FALSE" ) };
+                           (has_config_error==1) ? "TRUE" : "FALSE")};
     str = {str,  $sformatf("\n\t ----| Mode error en:  \t %d \n\t ----| Key_len error en: \t %d  \t         \t ",
-                           cfg_error_type[0], cfg_error_type[1]) };
+                           cfg_error_type[0], cfg_error_type[1])};
     str = {str,  $sformatf("\n\t ----| Message Length:  \t  \t %d             \t ",
-                           message_length ) };
+                           message_length)};
 
     str = {str,  $sformatf("\n\t ----| Key Length:   \t \t %03b                             \t ",
-                           aes_keylen) };
-    str = {str,  $sformatf("\n\t ----| Key Share 0: \t \t ") };
-    for(int i=0; i <8; i++) begin
+                           aes_keylen)};
+    str = {str,  $sformatf("\n\t ----| Key Share 0: \t \t ")};
+    for (int i=0; i <8; i++) begin
       str = {str, $sformatf("%h ",aes_key[0][i])};
     end
-    str = {str,  $sformatf("\n\t ----| Key Share 1: \t \t ") };
-    for(int i=0; i <8; i++) begin
+    str = {str,  $sformatf("\n\t ----| Key Share 1: \t \t ")};
+    for (int i=0; i <8; i++) begin
       str = {str, $sformatf("%h ",aes_key[1][i])};
     end
     str = {str,  $sformatf("\n\t ----| Key Mask:  \t  \t %0b                               |----\t ",
-                           keymask) };
-     str = {str,  $sformatf("\n\t ----| Initializaion vector:     \t    \t ") };
-    for(int i=0; i <4; i++) begin
+                           keymask)};
+     str = {str,  $sformatf("\n\t ----| Initializaion vector:     \t    \t ")};
+    for (int i=0; i <4; i++) begin
       str = {str, $sformatf("%h ",aes_iv[i])};
     end
-    str = {str,  $sformatf("\n\t ----| Manual Mode : %b      \t   \t ", manual_operation) };
-    str = {str,  $sformatf("\n\t ----| errors types enabled: %b      \t   \t ", error_types) };
-    str = {str,  $sformatf("\n\t ----| CFB Weight: %d       \t \t ", cfb_weight) };
-    str = {str,  $sformatf("\n\t ----| OFB Weight: %d       \t \t ", ofb_weight) };
-    str = {str,  $sformatf("\n\t ----| ECB Weight: %d       \t \t ", ecb_weight) };
-    str = {str,  $sformatf("\n\t ----| CBC Weight: %d       \t \t ", cbc_weight) };
-    str = {str,  $sformatf("\n\t ----| CTR Weight: %d       \t \t ", ctr_weight) };
+    str = {str,  $sformatf("\n\t ----| Manual Mode : %b      \t   \t ", manual_operation)};
+    str = {str,  $sformatf("\n\t ----| errors types enabled: %b      \t   \t ", error_types)};
+    str = {str,  $sformatf("\n\t ----| CFB Weight: %d       \t \t ", cfb_weight)};
+    str = {str,  $sformatf("\n\t ----| OFB Weight: %d       \t \t ", ofb_weight)};
+    str = {str,  $sformatf("\n\t ----| ECB Weight: %d       \t \t ", ecb_weight)};
+    str = {str,  $sformatf("\n\t ----| CBC Weight: %d       \t \t ", cbc_weight)};
+    str = {str,  $sformatf("\n\t ----| CTR Weight: %d       \t \t ", ctr_weight)};
     str = {str,  $sformatf("\n\t ----| Key Len Distribution: \t \t " ) };
-    str = {str,  $sformatf("\n\t ----| 128 Weight: %d       \t \t ", key_128b_weight) };
-    str = {str,  $sformatf("\n\t ----| 192 Weight: %d       \t \t ", key_192b_weight) };
-    str = {str,  $sformatf("\n\t ----| 256 Weight: %d       \t \t ", key_256b_weight) };
-    str = {str,  $sformatf("\n\t") };
+    str = {str,  $sformatf("\n\t ----| 128 Weight: %d       \t \t ", key_128b_weight)};
+    str = {str,  $sformatf("\n\t ----| 192 Weight: %d       \t \t ", key_192b_weight)};
+    str = {str,  $sformatf("\n\t ----| 256 Weight: %d       \t \t ", key_256b_weight)};
+    str = {str,  $sformatf("\n\t")};
 
     return str;
   endfunction // conver2string
 
+   virtual function string print_data();
+     string txt="";
+
+     txt = $sformatf("\n\t ----| Printing message data \n\t ----| data length: %d", input_msg.size());
+     foreach (input_msg[i]) begin
+       txt = {txt, $sformatf("\n\t ----| [%0d] 0x%0h \t 0x%0h",i, input_msg[i], output_msg[i])};
+     end
+     return txt;
+   endfunction // get_data_length
+
+
 
   virtual function void do_copy(uvm_object rhs);
     aes_message_item rhs_;
diff --git a/hw/ip/aes/dv/env/aes_scoreboard.sv b/hw/ip/aes/dv/env/aes_scoreboard.sv
index 3efd7fd..d8f7f5f 100644
--- a/hw/ip/aes/dv/env/aes_scoreboard.sv
+++ b/hw/ip/aes/dv/env/aes_scoreboard.sv
@@ -12,7 +12,6 @@
   );
 
   `uvm_component_utils(aes_scoreboard)
-
   `uvm_component_new
 
   // local variables
@@ -20,7 +19,7 @@
   aes_seq_item output_item;                   // item containing resulting output
   aes_seq_item complete_item;                 // merge of input and output items
 
-  bit          aes_from_rst       = 1;        // 1: nothing has happened since rst was released
+  bit          new_config         = 1;        // 1: from reset or a new config was entered
   bit          ok_to_fwd          = 0;        // 0: item is not ready to forward
   bit          finish_message     = 0;        // set when test is trying to end
                                               // - to indicate the last message is finished
@@ -103,6 +102,7 @@
             default:     input_item.mode = AES_NONE;
           endcase // case item.a_data[4:1]
           input_item.clean();
+          new_config = 1;
 
         end
 
@@ -148,36 +148,28 @@
 
       (!uvm_re_match("trigger", csr_name)): begin
         //start triggered
-        if (item.a_data[0]) begin
+        if (get_field_val(ral.trigger.start, item.a_data)) begin
            ok_to_fwd    = 1;
-           aes_from_rst = 0;
         end
         // clear key
-        if (item.a_data[1]) begin
-          if (cfg.clear_reg_w_rand) begin
-            input_item.key = '{default: {8{$urandom()}}};
-          end else begin
-            input_item.key = '{default: '0};
-          end
+        if (get_field_val(ral.trigger.key_clear, item.a_data)) begin
+          void'(input_item.key_clean(0,1));
+          new_config = 1;
+          `uvm_info(`gfn, $sformatf("\n\t ----clearing KEY"), UVM_MEDIUM)
         end
         // clear IV
-        if (item.a_data[2]) begin
-          if (cfg.clear_reg_w_rand) begin
-            input_item.iv = {4{$urandom()}};
-          end else begin
-            input_item.iv = '0;
-          end
+        if (get_field_val(ral.trigger.iv_clear, item.a_data)) begin
+          void'(input_item.iv_clean(0,1));
+          new_config = 1;
+          `uvm_info(`gfn, $sformatf("\n\t ----| clearing IV"), UVM_MEDIUM)
         end
         // clear data_in
-        if (item.a_data[3]) begin
-          if (cfg.clear_reg_w_rand) begin
-            input_item.data_in = {4{$urandom()}};
-          end else begin
-            input_item.data_in = '0;
-          end
+        if (get_field_val(ral.trigger.data_in_clear, item.a_data)) begin
+          input_item.clean_data_in();
+          `uvm_info(`gfn, $sformatf("\n\t ----| clearing DATA_IN"), UVM_MEDIUM)
         end
         // clear data out
-        if (item.a_data[4]) begin
+        if (get_field_val(ral.trigger.data_out_clear, item.a_data)) begin
           if (cfg.clear_reg_w_rand) begin
             input_item.data_out = {4{$urandom()}};
           end else begin
@@ -208,20 +200,20 @@
       if (input_item.valid && !input_item.manual_op) begin
         case (input_item.mode)
           AES_ECB: begin
-            `uvm_info(`gfn, $sformatf("\n\t ----| ECB mode"), UVM_MEDIUM)
-            if (aes_from_rst) begin
+            `uvm_info(`gfn, $sformatf("\n\t ----| ECB mode"), UVM_FULL)
+            if (new_config) begin
               // verify that all 4 data_in and all 8 key have been updated
-              if (input_item.data_in_valid() && input_item.key_clean(0)) begin
+              if (input_item.data_in_valid() && input_item.key_clean(0,0)) begin
                 //clone and add to ref and rec data fifo
                 ok_to_fwd    = 1;
-                aes_from_rst = 0;
+                new_config = 0;
               end
             end else begin
               // verify that all 4 data_in and all 8 key are clean
               `uvm_info(`gfn, $sformatf("\n\t ----|data_inv_vld?  %b, key clean ? %b",
-                        input_item.data_in_valid(), input_item.key_clean(1) ), UVM_MEDIUM)
+                        input_item.data_in_valid(), input_item.key_clean(1,0)), UVM_MEDIUM)
 
-              if (input_item.data_in_valid() && input_item.key_clean(1)) begin
+              if (input_item.data_in_valid() && input_item.key_clean(1,0)) begin
                 //clone and add to ref and rec data fifo
                 ok_to_fwd = 1;
               end
@@ -229,20 +221,20 @@
           end
 
           AES_CBC: begin
-            `uvm_info(`gfn, $sformatf("\n\t ----| CBC mode"), UVM_MEDIUM)
-            if (aes_from_rst) begin
+            `uvm_info(`gfn, $sformatf("\n\t ----| CBC mode"), UVM_FULL)
+            if (new_config) begin
               // verify that all 4 data_in and all 8 key and all 4 IV have been updated
-              if (input_item.data_in_valid() && input_item.key_clean(0) && input_item.iv_clean(0)) begin
+              if (input_item.data_in_valid() && input_item.key_clean(0,0) && input_item.iv_clean(0,0)) begin
                 //clone and add to ref and rec data fifo
                 ok_to_fwd    = 1;
-                aes_from_rst = 0;
+                new_config = 0;
               end
             end else begin
               // verify that all 4 data_in and all 8 key  and all 4 IV are clean
               `uvm_info(`gfn, $sformatf("\n\t ----|data_inv_vld?  %b, key clean ? %b",
-                                input_item.data_in_valid(), input_item.key_clean(1) ), UVM_MEDIUM)
+                                input_item.data_in_valid(), input_item.key_clean(1,0)), UVM_MEDIUM)
 
-              if (input_item.data_in_valid() && input_item.key_clean(1) && input_item.iv_clean(1)) begin
+              if (input_item.data_in_valid() && input_item.key_clean(1,0) && input_item.iv_clean(1,0)) begin
                 //clone and add to ref and rec data fifo
                 ok_to_fwd = 1;
               end
@@ -250,19 +242,19 @@
           end
 
           AES_CFB: begin
-            if (aes_from_rst) begin
+            if (new_config) begin
               // verify that all 4 data_in and all 8 key and all 4 IV have been updated
-              if (input_item.data_in_valid() && input_item.key_clean(0) && input_item.iv_clean(0)) begin
+              if (input_item.data_in_valid() && input_item.key_clean(0,0) && input_item.iv_clean(0,0)) begin
                 //clone and add to ref and rec data fifo
                 ok_to_fwd    = 1;
-                aes_from_rst = 0;
+                new_config = 0;
               end
             end else begin
               // verify that all 4 data_in and all 8 key  and all 4 IV are clean
               `uvm_info(`gfn, $sformatf("\n\t ----|data_inv_vld?  %b, key clean ? %b",
-                                input_item.data_in_valid(), input_item.key_clean(1) ), UVM_HIGH)
+                                input_item.data_in_valid(), input_item.key_clean(1,0)), UVM_HIGH)
 
-              if (input_item.data_in_valid() && input_item.key_clean(1) && input_item.iv_clean(1)) begin
+              if (input_item.data_in_valid() && input_item.key_clean(1,0) && input_item.iv_clean(1,0)) begin
                 //clone and add to ref and rec data fifo
                 ok_to_fwd = 1;
               end
@@ -270,19 +262,19 @@
           end
 
           AES_OFB: begin
-            if (aes_from_rst) begin
+            if (new_config) begin
               // verify that all 4 data_in and all 8 key and all 4 IV have been updated
-              if (input_item.data_in_valid() && input_item.key_clean(0) && input_item.iv_clean(0)) begin
+              if (input_item.data_in_valid() && input_item.key_clean(0,0) && input_item.iv_clean(0,0)) begin
                 //clone and add to ref and rec data fifo
                 ok_to_fwd    = 1;
-                aes_from_rst = 0;
+                new_config = 0;
               end
             end else begin
               // verify that all 4 data_in and all 8 key  and all 4 IV are clean
               `uvm_info(`gfn, $sformatf("\n\t ----|data_inv_vld?  %b, key clean ? %b",
-                                input_item.data_in_valid(), input_item.key_clean(1) ), UVM_HIGH)
+                                input_item.data_in_valid(), input_item.key_clean(1,0)), UVM_HIGH)
 
-              if (input_item.data_in_valid() && input_item.key_clean(1) && input_item.iv_clean(1)) begin
+              if (input_item.data_in_valid() && input_item.key_clean(1,0) && input_item.iv_clean(1,0)) begin
                 //clone and add to ref and rec data fifo
                 ok_to_fwd = 1;
               end
@@ -290,19 +282,19 @@
           end
 
           AES_CTR: begin
-            `uvm_info(`gfn, $sformatf("\n\t ----| CTR mode"), UVM_MEDIUM)
-            if (aes_from_rst) begin
+            `uvm_info(`gfn, $sformatf("\n\t ----| CTR mode"), UVM_FULL)
+            if (new_config) begin
               // verify that all 4 data_in and all 8 key and all 4 IV have been updated
-              if (input_item.data_in_valid() && input_item.key_clean(0) && input_item.iv_clean(0)) begin
+              if (input_item.data_in_valid() && input_item.key_clean(0,0) && input_item.iv_clean(0,0)) begin
                 //clone and add to ref and rec data fifo
                 ok_to_fwd    = 1;
-                aes_from_rst = 0;
+                new_config = 0;
               end
             end else begin
               // verify that all 4 data_in and all 8 and all 4 IV  key are clean
-              `uvm_info(`gfn, $sformatf("\n\t ----|data_inv_vld?  %b, key clean ? %b",input_item.data_in_valid(), input_item.key_clean(1) ),
+              `uvm_info(`gfn, $sformatf("\n\t ----|data_inv_vld?  %b, key clean ? %b",input_item.data_in_valid(), input_item.key_clean(1,0)),
                                        UVM_MEDIUM)
-              if (input_item.data_in_valid() && input_item.key_clean(1) && input_item.iv_clean(1)) begin
+              if (input_item.data_in_valid() && input_item.key_clean(1,0) && input_item.iv_clean(1,0)) begin
                 //clone and add to ref and rec data fifo
                 ok_to_fwd = 1;
               end
@@ -340,7 +332,7 @@
       end
       void'(csr.predict(.value(item.d_data), .kind(UVM_PREDICT_READ)));
       `uvm_info(`gfn, $sformatf("\n\t ----| SAW READ - %s data %02h",csr.get_name(),  item.d_data)
-                , UVM_MEDIUM)
+                , UVM_FULL)
 
       case (csr.get_name())
         "data_out_0": begin
@@ -362,21 +354,24 @@
       endcase // case (csr.get_name())
 
       if (output_item.data_out_valid()) begin
-        if ( rcv_item_q.size() == 0) begin
-          `uvm_fatal(`gfn, $sformatf("\n\t ----| TRIED TO READ EMPTY RECEIVE QUEUE |----"))
+        // if data_out is read multipletimes in a row we should not pop input more than once
+        if (rcv_item_q.size() == 0) begin
+//          `uvm_fatal(`gfn, $sformatf("\n\t ----| TRIED TO READ EMPTY RECEIVE QUEUE |----"))
+          output_item                = new();
+        end else begin
+
+          complete_item              = rcv_item_q.pop_back();
+          complete_item.data_out     = output_item.data_out;
+
+          `downcast(complete_clone, complete_item.clone());
+          item_fifo.put(complete_clone);
+
+          output_item                = new();
+          complete_item              = new();
+          `uvm_info(`gfn,
+            $sformatf("\n\t ----|added data to item_fifo (output received) fifo entries %d",
+                     item_fifo.num()), UVM_MEDIUM)
         end
-
-        complete_item              = rcv_item_q.pop_back();
-        complete_item.data_out     = output_item.data_out;
-
-        `downcast(complete_clone, complete_item.clone());
-        item_fifo.put(complete_clone);
-
-        output_item                = new();
-        complete_item              = new();
-        `uvm_info(`gfn,
-          $sformatf("\n\t ----|added data to item_fifo (output received) fifo entries %d",
-                   item_fifo.num()), UVM_MEDIUM)
       end
     end
   endtask // process_tl_access
@@ -396,7 +391,7 @@
     fork
       begin
         forever begin
-          case(msg_state)
+          case (msg_state)
             MSG_START: begin
               full_item = new();
               item_fifo.get(full_item);
@@ -414,7 +409,7 @@
               item_fifo.get(full_item);
               `uvm_info(`gfn, $sformatf("\n\t ----| got item from item fifo"), UVM_FULL)
               if (full_item.message_start() ) begin
-                `uvm_info(`gfn, $sformatf("\n\t ----| adding message item to mg_fifo"), UVM_FULL)
+                `uvm_info(`gfn, $sformatf("\n\t ----| adding message item to mg_fifo"), UVM_MEDIUM)
                 `downcast(msg_clone, message.clone());
                 msg_fifo.put(msg_clone);
                 message = new();
@@ -428,7 +423,7 @@
       end
 
       begin
-        wait( finish_message )
+        wait (finish_message)
         `uvm_info(`gfn, $sformatf("\n\t ----| Finish test received adding message item to mg_fifo"),
                                   UVM_MEDIUM)
 
@@ -453,6 +448,8 @@
                                 msg.aes_key[0], msg.aes_key[1]),
                                 UVM_MEDIUM)
 
+      `uvm_info(`gfn, $sformatf("/n/t ----| processing message %s \n\n \t message data %s", msg.convert2string(), msg.print_data()), UVM_LOW)
+
       if (msg.aes_mode != AES_NONE) begin
         msg.alloc_predicted_msg();
 
@@ -473,9 +470,9 @@
           if (msg.output_msg[n] != msg.predicted_msg[n]) begin
             txt = {"\t TEST FAILED MESSAGES DID NOT MATCH \n ", txt};
 
-            txt = {txt,  $sformatf("\n\n\t ----| ACTUAL OUTPUT DID NOT MATCH PREDICTED OUTPUT |----")};
-          txt = {txt, $sformatf("\n\t ----| FAILED AT BYTE #%0d \t ACTUAL: 0x%h \t PREDICTED: 0x%h, ",
-                                  n, msg.output_msg[n], msg.predicted_msg[n] )};
+            txt = {txt, $sformatf("\n\n\t ----| ACTUAL OUTPUT DID NOT MATCH PREDICTED OUTPUT |----")};
+            txt = {txt, $sformatf("\n\t ----| FAILED AT BYTE #%0d \t ACTUAL: 0x%h \t PREDICTED: 0x%h, ",
+                                  n, msg.output_msg[n], msg.predicted_msg[n])};
           `uvm_fatal(`gfn, $sformatf(" # %0d  \n\t %s \n", message_cnt, txt))
           end
         end
@@ -509,9 +506,9 @@
 
   virtual task wait_fifo_empty();
     `uvm_info(`gfn, $sformatf("item fifo entries %d", item_fifo.num()), UVM_MEDIUM)
-    wait (rcv_item_q.size() == 0 );
-    wait (item_fifo.num()   == 0 );
-    wait (msg_fifo.num()    == 0 );
+    wait (rcv_item_q.size() == 0);
+    wait (item_fifo.num()   == 0);
+    wait (msg_fifo.num()    == 0);
   endtask
 
 
@@ -542,7 +539,6 @@
         `uvm_fatal(`gfn, $sformatf("%s", txt) )
       end
     end
-
   endfunction
 
 
diff --git a/hw/ip/aes/dv/env/aes_seq_item.sv b/hw/ip/aes/dv/env/aes_seq_item.sv
index 9735846..c97bf43 100644
--- a/hw/ip/aes/dv/env/aes_seq_item.sv
+++ b/hw/ip/aes/dv/env/aes_seq_item.sv
@@ -4,11 +4,9 @@
 
 
 class aes_seq_item extends uvm_sequence_item;
-
   `uvm_object_utils(aes_seq_item)
 
   aes_item_type_e  item_type;
-
   aes_op_e operation;
 
   ///////////////////////////////////////
@@ -77,7 +75,7 @@
   // [2] input data
   // [1] IV
   // [0] key
-  rand bit [3:0]                    clear_reg;
+  rand clear_t                      clear_reg;
 
   constraint aes_mode_c {
    // force to be !onehot
@@ -90,10 +88,11 @@
 
   constraint aes_clear_reg_c {
         clear_reg dist {     0  :/ (100 - clear_reg_pct),
-                             1  :/ clear_reg_pct/5,
-                             2  :/ clear_reg_pct/5,
-                             4  :/ clear_reg_pct/5,
-                             8  :/ clear_reg_pct/5
+                             1  :/ clear_reg_pct/10,
+                             2  :/ clear_reg_pct/10,
+                             4  :/ clear_reg_pct/10,
+                             8  :/ clear_reg_pct/10,
+                             ($countones(clear_reg) > 2) :/ clear_reg_pct
                        };
   }
 
@@ -117,16 +116,13 @@
         default: begin
         end
       endcase // case (key_len)
-
-      if (!en_b2b_transactions) do_b2b = 0;
-
-      `uvm_info(`gfn, $sformatf("\n SUPERMAN mode is %s: %b" ,mode.name(), aes_mode), UVM_LOW)
-
     end
 
+    if (!en_b2b_transactions) do_b2b = 0;
+
     // mask unused data bits
-    if(data_len != 0) begin
-      for(int i=data_len; i<16; i++) begin
+    if (data_len != 0) begin
+      for (int i=data_len; i<16; i++) begin
         data_in[i[3:2]][i[1:0]*8+7 -:8] = 8'd0;
       end
     end
@@ -136,7 +132,7 @@
   // have been updated.
   function bit data_in_valid();
     `uvm_info(`gfn, $sformatf("\n\t ----| Checking if ALL data is updated %4b", data_in_vld)
-              , UVM_MEDIUM)
+              , UVM_FULL)
 
     return &data_in_vld;
   endfunction // data_in_valid
@@ -152,12 +148,23 @@
 
   // if ret_clean = 0
   // return 1 only of all registers have been written
-  // if ret_celan = 1
+  // if ret_clean = 1
   // return 1 if all or none of the registers have been written
-  function bit key_clean(bit ret_clean);
+  // if clear is set the register will be reset
+  function bit key_clean(bit ret_clean, bit clear);
     `uvm_info(`gfn, $sformatf("\n\t ----| Key status %b %b", key_vld[0], key_vld[1]), UVM_MEDIUM)
-    if(ret_clean) begin
-      return ( (&key_vld[0] & &key_vld[1]) || ~(|key_vld[0] | |key_vld[1]));
+    if (clear) begin
+    //  if(cfg.clear_reg_w_rand) begin
+    //    key = '{default: {8{$urandom()}}};
+    //  end else begin
+        key = '{default: '0};
+     // end
+      key_vld[0] = '0;
+      key_vld[1] = '0;
+    end
+
+    if (ret_clean) begin
+      return ((&key_vld[0] & &key_vld[1]) || ~(|key_vld[0] | |key_vld[1]));
     end else begin
       return (&key_vld[0] & &key_vld[1]);
     end
@@ -167,9 +174,18 @@
   // return 1 only of all registers have been written
   // if ret_celan = 1
   // return 1 if all or none of the registers have been written
-  function bit iv_clean(bit ret_clean);
-    if(ret_clean) begin
-      return  ( (&iv_vld) || ~(|iv_vld));
+  function bit iv_clean(bit ret_clean, bit clear);
+    if (clear) begin
+  //    if (cfg.clear_reg_w_rand) begin
+  //      iv = {4{$urandom()}};
+  //    end else begin
+        iv = '0;
+  //    end
+      iv_vld = '0;
+    end
+
+    if (ret_clean) begin
+      return ((&iv_vld) || ~(|iv_vld));
     end else begin
       return &iv_vld;
     end
@@ -210,6 +226,15 @@
     endcase // case (mode)
   endfunction // message_start
 
+  function void clean_data_in();
+//    if(cfg.clear_reg_w_rand) begin
+//      data_in = {4{$urandom()}};
+//    end else begin
+      data_in = '0;
+//    end
+    data_in_vld = '0;
+  endfunction // clean_data_in
+
 
   function void clean();
     data_in_vld  = '0;
@@ -269,23 +294,23 @@
     str = {str,  $psprintf("\n\t ----| Operation:    \t %s                          |----\t ",
                            operation.name() ) };
     str = {str,  $psprintf("\n\t ----| Key len:    \t %s  \t(%3b)                           |----\t ",
-                          (key_len==3'b001) ? "128b" : (key_len == 3'b010) ? "192b" : "256b", key_len) };
-    str = {str,  $psprintf("\n\t ----| Key Share 0: \t ") };
-    for(int i=0; i <8; i++) begin
+                          (key_len==3'b001) ? "128b" : (key_len == 3'b010) ? "192b" : "256b", key_len)};
+    str = {str,  $psprintf("\n\t ----| Key Share 0: \t ")};
+    for (int i=0; i <8; i++) begin
       str = {str, $psprintf("%h ",key[0][i])};
     end
     str = {str,  $psprintf("\n\t ----| Key Share 1: \t ") };
-    for(int i=0; i <8; i++) begin
+    for (int i=0; i <8; i++) begin
       str = {str, $psprintf("%h ",key[1][i])};
     end
-    str = {str,  $sformatf("\n\t ----| Initializaion vector:         \t ") };
-    for(int i=0; i <4; i++) begin
+    str = {str,  $sformatf("\n\t ----| Initializaion vector:         \t ")};
+    for (int i=0; i <4; i++) begin
       str = {str, $sformatf("%h ",iv[i])};
     end
-    str = {str,  $psprintf("\n\t ----| key_mask: \t %d |----\t  \t", key_mask) };
-    str = {str,  $psprintf("\n\t ----| Data Length: \t %d |----\t  \t", data_len) };
-    str = {str,  $psprintf("\n\t ----| Input data:  \t %h |----\t ", data_in) };
-    str = {str,  $psprintf("\n\t ----| Output data: \t %h |----\t ", data_out) };
+    str = {str,  $psprintf("\n\t ----| key_mask: \t %d |----\t  \t", key_mask)};
+    str = {str,  $psprintf("\n\t ----| Data Length: \t %d |----\t  \t", data_len)};
+    str = {str,  $psprintf("\n\t ----| Input data:  \t %h |----\t ", data_in)};
+    str = {str,  $psprintf("\n\t ----| Output data: \t %h |----\t ", data_out)};
     str = {str,  $psprintf("\n\t") };
 
     return str;
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 31adf76..9f5330d 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
@@ -59,6 +59,28 @@
   endtask // trigger
 
 
+  virtual task clear_regs(clear_t clr_vector);
+    string txt="";
+    bit [TL_DW:0] reg_val = '0;
+
+    txt = $sformatf("\n data_out: \t %0b", clr_vector.data_out);
+    txt = {txt, $sformatf("\n data_in: \t %0b", clr_vector.data_in)};
+    txt = {txt, $sformatf("\n data_iv: \t %0b", clr_vector.iv)};
+    txt = {txt, $sformatf("\n data_key: \t %0b", clr_vector.key)};
+    txt = {txt, $sformatf("\n vector: \t %0b", clr_vector)};
+    `uvm_info(`gfn, $sformatf("%s",txt), UVM_MEDIUM)
+    reg_val[4:1] = clr_vector;
+    csr_wr(.csr(ral.trigger), .value(reg_val));
+  endtask // clear_registers
+
+
+  virtual task prng_reseed();
+    bit [TL_DW:0] reg_val = '0;
+    reg_val[5] = 1'b1;
+    csr_wr(.csr(ral.trigger), .value(reg_val));
+  endtask // prng_reseed
+
+
   virtual task set_operation(bit operation);
     ral.ctrl_shadowed.operation.set(operation);
     csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
@@ -116,15 +138,23 @@
 
 
   virtual task add_data(ref bit [3:0] [31:0] data, bit do_b2b);
+    int write_order[4] = {0,1,2,3};
+
     `uvm_info(`gfn, $sformatf("\n\t ----| ADDING DATA TO DUT %h ", data),  UVM_MEDIUM)
     `uvm_info(`gfn, $sformatf("\n\t ----| DATA_IN_0: %h ", data[0]), UVM_HIGH)
     `uvm_info(`gfn, $sformatf("\n\t ----| DATA_IN_1: %h ", data[1]), UVM_HIGH)
     `uvm_info(`gfn, $sformatf("\n\t ----| DATA_IN_2: %h ", data[2]), UVM_HIGH)
     `uvm_info(`gfn, $sformatf("\n\t ----| DATA_IN_3: %h ", data[3]), UVM_HIGH)
-    csr_wr(.csr(ral.data_in_0), .value(data[0][31:0]), .blocking(~do_b2b) );
-    csr_wr(.csr(ral.data_in_1), .value(data[1][31:0]), .blocking(~do_b2b) );
-    csr_wr(.csr(ral.data_in_2), .value(data[2][31:0]), .blocking(~do_b2b) );
-    csr_wr(.csr(ral.data_in_3), .value(data[3][31:0]), .blocking(~do_b2b) );
+
+    write_order.shuffle();
+    foreach (write_order[i]) begin
+      case (write_order[i])
+        0: csr_wr(.csr(ral.data_in_0), .value(data[0][31:0]), .blocking(~do_b2b));
+        1: csr_wr(.csr(ral.data_in_1), .value(data[1][31:0]), .blocking(~do_b2b));
+        2: csr_wr(.csr(ral.data_in_2), .value(data[2][31:0]), .blocking(~do_b2b));
+        3: csr_wr(.csr(ral.data_in_3), .value(data[3][31:0]), .blocking(~do_b2b));
+      endcase
+    end
   endtask
 
 
@@ -133,8 +163,8 @@
     // randomize read order
     read_order.shuffle();
 
-    foreach(read_order[i]) begin
-      case(read_order[i])
+    foreach (read_order[i]) begin
+      case (read_order[i])
         0: csr_rd(.ptr(ral.data_out_0), .value(cypher_txt[0]), .blocking(~do_b2b));
         1: csr_rd(.ptr(ral.data_out_1), .value(cypher_txt[1]), .blocking(~do_b2b));
         2: csr_rd(.ptr(ral.data_out_2), .value(cypher_txt[2]), .blocking(~do_b2b));
@@ -144,10 +174,10 @@
 
     `uvm_info(`gfn, $sformatf("\n\t ----| READ OUTPUT DATA"), UVM_MEDIUM)
     `uvm_info(`gfn, $sformatf("\n\t ----| DATA FROM DUT %h ", cypher_txt), UVM_HIGH)
-    `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_0: %h ", cypher_txt[0][31:0]),  UVM_HIGH)
-    `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_1: %h ", cypher_txt[1][31:0]),  UVM_HIGH)
-    `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_2: %h ", cypher_txt[2][31:0]),  UVM_HIGH)
-    `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_3: %h ", cypher_txt[3][31:0]),  UVM_HIGH)
+    `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_0: %h ", cypher_txt[0][31:0]), UVM_HIGH)
+    `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_1: %h ", cypher_txt[1][31:0]), UVM_HIGH)
+    `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_2: %h ", cypher_txt[2][31:0]), UVM_HIGH)
+    `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_3: %h ", cypher_txt[3][31:0]), UVM_HIGH)
   endtask
 
 
@@ -162,10 +192,6 @@
     set_mode(item.aes_mode);
     set_key_len(item.key_len);
     set_manual_operation(item.manual_op);
-    if (!cfg.random_data_key_iv_order) begin
-      write_key(item.key, item.do_b2b);
-      if (item.mode != AES_ECB) write_iv(item.iv, item.do_b2b);
-    end
   endtask
 
 
@@ -196,8 +222,8 @@
     `uvm_info(`gfn, $sformatf("\n\t ----| FIXED DATA ENABLED? : %0b", msg_item.fixed_data_en),
               UVM_MEDIUM)
     for (int n = 0; n < msg_item.message_length - 15; n += 16) begin
-      if(msg_item.fixed_data_en) begin
-        `DV_CHECK_RANDOMIZE_WITH_FATAL(aes_item, data_in == msg_item.fixed_data; )
+      if (msg_item.fixed_data_en) begin
+        `DV_CHECK_RANDOMIZE_WITH_FATAL(aes_item, data_in == msg_item.fixed_data;)
       end else begin
         `DV_CHECK_RANDOMIZE_FATAL(aes_item)
       end
@@ -209,11 +235,11 @@
     end
 
     // check if message length is not divisible by 16bytes
-    if( msg_item.message_length[3:0] != 4'd0) begin
+    if (msg_item.message_length[3:0] != 4'd0) begin
       `uvm_info(`gfn, $sformatf("\n ----| generating runt "), UVM_MEDIUM)
       aes_item.data_len = msg_item.message_length[3:0];
-      if(msg_item.fixed_data_en) begin
-        `DV_CHECK_RANDOMIZE_WITH_FATAL(aes_item, data_in == msg_item.fixed_data; )
+      if (msg_item.fixed_data_en) begin
+        `DV_CHECK_RANDOMIZE_WITH_FATAL(aes_item, data_in == msg_item.fixed_data;)
       end else begin
         `DV_CHECK_RANDOMIZE_FATAL(aes_item)
       end
@@ -224,53 +250,71 @@
   endtask // generate_data_stream
 
 
-  virtual task write_interleaved_data_key_iv( bit [7:0] [31:0] key [2], [3:0] [31:0] iv, [3:0] [31:0] data );
+  virtual task write_data_key_iv( aes_seq_item item,  bit [3:0] [31:0] data);
     string txt="";
+    bit    is_blocking = ~item.do_b2b;
     string interleave_queue[] = '{ "key_share0_0", "key_share0_1", "key_share0_2", "key_share0_3",
                                    "key_share0_4", "key_share0_5", "key_share0_6", "key_share0_7",
                                    "key_share1_0", "key_share1_1", "key_share1_2", "key_share1_3",
                                    "key_share1_4", "key_share1_5", "key_share1_6", "key_share1_7",
-                                   "data_in_0", "data_in_1", "data_in_2", "data_in_3",
-                                   "iv_0", "iv_1", "iv_2", "iv_3" };
+                                   "data_in_0", "data_in_1", "data_in_2", "data_in_3"};
 
-    interleave_queue.shuffle();
+    // if non ECB mode add IV to queue
+    if (item.mode != AES_ECB) begin
+      interleave_queue = {"iv_0", "iv_1", "iv_2", "iv_3", interleave_queue};
+    end
 
-   foreach ( interleave_queue[i] ) begin
-     txt = {txt, $sformatf("----|\n \t %s", interleave_queue[i]) };
+    if (|item.clear_reg) begin
+      interleave_queue = { interleave_queue, "clear_reg"};
+      `uvm_info(`gfn, $sformatf("\n\t ----| Clear reg enabled adding register clear to Queue"),
+                 UVM_MEDIUM)
+    end
 
-     case (interleave_queue[i])
-       "key_share0_0": csr_wr(.csr(ral.key_share0_0), .value(key[0][0]));
-       "key_share0_1": csr_wr(.csr(ral.key_share0_1), .value(key[0][1]));
-       "key_share0_2": csr_wr(.csr(ral.key_share0_2), .value(key[0][2]));
-       "key_share0_3": csr_wr(.csr(ral.key_share0_3), .value(key[0][3]));
-       "key_share0_4": csr_wr(.csr(ral.key_share0_4), .value(key[0][4]));
-       "key_share0_5": csr_wr(.csr(ral.key_share0_5), .value(key[0][5]));
-       "key_share0_6": csr_wr(.csr(ral.key_share0_6), .value(key[0][6]));
-       "key_share0_7": csr_wr(.csr(ral.key_share0_7), .value(key[0][7]));
 
-       "key_share1_0": csr_wr(.csr(ral.key_share1_0), .value(key[1][0]));
-       "key_share1_1": csr_wr(.csr(ral.key_share1_1), .value(key[1][1]));
-       "key_share1_2": csr_wr(.csr(ral.key_share1_2), .value(key[1][2]));
-       "key_share1_3": csr_wr(.csr(ral.key_share1_3), .value(key[1][3]));
-       "key_share1_4": csr_wr(.csr(ral.key_share1_4), .value(key[1][4]));
-       "key_share1_5": csr_wr(.csr(ral.key_share1_5), .value(key[1][5]));
-       "key_share1_6": csr_wr(.csr(ral.key_share1_6), .value(key[1][6]));
-       "key_share1_7": csr_wr(.csr(ral.key_share1_7), .value(key[1][7]));
+    if (cfg.random_data_key_iv_order) interleave_queue.shuffle();
 
-       "iv_0": csr_wr(.csr(ral.iv_0), .value(iv[0]));
-       "iv_1": csr_wr(.csr(ral.iv_1), .value(iv[1]));
-       "iv_2": csr_wr(.csr(ral.iv_2), .value(iv[2]));
-       "iv_3": csr_wr(.csr(ral.iv_3), .value(iv[3]));
+    foreach ( interleave_queue[i] ) begin
+      txt = {txt, $sformatf("\n\t ----| \t %s", interleave_queue[i]) };
 
-       "data_in_0": csr_wr(.csr(ral.data_in_0), .value(data[0][31:0]));
-       "data_in_1": csr_wr(.csr(ral.data_in_1), .value(data[1][31:0]));
-       "data_in_2": csr_wr(.csr(ral.data_in_2), .value(data[2][31:0]));
-       "data_in_3": csr_wr(.csr(ral.data_in_3), .value(data[3][31:0]));
-     endcase // case interleave_queue[i]
-   end
-    `uvm_info(`gfn, $sformatf("\n\t ----| Configuring the DUT in the following order:  %s", txt),
+      case (interleave_queue[i])
+        "key_share0_0": csr_wr(.csr(ral.key_share0_0), .value(item.key[0][0]), .blocking(is_blocking));
+        "key_share0_1": csr_wr(.csr(ral.key_share0_1), .value(item.key[0][1]), .blocking(is_blocking));
+        "key_share0_2": csr_wr(.csr(ral.key_share0_2), .value(item.key[0][2]), .blocking(is_blocking));
+        "key_share0_3": csr_wr(.csr(ral.key_share0_3), .value(item.key[0][3]), .blocking(is_blocking));
+        "key_share0_4": csr_wr(.csr(ral.key_share0_4), .value(item.key[0][4]), .blocking(is_blocking));
+        "key_share0_5": csr_wr(.csr(ral.key_share0_5), .value(item.key[0][5]), .blocking(is_blocking));
+        "key_share0_6": csr_wr(.csr(ral.key_share0_6), .value(item.key[0][6]), .blocking(is_blocking));
+        "key_share0_7": csr_wr(.csr(ral.key_share0_7), .value(item.key[0][7]), .blocking(is_blocking));
+
+        "key_share1_0": csr_wr(.csr(ral.key_share1_0), .value(item.key[1][0]), .blocking(is_blocking));
+        "key_share1_1": csr_wr(.csr(ral.key_share1_1), .value(item.key[1][1]), .blocking(is_blocking));
+        "key_share1_2": csr_wr(.csr(ral.key_share1_2), .value(item.key[1][2]), .blocking(is_blocking));
+        "key_share1_3": csr_wr(.csr(ral.key_share1_3), .value(item.key[1][3]), .blocking(is_blocking));
+        "key_share1_4": csr_wr(.csr(ral.key_share1_4), .value(item.key[1][4]), .blocking(is_blocking));
+        "key_share1_5": csr_wr(.csr(ral.key_share1_5), .value(item.key[1][5]), .blocking(is_blocking));
+        "key_share1_6": csr_wr(.csr(ral.key_share1_6), .value(item.key[1][6]), .blocking(is_blocking));
+        "key_share1_7": csr_wr(.csr(ral.key_share1_7), .value(item.key[1][7]), .blocking(is_blocking));
+
+        "iv_0": csr_wr(.csr(ral.iv_0), .value(item.iv[0]), .blocking(is_blocking));
+        "iv_1": csr_wr(.csr(ral.iv_1), .value(item.iv[1]), .blocking(is_blocking));
+        "iv_2": csr_wr(.csr(ral.iv_2), .value(item.iv[2]), .blocking(is_blocking));
+        "iv_3": csr_wr(.csr(ral.iv_3), .value(item.iv[3]), .blocking(is_blocking));
+
+        "data_in_0": csr_wr(.csr(ral.data_in_0), .value(item.data_in[0][31:0]), .blocking(is_blocking));
+        "data_in_1": csr_wr(.csr(ral.data_in_1), .value(item.data_in[1][31:0]), .blocking(is_blocking));
+        "data_in_2": csr_wr(.csr(ral.data_in_2), .value(item.data_in[2][31:0]), .blocking(is_blocking));
+        "data_in_3": csr_wr(.csr(ral.data_in_3), .value(item.data_in[3][31:0]), .blocking(is_blocking));
+
+        "clear_reg": begin
+          clear_regs(item.clear_reg);
+          csr_spinwait(.ptr(ral.status.idle) , .exp_data(1'b1));
+        end
+
+      endcase // case interleave_queue[i]
+    end
+    `uvm_info(`gfn, $sformatf("\n\t ----| Configuring the DUT in the following order:  %s, \n\t data 0x%0h", txt, data),
               UVM_MEDIUM)
-  endtask // write_interleaved_data_key_iv
+  endtask // write_data_key_iv
 
 
   // TODO
@@ -290,15 +334,12 @@
     nxt_item = aes_item_queue.pop_back();
     setup_dut(nxt_item);
 
-    // interleave data key and IV in random matter
-    if ( cfg.random_data_key_iv_order) begin
-      last_item = nxt_item;
-      nxt_item = aes_item_queue.pop_back();
-      write_interleaved_data_key_iv(last_item.key, last_item.iv, nxt_item.data_in);
-      if (nxt_item.mode != AES_NONE) begin
-        csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1));    // poll for data valid
-        read_data(nxt_item.data_out, nxt_item.do_b2b);
-      end
+    last_item = nxt_item;
+    nxt_item = aes_item_queue.pop_back();
+    write_data_key_iv(last_item, nxt_item.data_in);
+    if (nxt_item.mode != AES_NONE) begin
+      csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1));    // poll for data valid
+      read_data(nxt_item.data_out, nxt_item.do_b2b);
     end
 
     while (aes_item_queue.size() > 0) begin
@@ -308,7 +349,7 @@
         `uvm_info(`gfn, $sformatf("\n\t ----| POLLING FOR DATA"), UVM_DEBUG)
         csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1));    // poll for data valid
         read_data(nxt_item.data_out, nxt_item.do_b2b);
-        end
+      end
     end
 
   endtask // transmit_message_with_rd_back
@@ -338,12 +379,11 @@
 
     setup_dut(nxt_item);
     `uvm_info(`gfn, $sformatf("\n\t ....| STARTING MANUAL OPERATION |...."), UVM_MEDIUM)
-    if ( cfg.random_data_key_iv_order) begin
-      last_item   = nxt_item;
-      nxt_item    = aes_item_queue.pop_back();
-      write_interleaved_data_key_iv(last_item.key, last_item.iv, nxt_item.data_in);
-      trigger();
-    end
+
+    last_item   = nxt_item;
+    nxt_item    = aes_item_queue.pop_back();
+    write_data_key_iv(last_item, nxt_item.data_in);
+    trigger();
 
     while (num_blocks > 0) begin // until all block has been processed and read out
       `uvm_info(`gfn, $sformatf("\n\t ....| missing output from %d blocks |....",num_blocks),
@@ -386,55 +426,57 @@
     if (aes_item_queue.size() < 1) begin
       `uvm_fatal(`gfn, $sformatf("\n\t -| TRYING TO READ FROM AN EMPTY QUEUE |-"))
     end
-    num_blocks = aes_item_queue.size() - 1;  // subtract cfg item
+    num_blocks = aes_item_queue.size() -1;  // subtract cfg item
     nxt_item   = aes_item_queue.pop_back();
 
     setup_dut(nxt_item);
     `uvm_info(`gfn, $sformatf("\n\t ....| STARTING MANUAL OPERATION |...."), UVM_MEDIUM)
-    if (cfg.random_data_key_iv_order) begin
-      last_item   = nxt_item;
-      nxt_item    = aes_item_queue.pop_back();
-      num_blocks -= 1;
-      write_interleaved_data_key_iv(last_item.key, last_item.iv, nxt_item.data_in);
-      trigger();
-      csr_spinwait(.ptr(ral.status.output_valid), .exp_data(1'b1));    // poll for data valid
-      read_data(nxt_item.data_out, nxt_item.do_b2b);
-    end
+
+    last_item   = nxt_item;
+    nxt_item    = aes_item_queue.pop_back();
+    num_blocks -= 1;
+    write_data_key_iv(last_item, nxt_item.data_in);
+    trigger();
+    csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1));    // poll for data valid
+    read_data(nxt_item.data_out, nxt_item.do_b2b);
 
     while (num_blocks > 0) begin // until all block has been processed and read out
-      `uvm_info(`gfn, $sformatf("\n\t ....| missing output from %d blocks |....", num_blocks),
+      `uvm_info(`gfn, $sformatf("\n\t ....| missing output from %d blocks |....",num_blocks),
                 UVM_MEDIUM)
 
       csr_spinwait(.ptr(ral.status.input_ready) , .exp_data(1'b1));
       `uvm_info(`gfn, $sformatf("\n\t ....| POLLED STATUS %h |....",status), UVM_MEDIUM)
-      `uvm_info(`gfn, $sformatf("\n\t ....| blocks left in message %d |....", aes_item_queue.size()),
+      `uvm_info(`gfn, $sformatf("\n\t ....| blocks left in message %d |....",aes_item_queue.size()),
                 UVM_MEDIUM)
 
       nxt_item = aes_item_queue.pop_back();
       add_data(nxt_item.data_in, nxt_item.do_b2b);
       trigger();
 
-      csr_spinwait(.ptr(ral.status.output_valid), .exp_data(1'b1));    // poll for data valid
+      csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1));    // poll for data valid
       read_data(nxt_item.data_out, nxt_item.do_b2b);
       num_blocks -= 1;
     end
-  endtask // transmist_message_manual_op_w_rd_back
+  endtask // trasnmist_message_manual_op_w_rd_back
 
 
+  ///////////////////////////////////////////////////////////
+  ///////////////        FUNCTIONS       ////////////////////
+  ///////////////////////////////////////////////////////////
 
   // initialize the global sequence item
   // with values from the message item (happens once per message item
   function void aes_item_init(ref aes_message_item message_item);
 
     aes_item = new();
-    aes_item.operation = message_item.aes_operation;
-    aes_item.mode      = message_item.aes_mode;
-    aes_item.key_len   = message_item.aes_keylen;
-    aes_item.key       = message_item.aes_key;
-    aes_item.iv        = message_item.aes_iv;
-    aes_item.manual_op = message_item.manual_operation;
-    aes_item.key_mask  = message_item.keymask;
-
+    aes_item.operation     = message_item.aes_operation;
+    aes_item.mode          = message_item.aes_mode;
+    aes_item.key_len       = message_item.aes_keylen;
+    aes_item.key           = message_item.aes_key;
+    aes_item.iv            = message_item.aes_iv;
+    aes_item.manual_op     = message_item.manual_operation;
+    aes_item.key_mask      = message_item.keymask;
+    aes_item.clear_reg_pct = cfg.clear_reg_pct;
   endfunction // aes_item_init
 
 
@@ -485,7 +527,6 @@
     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;
-
       `downcast(cloned_message, aes_message.clone());
       //`assert($cast(cloned_message, aes_message.clone());
       message_queue.push_front(cloned_message);
@@ -503,5 +544,5 @@
       `uvm_info(`gfn, $sformatf("----|  ITEM #%d", n ), UVM_MEDIUM)
       `uvm_info(`gfn, $sformatf("%s", print_item.convert2string()), UVM_MEDIUM)
     end
-  endfunction
+  endfunction // aes_print_item_queue
 endclass : aes_base_vseq
diff --git a/hw/ip/aes/dv/env/seq_lib/aes_clear_vseq.sv b/hw/ip/aes/dv/env/seq_lib/aes_clear_vseq.sv
new file mode 100644
index 0000000..d22c902
--- /dev/null
+++ b/hw/ip/aes/dv/env/seq_lib/aes_clear_vseq.sv
@@ -0,0 +1,103 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+// This sequence will send a number of messages
+// and in each case it will try to reset one or more
+// registers in the DUT verifying that registers are
+// indeed reset and false values are not posted anywere
+// and more importantly that parts of the Key and IV are not exposed
+
+// the first part Runs in auto mode
+// where the DUT recognized when to start an operation
+// the second part is done in manual mode
+// where special cases are setup before the start is triggered.
+
+
+class aes_clear_vseq extends aes_base_vseq;
+  `uvm_object_utils(aes_clear_vseq)
+  `uvm_object_new
+
+  aes_message_item my_message;
+  aes_seq_item nxt_item = new();
+  aes_seq_item last_item = new();
+  clear_t clear_reg_vec;
+
+  task body();
+    `uvm_info(`gfn, $sformatf("\n\n\t ----| STARTING AES CLEAR SEQUENCE |----\n %s", cfg.convert2string()),
+              UVM_LOW)
+
+    // generate list of messages //
+    generate_message_queue();
+
+    // process all messages //
+    while (message_queue.size() > 0) begin
+      // get next message from queue
+      my_message = new();
+      my_message = message_queue.pop_back();
+
+      // for this message generate configuration
+      // and data items (split message into blocks)
+      generate_aes_item_queue(my_message);
+
+      // setup and transmit based on settings
+      nxt_item = aes_item_queue.pop_back();
+      setup_dut(nxt_item);
+
+      // data and config are not in same
+      // items so both are needed for this.
+      last_item = nxt_item;
+      nxt_item = aes_item_queue.pop_back();
+      write_data_key_iv(last_item, nxt_item.data_in);
+      if (my_message.manual_operation) trigger();
+
+      // if a register was cleared
+      // re write the data to have the DUT move on
+      `uvm_info(`gfn, $sformatf("\n\t polling for Idle"), UVM_LOW)
+      if (last_item.clear_reg.data_in) begin
+        clear_regs(last_item.clear_reg);
+        csr_spinwait(.ptr(ral.status.idle) , .exp_data(1'b1));
+        `uvm_info(`gfn, $sformatf("\n\t ----| Re-Adding cleared data "), UVM_LOW)
+        add_data(nxt_item.data_in, nxt_item.do_b2b);
+      end
+
+      if (last_item.clear_reg.iv) begin
+        clear_regs(last_item.clear_reg);
+        csr_spinwait(.ptr(ral.status.idle) , .exp_data(1'b1));
+        `uvm_info(`gfn, $sformatf("\n\t ----| Re-Adding cleared IV "), UVM_LOW)
+        write_iv(last_item.iv, last_item.do_b2b);
+      end
+
+      if (last_item.clear_reg.key) begin
+        clear_regs(last_item.clear_reg);
+        csr_spinwait(.ptr(ral.status.idle) , .exp_data(1'b1));
+        `uvm_info(`gfn, $sformatf("\n\t ----| Re-Adding cleared key "), UVM_LOW)
+        write_key(last_item.key, last_item.do_b2b);
+      end
+
+      // wait for ready
+      if (nxt_item.mode != AES_NONE) begin
+        csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1));    // poll for data valid
+        read_data(nxt_item.data_out, nxt_item.do_b2b);
+      end else begin
+        `uvm_fatal(`gfn, $sformatf("\n\t ----| Invalid Modes are not supported in this test"))
+      end
+
+      // transmit the rest of the message
+      `uvm_info(`gfn, $sformatf("\n\t ----| data left in queue %d",aes_item_queue.size()), UVM_LOW)
+      while (aes_item_queue.size() > 0) begin
+        nxt_item = aes_item_queue.pop_back();
+        add_data(nxt_item.data_in, nxt_item.do_b2b);
+        if (my_message.manual_operation) trigger();
+        if (nxt_item.mode != AES_NONE) begin
+          `uvm_info(`gfn, $sformatf("\n\t ----| POLLING FOR DATA"), UVM_DEBUG)
+          csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1));    // poll for data valid
+          read_data(nxt_item.data_out, nxt_item.do_b2b);
+        end
+      end
+
+
+      `uvm_info(`gfn, $sformatf("\n\t ----| DONE TRANMISTTING MESSAGE"), UVM_LOW)
+    end
+  endtask : body
+endclass
diff --git a/hw/ip/aes/dv/env/seq_lib/aes_vseq_list.sv b/hw/ip/aes/dv/env/seq_lib/aes_vseq_list.sv
index 7d62c58..9ec00f3 100644
--- a/hw/ip/aes/dv/env/seq_lib/aes_vseq_list.sv
+++ b/hw/ip/aes/dv/env/seq_lib/aes_vseq_list.sv
@@ -6,3 +6,4 @@
 `include "aes_wake_up_vseq.sv"
 `include "aes_common_vseq.sv"
 `include "aes_stress_vseq.sv"
+`include "aes_clear_vseq.sv"
diff --git a/hw/ip/aes/dv/tests/aes_clear_test.sv b/hw/ip/aes/dv/tests/aes_clear_test.sv
new file mode 100644
index 0000000..a22a99d
--- /dev/null
+++ b/hw/ip/aes/dv/tests/aes_clear_test.sv
@@ -0,0 +1,50 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+class aes_clear_test extends aes_base_test;
+
+  `uvm_component_utils(aes_clear_test)
+  `uvm_component_new
+
+
+  virtual function void build_phase(uvm_phase phase);
+    super.build_phase(phase);
+    configure_env();
+  endfunction
+
+  function void configure_env();
+    super.configure_env();
+
+    cfg.error_types              = 0;
+    cfg.num_messages_min         = 1;
+    cfg.num_messages_max         = 5;
+    // message related knobs
+    cfg.ecb_weight               = 10;
+    cfg.cbc_weight               = 10;
+    cfg.ctr_weight               = 10;
+    cfg.ofb_weight               = 10;
+    cfg.cfb_weight               = 10;
+
+    cfg.message_len_min          = 1;
+    cfg.message_len_max          = 317;
+    cfg.manual_operation_pct     = 0;
+    cfg.use_key_mask             = 0;
+
+    cfg.fixed_data_en            = 0;
+    cfg.fixed_key_en             = 0;
+
+    cfg.fixed_operation_en       = 0;
+    cfg.fixed_operation          = 0;
+
+    cfg.fixed_keylen_en          = 0;
+    cfg.fixed_keylen             = 3'b001;
+
+    cfg.fixed_iv_en              = 0;
+
+    cfg.random_data_key_iv_order = 1;
+    cfg.clear_reg_pct            = 100;
+
+    `DV_CHECK_RANDOMIZE_FATAL(cfg)
+  endfunction
+endclass : aes_clear_test
diff --git a/hw/ip/aes/dv/tests/aes_test.core b/hw/ip/aes/dv/tests/aes_test.core
index 1d37d8b..0f1550e 100644
--- a/hw/ip/aes/dv/tests/aes_test.core
+++ b/hw/ip/aes/dv/tests/aes_test.core
@@ -16,6 +16,7 @@
       - aes_stress_test.sv: {is_include_file: true}
       - aes_b2b_test.sv: {is_include_file: true}
       - aes_config_error_test.sv: {is_include_file: true}
+      - aes_clear_test.sv: {is_include_file: true}
     file_type: systemVerilogSource
 
 targets:
diff --git a/hw/ip/aes/dv/tests/aes_test_pkg.sv b/hw/ip/aes/dv/tests/aes_test_pkg.sv
index 3883156..14e1875 100644
--- a/hw/ip/aes/dv/tests/aes_test_pkg.sv
+++ b/hw/ip/aes/dv/tests/aes_test_pkg.sv
@@ -23,5 +23,6 @@
   `include "aes_stress_test.sv"
   `include "aes_b2b_test.sv"
   `include "aes_config_error_test.sv"
+  `include "aes_clear_test.sv"
 
 endpackage