[kmac_app_agent] Support hosts that don't spot constant shares

This code was originally designed for keymgr, which has a check to
make sure that no share is all zeros or all ones. The ROM controller
doesn't have such a check, so we need to tweak the agent slightly.

Without this change, setting err_rsp_pct to 100 in the config might
still result in a KMAC response whose rsp_error field is zero.

Signed-off-by: Rupert Swarbrick <rswarbrick@lowrisc.org>
diff --git a/hw/dv/sv/kmac_app_agent/kmac_app_agent_cfg.sv b/hw/dv/sv/kmac_app_agent/kmac_app_agent_cfg.sv
index cb570b9..949db5d 100644
--- a/hw/dv/sv/kmac_app_agent/kmac_app_agent_cfg.sv
+++ b/hw/dv/sv/kmac_app_agent/kmac_app_agent_cfg.sv
@@ -23,6 +23,10 @@
   // Knob to enable percentage of error response in auto-response sequence.
   int unsigned error_rsp_pct = 0;
 
+  // Knob to control whether an error response can be caused by all zeros or all ones in one of the
+  // shares.
+  bit constant_share_means_error = 1'b1;
+
   // Knob to allow injecting zeros in strb.
   bit inject_zero_in_host_strb = 0;
 
diff --git a/hw/dv/sv/kmac_app_agent/kmac_app_item.sv b/hw/dv/sv/kmac_app_agent/kmac_app_item.sv
index 6184bf7..beae8c2 100644
--- a/hw/dv/sv/kmac_app_agent/kmac_app_item.sv
+++ b/hw/dv/sv/kmac_app_agent/kmac_app_item.sv
@@ -4,10 +4,6 @@
 
 class kmac_app_item extends uvm_sequence_item;
 
-  // below 3 cases will trigger KMAC invalid output error
-  `define CALC_KMAC_DATA_INVALID \
-      (rsp_digest_share0 inside {0, '1} || rsp_digest_share1 inside {0, '1})
-
   // random variables
 
   // request data/mask
@@ -20,27 +16,24 @@
   rand bit [kmac_pkg::AppDigestW-1:0] rsp_digest_share1;
   rand bit                            rsp_error;
 
-  rand bit                is_kmac_rsp_err;
   rand int unsigned       rsp_delay;
 
-  constraint is_kmac_rsp_err_c {
-    (`CALC_KMAC_DATA_INVALID || rsp_error) == is_kmac_rsp_err;
-  }
-
   `uvm_object_utils_begin(kmac_app_item)
     `uvm_field_queue_int(byte_data_q, UVM_DEFAULT)
     `uvm_field_int(rsp_digest_share0, UVM_DEFAULT)
     `uvm_field_int(rsp_digest_share1, UVM_DEFAULT)
     `uvm_field_int(rsp_error,         UVM_DEFAULT)
-    `uvm_field_int(is_kmac_rsp_err,   UVM_DEFAULT)
     `uvm_field_int(rsp_delay,         UVM_DEFAULT)
   `uvm_object_utils_end
 
   `uvm_object_new
 
   virtual function bit get_is_kmac_rsp_data_invalid();
-    return `CALC_KMAC_DATA_INVALID;
+    return is_constant_share(rsp_digest_share0) || is_constant_share(rsp_digest_share1);
   endfunction
 
-  `undef CALC_KMAC_DATA_INVALID
+  static function bit is_constant_share(bit [kmac_pkg::AppDigestW-1:0] share);
+    return share inside {'0, '1};
+  endfunction
+
 endclass
diff --git a/hw/dv/sv/kmac_app_agent/seq_lib/kmac_app_device_seq.sv b/hw/dv/sv/kmac_app_agent/seq_lib/kmac_app_device_seq.sv
index 957286c..ecf587b 100644
--- a/hw/dv/sv/kmac_app_agent/seq_lib/kmac_app_device_seq.sv
+++ b/hw/dv/sv/kmac_app_agent/seq_lib/kmac_app_device_seq.sv
@@ -20,13 +20,17 @@
 
   virtual function void randomize_item(REQ item);
     kmac_pkg::rsp_digest_t rsp_digest_h = '0;
-    bit set_share;
+    bit gen_error, set_share;
+
     if (cfg.has_user_digest_share()) begin
       set_share = 1;
       rsp_digest_h = cfg.get_user_digest_share();
     end else begin
       set_share = 0;
     end
+
+    gen_error = $urandom_range(100, 1) <= cfg.error_rsp_pct;
+
     `DV_CHECK_RANDOMIZE_WITH_FATAL(item,
       if (cfg.zero_delays) {
         rsp_delay == 0;
@@ -37,8 +41,9 @@
         rsp_digest_share0 == rsp_digest_h.digest_share0;
         rsp_digest_share1 == rsp_digest_h.digest_share1;
       }
-      is_kmac_rsp_err dist {1 :/ cfg.error_rsp_pct,
-                            0 :/ 100 - cfg.error_rsp_pct};
+      gen_error == (rsp_error ||
+                    (cfg.constant_share_means_error &&
+                     (rsp_digest_share0 inside {'0, '1} || rsp_digest_share1 inside {'0, '1})));
     )
   endfunction
 
diff --git a/hw/ip/rom_ctrl/dv/env/rom_ctrl_env_cfg.sv b/hw/ip/rom_ctrl/dv/env/rom_ctrl_env_cfg.sv
index 1ac804f..729a26b 100644
--- a/hw/ip/rom_ctrl/dv/env/rom_ctrl_env_cfg.sv
+++ b/hw/ip/rom_ctrl/dv/env/rom_ctrl_env_cfg.sv
@@ -57,6 +57,7 @@
     m_kmac_agent_cfg = kmac_app_agent_cfg::type_id::create("m_kmac_agent_cfg");
     m_kmac_agent_cfg.if_mode = dv_utils_pkg::Device;
     m_kmac_agent_cfg.start_default_device_seq = 1'b1;
+    m_kmac_agent_cfg.constant_share_means_error = 1'b0;
 
     m_tl_agent_cfgs["rom_ctrl_rom_reg_block"].max_outstanding_req = 2;