[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};