[dv/kmac] update error_cg

this PR updates the `error_cg`to collect coverage on newly added IP
errors, and makes the corresponding documentation more clear as to what
coverage is being collected on for each type of error.

Signed-off-by: Udi Jonnalagadda <udij@google.com>
diff --git a/hw/ip/kmac/data/kmac_base_testplan.hjson b/hw/ip/kmac/data/kmac_base_testplan.hjson
index 7a99e4f..41fd9c7 100644
--- a/hw/ip/kmac/data/kmac_base_testplan.hjson
+++ b/hw/ip/kmac/data/kmac_base_testplan.hjson
@@ -266,7 +266,18 @@
     {
       name: error_cg
       desc: '''
-            Covers that all errors have been seen by the KMAC.
+            Covers all error scenarios:
+            - ErrKeyNotValid: covers that secret key is invalid when KeyMgr initiates App operation
+            - ErrSwPushedMsgFifo: covers that SW writes the msgfifo while App interface is active
+            - ErrSwIssuedCmdInAppActive: covers that SW writes all possible commands to the KMAC
+                                         while App interface is active
+            - ErrWaitTimerExpired: covers that the KMAC timed out while waiting for EDN entropy
+            - ErrIncorrectEntropyMode: covers that incorrect entropy modes are detected by the KMAC
+            - ErrUnexpectedModeStrength: covers that 128-bit strength is seen for SHA3, and all but
+                                         128/256 bit strengths are seen for XOF functions
+            - ErrIncorrectFunctionName: covers that the function name is configured incorrectly
+                                        when KMAC mode is enabled
+            - ErrSwCmdSequence: covers that SW issues commands to the KMAC out of order
             '''
     }
   ]
diff --git a/hw/ip/kmac/dv/env/kmac_env_cov.sv b/hw/ip/kmac/dv/env/kmac_env_cov.sv
index b0bcd29..baeee74 100644
--- a/hw/ip/kmac/dv/env/kmac_env_cov.sv
+++ b/hw/ip/kmac/dv/env/kmac_env_cov.sv
@@ -302,25 +302,69 @@
   endgroup
 
   covergroup error_cg with function sample(kmac_pkg::err_code_e kmac_err,
-                                           sha3_pkg::err_code_e sha3_err);
-    // placeholder comment
+                                           kmac_pkg::kmac_cmd_e kcmd,
+                                           sha3_pkg::sha3_mode_e kmode,
+                                           sha3_pkg::keccak_strength_e kstrength);
     kmac_err_code: coverpoint kmac_err {
-      bins err_none = {kmac_pkg::ErrNone};
-      bins err_key_not_valid = {kmac_pkg::ErrKeyNotValid};
-      bins err_sw_pushed_msg_fifo = {kmac_pkg::ErrSwPushedMsgFifo};
-      bins err_sw_issued_cmd_in_app_active = {kmac_pkg::ErrSwIssuedCmdInAppActive};
-      bins err_wait_timer_expired = {kmac_pkg::ErrWaitTimerExpired};
-      bins err_incorrect_entropy_mode = {kmac_pkg::ErrIncorrectEntropyMode};
-
-      bins invalid = default;
+      ignore_bins ignore = {kmac_pkg::ErrNone};
     }
 
-    sha3_err_code: coverpoint sha3_err {
-      bins err_none            = {sha3_pkg::ErrNone};
-      bins err_sha3_sw_control = {sha3_pkg::ErrSha3SwControl};
-
-      bins invalid = default;
+    cmd: coverpoint kcmd {
+      ignore_bins ignore = {kmac_pkg::CmdNone};
     }
+
+    mode: coverpoint kmode;
+
+    strength: coverpoint kstrength;
+
+    all_invalid_cmd_in_app_active: cross kmac_err_code, cmd {
+      bins invalid_cmds = binsof(kmac_err_code) intersect {kmac_pkg::ErrSwIssuedCmdInAppActive} &&
+                          binsof(cmd);
+
+      ignore_bins ignore = !binsof(kmac_err_code) intersect {kmac_pkg::ErrSwIssuedCmdInAppActive};
+    }
+
+    all_invalid_mode_strength_cfgs: cross kmac_err_code, mode, strength {
+      bins sha3_128_cfgs = binsof(kmac_err_code) intersect {kmac_pkg::ErrUnexpectedModeStrength} &&
+                           binsof(mode) intersect {sha3_pkg::Sha3} &&
+                           binsof(strength) intersect {sha3_pkg::L128};
+
+      bins shake_224_invalid_cfg =
+          binsof(kmac_err_code) intersect {kmac_pkg::ErrUnexpectedModeStrength} &&
+          binsof(mode) intersect {sha3_pkg::Shake} &&
+          binsof(strength) intersect {sha3_pkg::L224};
+
+      bins shake_384_invalid_cfg =
+          binsof(kmac_err_code) intersect {kmac_pkg::ErrUnexpectedModeStrength} &&
+          binsof(mode) intersect {sha3_pkg::Shake} &&
+          binsof(strength) intersect {sha3_pkg::L384};
+
+      bins shake_512_invalid_cfg =
+          binsof(kmac_err_code) intersect {kmac_pkg::ErrUnexpectedModeStrength} &&
+          binsof(mode) intersect {sha3_pkg::Shake} &&
+          binsof(strength) intersect {sha3_pkg::L512};
+
+      bins cshake_224_invalid_cfg =
+          binsof(kmac_err_code) intersect {kmac_pkg::ErrUnexpectedModeStrength} &&
+          binsof(mode) intersect {sha3_pkg::CShake} &&
+          binsof(strength) intersect {sha3_pkg::L224};
+
+      bins cshake_384_invalid_cfg =
+          binsof(kmac_err_code) intersect {kmac_pkg::ErrUnexpectedModeStrength} &&
+          binsof(mode) intersect {sha3_pkg::CShake} &&
+          binsof(strength) intersect {sha3_pkg::L384};
+
+      bins cshake_512_invalid_cfg =
+          binsof(kmac_err_code) intersect {kmac_pkg::ErrUnexpectedModeStrength} &&
+          binsof(mode) intersect {sha3_pkg::CShake} &&
+          binsof(strength) intersect {sha3_pkg::L512};
+
+      ignore_bins ignore = !binsof(kmac_err_code) intersect {kmac_pkg::ErrUnexpectedModeStrength} ||
+                           ((binsof(mode) intersect {sha3_pkg::Sha3} &&
+                             !binsof(strength) intersect {sha3_pkg::L128}) ||
+                            (binsof(mode) intersect {sha3_pkg::Shake, sha3_pkg::CShake} &&
+                             binsof(strength) intersect {sha3_pkg::L128, sha3_pkg::L256}));
+   }
   endgroup
 
   function sample_cfg(bit kmac,
@@ -359,7 +403,7 @@
     state_read_mask_cg = new();
     cmd_process_cg = new();
     sideload_cg = new();
-    error_cg = new(); // TODO sample this in scb
+    error_cg = new();
     do begin
       app_cg_wrappers[app_name] = new({app_name.name(), "_cg"});
       app_name = app_name.next;
diff --git a/hw/ip/kmac/dv/env/kmac_scoreboard.sv b/hw/ip/kmac/dv/env/kmac_scoreboard.sv
index 919e915..b272647 100644
--- a/hw/ip/kmac/dv/env/kmac_scoreboard.sv
+++ b/hw/ip/kmac/dv/env/kmac_scoreboard.sv
@@ -2406,6 +2406,11 @@
       void'(ral.err_code.predict(.value(TL_DW'(kmac_err)), .kind(UVM_PREDICT_DIRECT)));
     end
 
+    // collect coverage
+    if (cfg.en_cov) begin
+      cov.error_cg.sample(kmac_err.code, unchecked_kmac_cmd, hash_mode, strength);
+    end
+
     kmac_err = '{valid: 1'b0,
                  code: kmac_pkg::ErrNone,
                  info: '0};