[aes] Overwrite invalid key length values

This commit modifies the AES unit to update the control register
with a valid key length value in case an invalid value is provided
by software.
diff --git a/hw/ip/aes/doc/aes.hjson b/hw/ip/aes/doc/aes.hjson
index d02db19..64071ae 100644
--- a/hw/ip/aes/doc/aes.hjson
+++ b/hw/ip/aes/doc/aes.hjson
@@ -75,6 +75,7 @@
     desc: "Control Register",
     swaccess: "rw",
     hwaccess: "hro",
+    hwqe: "true",
     fields: [
       { bits: "0",
         name: "MODE",
@@ -85,6 +86,7 @@
       { bits: "3:1",
         name: "KEY_LEN",
         resval: "1",
+        hwaccess: "hrw",
         desc:  '''
           3-bit one-hot field to select AES key length: 128 bit (3’b001), 192 bit (3’b010)
           or 256 bit (3’b100). Invalid input values, i.e., value with multiple bits set,
diff --git a/hw/ip/aes/rtl/aes_core.sv b/hw/ip/aes/rtl/aes_core.sv
index a60a4da..1ec5908 100644
--- a/hw/ip/aes/rtl/aes_core.sv
+++ b/hw/ip/aes/rtl/aes_core.sv
@@ -81,12 +81,12 @@
 
   always_comb begin : get_key_len
     unique case (key_len_e'(reg2hw.ctrl.key_len.q))
-      AES_128: key_len   = AES_128;
-      AES_256: key_len   = AES_256;
+      AES_128: key_len = AES_128;
+      AES_256: key_len = AES_256;
       AES_192: begin
         key_len = AES192Enable ? AES_192 : AES_128;
       end
-      default: key_len   = AES_128; // unsupported values are mapped to AES_128
+      default: key_len = AES_128; // unsupported values are mapped to AES_128
     endcase
   end
 
@@ -190,6 +190,9 @@
   assign hw2reg.data_out2.d = data_out_q[2];
   assign hw2reg.data_out3.d = data_out_q[3];
 
+  assign hw2reg.ctrl.key_len.d  = {key_len};
+  assign hw2reg.ctrl.key_len.de = reg2hw.ctrl.key_len.qe;
+
   assign hw2reg.trigger.d   = 1'b0;
   assign hw2reg.trigger.de  = 1'b1;
 
diff --git a/hw/ip/aes/rtl/aes_reg_pkg.sv b/hw/ip/aes/rtl/aes_reg_pkg.sv
index 2f94b26..73705b8 100644
--- a/hw/ip/aes/rtl/aes_reg_pkg.sv
+++ b/hw/ip/aes/rtl/aes_reg_pkg.sv
@@ -10,81 +10,85 @@
 typedef struct packed {
 
   struct packed {
-    logic [31:0] q; // [534:503]
-    logic qe; // [502]
+    logic [31:0] q; // [538:507]
+    logic qe; // [506]
   } key0;
   struct packed {
-    logic [31:0] q; // [501:470]
-    logic qe; // [469]
+    logic [31:0] q; // [505:474]
+    logic qe; // [473]
   } key1;
   struct packed {
-    logic [31:0] q; // [468:437]
-    logic qe; // [436]
+    logic [31:0] q; // [472:441]
+    logic qe; // [440]
   } key2;
   struct packed {
-    logic [31:0] q; // [435:404]
-    logic qe; // [403]
+    logic [31:0] q; // [439:408]
+    logic qe; // [407]
   } key3;
   struct packed {
-    logic [31:0] q; // [402:371]
-    logic qe; // [370]
+    logic [31:0] q; // [406:375]
+    logic qe; // [374]
   } key4;
   struct packed {
-    logic [31:0] q; // [369:338]
-    logic qe; // [337]
+    logic [31:0] q; // [373:342]
+    logic qe; // [341]
   } key5;
   struct packed {
-    logic [31:0] q; // [336:305]
-    logic qe; // [304]
+    logic [31:0] q; // [340:309]
+    logic qe; // [308]
   } key6;
   struct packed {
-    logic [31:0] q; // [303:272]
-    logic qe; // [271]
+    logic [31:0] q; // [307:276]
+    logic qe; // [275]
   } key7;
   struct packed {
-    logic [31:0] q; // [270:239]
-    logic qe; // [238]
+    logic [31:0] q; // [274:243]
+    logic qe; // [242]
   } data_in0;
   struct packed {
-    logic [31:0] q; // [237:206]
-    logic qe; // [205]
+    logic [31:0] q; // [241:210]
+    logic qe; // [209]
   } data_in1;
   struct packed {
-    logic [31:0] q; // [204:173]
-    logic qe; // [172]
+    logic [31:0] q; // [208:177]
+    logic qe; // [176]
   } data_in2;
   struct packed {
-    logic [31:0] q; // [171:140]
-    logic qe; // [139]
+    logic [31:0] q; // [175:144]
+    logic qe; // [143]
   } data_in3;
   struct packed {
-    logic [31:0] q; // [138:107]
-    logic re; // [106]
+    logic [31:0] q; // [142:111]
+    logic re; // [110]
   } data_out0;
   struct packed {
-    logic [31:0] q; // [105:74]
-    logic re; // [73]
+    logic [31:0] q; // [109:78]
+    logic re; // [77]
   } data_out1;
   struct packed {
-    logic [31:0] q; // [72:41]
-    logic re; // [40]
+    logic [31:0] q; // [76:45]
+    logic re; // [44]
   } data_out2;
   struct packed {
-    logic [31:0] q; // [39:8]
-    logic re; // [7]
+    logic [31:0] q; // [43:12]
+    logic re; // [11]
   } data_out3;
   struct packed {
     struct packed {
-      logic q; // [6]
+      logic q; // [10]
+      logic qe; // [9]
     } mode;
     struct packed {
-      logic [2:0] q; // [5:3]
+      logic [2:0] q; // [8:6]
+      logic qe; // [5]
     } key_len;
     struct packed {
-      logic q; // [2]
+      logic q; // [4]
+      logic qe; // [3]
     } manual_start_trigger;
     struct packed {
-      logic q; // [1]
+      logic q; // [2]
+      logic qe; // [1]
     } force_data_overwrite;
   } ctrl;
   struct packed {
@@ -96,18 +100,24 @@
 typedef struct packed {
 
   struct packed {
-    logic [31:0] d; // [137:106]
+    logic [31:0] d; // [141:110]
   } data_out0;
   struct packed {
-    logic [31:0] d; // [105:74]
+    logic [31:0] d; // [109:78]
   } data_out1;
   struct packed {
-    logic [31:0] d; // [73:42]
+    logic [31:0] d; // [77:46]
   } data_out2;
   struct packed {
-    logic [31:0] d; // [41:10]
+    logic [31:0] d; // [45:14]
   } data_out3;
   struct packed {
+    struct packed {
+      logic [2:0] d; // [13:11]
+      logic de; // [10]
+    } key_len;
+  } ctrl;
+  struct packed {
     logic [0:0] d; // [9:9]
     logic de; // [8]
   } trigger;
diff --git a/hw/ip/aes/rtl/aes_reg_top.sv b/hw/ip/aes/rtl/aes_reg_top.sv
index bd9e344..f46e1e9 100644
--- a/hw/ip/aes/rtl/aes_reg_top.sv
+++ b/hw/ip/aes/rtl/aes_reg_top.sv
@@ -541,7 +541,7 @@
     .d      ('0  ),
 
     // to internal hardware
-    .qe     (),
+    .qe     (reg2hw.ctrl.mode.qe),
     .q      (reg2hw.ctrl.mode.q ),
 
     // to register interface (read)
@@ -563,11 +563,11 @@
     .wd     (ctrl_key_len_wd),
 
     // from internal hardware
-    .de     (1'b0),
-    .d      ('0  ),
+    .de     (hw2reg.ctrl.key_len.de),
+    .d      (hw2reg.ctrl.key_len.d ),
 
     // to internal hardware
-    .qe     (),
+    .qe     (reg2hw.ctrl.key_len.qe),
     .q      (reg2hw.ctrl.key_len.q ),
 
     // to register interface (read)
@@ -593,7 +593,7 @@
     .d      ('0  ),
 
     // to internal hardware
-    .qe     (),
+    .qe     (reg2hw.ctrl.manual_start_trigger.qe),
     .q      (reg2hw.ctrl.manual_start_trigger.q ),
 
     // to register interface (read)
@@ -619,7 +619,7 @@
     .d      ('0  ),
 
     // to internal hardware
-    .qe     (),
+    .qe     (reg2hw.ctrl.force_data_overwrite.qe),
     .q      (reg2hw.ctrl.force_data_overwrite.q ),
 
     // to register interface (read)