[aes/dv] added reseeding to test
Signed-off-by: Rasmus Madsen <rasmus.madsen@wdc.com>
diff --git a/hw/ip/aes/dv/env/aes_env_cfg.sv b/hw/ip/aes/dv/env/aes_env_cfg.sv
index 0a779ee..20a5140 100644
--- a/hw/ip/aes/dv/env/aes_env_cfg.sv
+++ b/hw/ip/aes/dv/env/aes_env_cfg.sv
@@ -42,6 +42,11 @@
int key_192b_weight = 10;
int key_256b_weight = 10;
+ // reseed weigth
+ int per8_weight = 60;
+ int per64_weight = 30;
+ int per8k_weight = 10;
+
// use manual operation mode percentage
int manual_operation_pct = 10;
// enable reseed on key touch
@@ -70,7 +75,7 @@
// [1]: mode error
// [0]: key_len
- cfg_error_type_t config_error_type = 2'b00;
+ cfg_error_type_t config_error_type = 3'b000;
int config_error_pct = 30;
// min and max wait (clk) before an error injection
@@ -162,10 +167,7 @@
m_tl_agent_cfg.d_ready_delay_max = 0;
zero_delays = 1;
end
- endcase // case (host_resp_speed)
-
-
- if (config_error_type[0] == 1'b1) num_corrupt_messages += 1;
+ endcase
endfunction
diff --git a/hw/ip/aes/dv/env/aes_env_pkg.sv b/hw/ip/aes/dv/env/aes_env_pkg.sv
index 81abd04..d4b6c96 100644
--- a/hw/ip/aes/dv/env/aes_env_pkg.sv
+++ b/hw/ip/aes/dv/env/aes_env_pkg.sv
@@ -47,6 +47,7 @@
typedef struct packed {
bit key_len;
bit mode;
+ bit rsd_rate;
} cfg_error_type_t;
diff --git a/hw/ip/aes/dv/env/aes_message_item.sv b/hw/ip/aes/dv/env/aes_message_item.sv
index ecfa0e2..69ecb92 100644
--- a/hw/ip/aes/dv/env/aes_message_item.sv
+++ b/hw/ip/aes/dv/env/aes_message_item.sv
@@ -66,6 +66,11 @@
int key_192b_weight = 10;
int key_256b_weight = 10;
+ // reseed weight
+ int per8_weight = 60;
+ int per64_weight = 30;
+ int per8k_weight = 10;
+
// set if this message should not be
// validated
// due to a premature trigger
@@ -94,6 +99,8 @@
rand cfg_error_type_t cfg_error_type;
// run AES in manual mode
rand bit manual_operation;
+ // reseed rate
+ rand bit [2:0] reseed_rate;
///////////////////////////////////////
@@ -130,6 +137,20 @@
};
}
+ constraint rsd_rate_c {
+ solve has_config_error before reseed_rate;
+ solve cfg_error_type before reseed_rate;
+ if (!(has_config_error && cfg_error_type.rsd_rate) ) {
+ reseed_rate inside { 3'b001, 3'b010, 3'b100 };
+ reseed_rate dist { 3'b001 :/ per8_weight,
+ 3'b010 :/ per64_weight,
+ 3'b100 :/ per8k_weight };
+ } else {
+ !( reseed_rate inside { 3'b001, 3'b010, 3'b100 });
+ }
+ }
+
+
constraint key_c {
if (fixed_key_en) {
aes_key[0] == fixed_key[0],
@@ -179,9 +200,9 @@
solve has_config_error before cfg_error_type;
solve sideload_en before cfg_error_type;
if (has_config_error & !sideload_en) {
- cfg_error_type inside {[1:3]};
+ cfg_error_type inside {[1:7]};
} else {
- cfg_error_type == 2'b00;
+ cfg_error_type == 3'b000;
}
}
@@ -335,5 +356,6 @@
fixed_iv_en = rhs_.fixed_iv_en;
skip_msg = rhs_.skip_msg;
sideload_en = rhs_.sideload_en;
+ reseed_rate = rhs_.reseed_rate;
endfunction // copy
endclass
diff --git a/hw/ip/aes/dv/env/aes_seq_item.sv b/hw/ip/aes/dv/env/aes_seq_item.sv
index 4519bc3..196f670 100644
--- a/hw/ip/aes/dv/env/aes_seq_item.sv
+++ b/hw/ip/aes/dv/env/aes_seq_item.sv
@@ -33,6 +33,7 @@
// indicate if the initialization vector is valid
bit [3:0] iv_vld;
aes_mode_e mode;
+ bit [2:0] reseed_rate;
bit en_b2b_transactions = 1;
int b2b_pct = 80;
@@ -302,6 +303,7 @@
split_item = rhs_.split_item;
data_was_cleared = rhs_.data_was_cleared;
sideload_en = rhs_.sideload_en;
+ reseed_rate = rhs_.reseed_rate;
endfunction // copy
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 2d5b953..32cee04 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
@@ -206,6 +206,7 @@
ral.ctrl_shadowed.key_len.set(item.key_len);
ral.ctrl_shadowed.sideload.set(item.sideload_en);
ral.ctrl_shadowed.manual_operation.set(item.manual_op);
+ ral.ctrl_shadowed.prng_reseed_rate.set(item.reseed_rate);
csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
end
endtask
@@ -787,6 +788,7 @@
aes_item.manual_op = message_item.manual_operation;
aes_item.key_mask = message_item.keymask;
aes_item.sideload_en = message_item.sideload_en;
+ aes_item.reseed_rate = message_item.reseed_rate;
aes_item.clear_reg_pct = cfg.clear_reg_pct;
aes_item.clear_reg_w_rand = cfg.clear_reg_w_rand;
endfunction // aes_item_init
@@ -831,6 +833,9 @@
aes_message.fixed_keylen = cfg.fixed_keylen;
aes_message.fixed_iv_en = cfg.fixed_iv_en;
aes_message.sideload_pct = cfg.sideload_pct;
+ aes_message.per8_weight = cfg.per8_weight;
+ aes_message.per64_weight = cfg.per64_weight;
+ aes_message.per8k_weight = cfg.per8k_weight;
endfunction
@@ -838,7 +843,7 @@
aes_message_item cloned_message;
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;
+ if (aes_message.cfg_error_type[1] == 1'b1) cfg.num_corrupt_messages += 1;
`downcast(cloned_message, aes_message.clone());
message_queue.push_front(cloned_message);
`uvm_info(`gfn, $sformatf("\n\t ----| MESSAGE # %d \n %s",i, cloned_message.convert2string())