[aes/dv] Implemented clering functionality from trigger reg
Signed-off-by: Rasmus Madsen <rasmus.madsen@wdc.com>
diff --git a/hw/ip/aes/dv/aes_sim_cfg.hjson b/hw/ip/aes/dv/aes_sim_cfg.hjson
index fac7eca..ffd194d 100644
--- a/hw/ip/aes/dv/aes_sim_cfg.hjson
+++ b/hw/ip/aes/dv/aes_sim_cfg.hjson
@@ -78,6 +78,11 @@
uvm_test: aes_b2b_test
uvm_test_seq: aes_stress_vseq
}
+ {
+ name: aes_clear
+ uvm_test: aes_clear_test
+ uvm_test_seq: aes_clear_vseq
+ }
]
// List of regressions.
diff --git a/hw/ip/aes/dv/env/aes_env.core b/hw/ip/aes/dv/env/aes_env.core
index 636bf8b..0335ccc 100644
--- a/hw/ip/aes/dv/env/aes_env.core
+++ b/hw/ip/aes/dv/env/aes_env.core
@@ -28,6 +28,7 @@
- seq_lib/aes_common_vseq.sv: {is_include_file: true}
- seq_lib/aes_wake_up_vseq.sv: {is_include_file: true}
- seq_lib/aes_stress_vseq.sv: {is_include_file: true}
+ - seq_lib/aes_clear_vseq.sv: {is_include_file: true}
file_type: systemVerilogSource
generate:
diff --git a/hw/ip/aes/dv/env/aes_env_cfg.sv b/hw/ip/aes/dv/env/aes_env_cfg.sv
index a40942a..73d3cc0 100644
--- a/hw/ip/aes/dv/env/aes_env_cfg.sv
+++ b/hw/ip/aes/dv/env/aes_env_cfg.sv
@@ -76,6 +76,12 @@
int mal_error_pct = 5;
int random_reset_pct = 10;
+ // clear register percentage
+ // percentage of items that will try to clear
+ // one or more registers
+ int clear_reg_pct = 0;
+
+
// rand variables
// 0: C model 1: OPEN_SSL/BORING_SSL
@@ -90,9 +96,9 @@
// constraints
- constraint c_num_messages { num_messages inside {[num_messages_min : num_messages_max] };}
- constraint c_ref_model { ref_model dist { 0 :/ use_c_model_pct,
- 1 :/ (100 - use_c_model_pct) }; }
+ constraint c_num_messages {num_messages inside {[num_messages_min : num_messages_max]};}
+ constraint c_ref_model {ref_model dist { 0 :/ use_c_model_pct,
+ 1 :/ (100 - use_c_model_pct)};}
function void post_randomize();
@@ -125,19 +131,19 @@
string str = "";
str = super.convert2string();
str = {str, $sformatf("\n\t ----| AES ENVIRONMENT CONFIG \t ") };
- str = {str, $sformatf("\n\t ----| Max Number of message %d \t ", num_messages_max) };
- str = {str, $sformatf("\n\t ----| Min Number of message %d \t ", num_messages_min) };
- str = {str, $sformatf("\n\t ----| Max message len %d bytes \t ", message_len_max) };
- str = {str, $sformatf("\n\t ----| Min message len %d bytes \t ", message_len_min) };
- str = {str, $sformatf("\n\t ----| Host response speed %s \t ", host_resp_speed.name()) };
+ str = {str, $sformatf("\n\t ----| Max Number of message %d \t ", num_messages_max)};
+ str = {str, $sformatf("\n\t ----| Min Number of message %d \t ", num_messages_min)};
+ str = {str, $sformatf("\n\t ----| Max message len %d bytes \t ", message_len_max)};
+ str = {str, $sformatf("\n\t ----| Min message len %d bytes \t ", message_len_min)};
+ str = {str, $sformatf("\n\t ----| Host response speed %s \t ", host_resp_speed.name())};
str = {str, $sformatf("\n\t ----| Reference model:\t %s \t ",
- (ref_model==0) ? "C-MODEL" : "OPEN_SSL" ) };
- str = {str, $sformatf("\n\t ----| num_messages # %d \t ", num_messages) };
- str = {str, $sformatf("\n\t ----| ECB Weight: %d \t ", ecb_weight) };
- str = {str, $sformatf("\n\t ----| CBC Weight: %d \t ", cbc_weight) };
- str = {str, $sformatf("\n\t ----| CFB Weight: %d \t ", cfb_weight) };
- str = {str, $sformatf("\n\t ----| OFB Weight: %d \t ", ofb_weight) };
- str = {str, $sformatf("\n\t ----| CTR Weight: %d \t ", ctr_weight) };
+ (ref_model==0) ? "C-MODEL" : "OPEN_SSL" )};
+ str = {str, $sformatf("\n\t ----| num_messages # %d \t ", num_messages)};
+ str = {str, $sformatf("\n\t ----| ECB Weight: %d \t ", ecb_weight)};
+ str = {str, $sformatf("\n\t ----| CBC Weight: %d \t ", cbc_weight)};
+ str = {str, $sformatf("\n\t ----| CFB Weight: %d \t ", cfb_weight)};
+ str = {str, $sformatf("\n\t ----| OFB Weight: %d \t ", ofb_weight)};
+ str = {str, $sformatf("\n\t ----| CTR Weight: %d \t ", ctr_weight)};
str = {str, $sformatf("\n\t ----| key mask: %b \t ", key_mask)};
str = {str, "\n"};
return str;
diff --git a/hw/ip/aes/dv/env/aes_env_pkg.sv b/hw/ip/aes/dv/env/aes_env_pkg.sv
index 2e58130..4c1c959 100644
--- a/hw/ip/aes/dv/env/aes_env_pkg.sv
+++ b/hw/ip/aes/dv/env/aes_env_pkg.sv
@@ -27,7 +27,13 @@
typedef enum int { AES_CFG=0, AES_DATA=1, AES_ERR_INJ=2 } aes_item_type_e;
- // functions
+ typedef struct packed {
+ bit data_out;
+ bit data_in;
+ bit iv;
+ bit key;
+ } clear_t;
+
// package sources
`include "aes_env_cfg.sv"
diff --git a/hw/ip/aes/dv/env/aes_message_item.sv b/hw/ip/aes/dv/env/aes_message_item.sv
index 1c547cc..0cf64aa 100644
--- a/hw/ip/aes/dv/env/aes_message_item.sv
+++ b/hw/ip/aes/dv/env/aes_message_item.sv
@@ -5,7 +5,6 @@
class aes_message_item extends uvm_sequence_item;
`uvm_object_utils(aes_message_item)
-
`uvm_object_new
///////////////////////////////////////
@@ -40,6 +39,10 @@
// fixed IV
bit fixed_iv_en = 0;
+ // clear register percentage
+ // percentage of items that will try to clear
+ // one or more registers
+ int clear_reg_pct = 0;
// predefined values for fixed mode
@@ -143,12 +146,12 @@
constraint c_mode {
solve has_config_error before aes_mode;
solve cfg_error_type before aes_mode;
- if (!(has_config_error && cfg_error_type[0]) ) {
+ if (!(has_config_error && cfg_error_type[0])) {
aes_mode dist { AES_ECB := ecb_weight,
AES_CBC := cbc_weight,
AES_CFB := cfb_weight,
AES_OFB := ofb_weight,
- AES_CTR := ctr_weight };
+ AES_CTR := ctr_weight};
} else {
// the mode will be randomized to a random
// non legal value later.
@@ -160,35 +163,39 @@
if (error_types[0])
{
has_config_error dist { 0 :/ (100 - config_error_pct),
- 1 :/ config_error_pct };
+ 1 :/ config_error_pct};
}
- else { has_config_error == 0; }
+ else { has_config_error == 0;}
}
constraint c_config_error_type {
solve has_config_error before cfg_error_type;
if (has_config_error) {
- cfg_error_type inside { [1:3] };
+ cfg_error_type inside {[1:3]};
} else {
- cfg_error_type ==2'b00;
+ cfg_error_type == 2'b00;
}
}
constraint c_manual_operation {
manual_operation dist { 0:/ (100 - manual_operation_pct),
- 1:/ manual_operation_pct };
+ 1:/ manual_operation_pct};
};
function void add_data_item(aes_seq_item item);
- for(int i=0; i < 4 ; i++ ) begin
+ for (int i=0; i < 4 ; i++) begin
// data_in.push_front (data_in[3:0])
input_msg = { input_msg , item.data_in[i][7:0], item.data_in[i][15:8], item.data_in[i][23:16]
,item.data_in[i][31:24]};
// data_in.push_front (data_in[3:0])
output_msg = { output_msg, item.data_out[i][7:0], item.data_out[i][15:8],
item.data_out[i][23:16],item.data_out[i][31:24] };
+ `uvm_info(`gfn, $sformatf("\n\t ---| adding to 0x%0h to data, length is now: %0d",
+ {item.data_in[i][7:0], item.data_in[i][15:8],item.data_in[i][23:16], item.data_in[i][31:24]},
+ input_msg.size()), UVM_LOW)
end
+
endfunction // add_data_item
@@ -199,13 +206,13 @@
this.aes_iv = item.iv;
// check for valid keylen
- if ( item.key_len inside { 3'b001, 3'b010, 3'b100 } ) begin
+ if (item.key_len inside { 3'b001, 3'b010, 3'b100 }) begin
this.aes_keylen = item.key_len;
end else begin
this.aes_keylen = 3'b100; // force to 256b
- `uvm_info(`gfn, $sformatf("\n\t ---| Illegal key len detected reverting to default 256"), UVM_MEDIUM)
+ `uvm_info(`gfn, $sformatf("\n\t ---| Illegal key len detected reverting to default 256"),
+ UVM_MEDIUM)
end
-
add_data_item(item);
endfunction // add_start_msg_item
@@ -221,50 +228,61 @@
str = super.convert2string();
str = {str, $sformatf("\n\t ----| \t\t AES MESSAGE ITEM \t |----\t ")
};
- str = {str, "\n\t ----| " };
+ str = {str, "\n\t ----| "};
str = {str, $sformatf("\n\t ----| Mode: \t \t \t %s \t ",
- aes_mode.name() ) };
+ aes_mode.name())};
str = {str, $sformatf("\n\t ----| Operation: \t \t %s \t ",
- aes_operation.name() ) };
+ aes_operation.name())};
str = {str, $sformatf("\n\t ----| has Configuration error: %s \t \t \t ",
- (has_config_error==1) ? "TRUE" : "FALSE" ) };
+ (has_config_error==1) ? "TRUE" : "FALSE")};
str = {str, $sformatf("\n\t ----| Mode error en: \t %d \n\t ----| Key_len error en: \t %d \t \t ",
- cfg_error_type[0], cfg_error_type[1]) };
+ cfg_error_type[0], cfg_error_type[1])};
str = {str, $sformatf("\n\t ----| Message Length: \t \t %d \t ",
- message_length ) };
+ message_length)};
str = {str, $sformatf("\n\t ----| Key Length: \t \t %03b \t ",
- aes_keylen) };
- str = {str, $sformatf("\n\t ----| Key Share 0: \t \t ") };
- for(int i=0; i <8; i++) begin
+ aes_keylen)};
+ str = {str, $sformatf("\n\t ----| Key Share 0: \t \t ")};
+ for (int i=0; i <8; i++) begin
str = {str, $sformatf("%h ",aes_key[0][i])};
end
- str = {str, $sformatf("\n\t ----| Key Share 1: \t \t ") };
- for(int i=0; i <8; i++) begin
+ str = {str, $sformatf("\n\t ----| Key Share 1: \t \t ")};
+ for (int i=0; i <8; i++) begin
str = {str, $sformatf("%h ",aes_key[1][i])};
end
str = {str, $sformatf("\n\t ----| Key Mask: \t \t %0b |----\t ",
- keymask) };
- str = {str, $sformatf("\n\t ----| Initializaion vector: \t \t ") };
- for(int i=0; i <4; i++) begin
+ keymask)};
+ str = {str, $sformatf("\n\t ----| Initializaion vector: \t \t ")};
+ for (int i=0; i <4; i++) begin
str = {str, $sformatf("%h ",aes_iv[i])};
end
- str = {str, $sformatf("\n\t ----| Manual Mode : %b \t \t ", manual_operation) };
- str = {str, $sformatf("\n\t ----| errors types enabled: %b \t \t ", error_types) };
- str = {str, $sformatf("\n\t ----| CFB Weight: %d \t \t ", cfb_weight) };
- str = {str, $sformatf("\n\t ----| OFB Weight: %d \t \t ", ofb_weight) };
- str = {str, $sformatf("\n\t ----| ECB Weight: %d \t \t ", ecb_weight) };
- str = {str, $sformatf("\n\t ----| CBC Weight: %d \t \t ", cbc_weight) };
- str = {str, $sformatf("\n\t ----| CTR Weight: %d \t \t ", ctr_weight) };
+ str = {str, $sformatf("\n\t ----| Manual Mode : %b \t \t ", manual_operation)};
+ str = {str, $sformatf("\n\t ----| errors types enabled: %b \t \t ", error_types)};
+ str = {str, $sformatf("\n\t ----| CFB Weight: %d \t \t ", cfb_weight)};
+ str = {str, $sformatf("\n\t ----| OFB Weight: %d \t \t ", ofb_weight)};
+ str = {str, $sformatf("\n\t ----| ECB Weight: %d \t \t ", ecb_weight)};
+ str = {str, $sformatf("\n\t ----| CBC Weight: %d \t \t ", cbc_weight)};
+ str = {str, $sformatf("\n\t ----| CTR Weight: %d \t \t ", ctr_weight)};
str = {str, $sformatf("\n\t ----| Key Len Distribution: \t \t " ) };
- str = {str, $sformatf("\n\t ----| 128 Weight: %d \t \t ", key_128b_weight) };
- str = {str, $sformatf("\n\t ----| 192 Weight: %d \t \t ", key_192b_weight) };
- str = {str, $sformatf("\n\t ----| 256 Weight: %d \t \t ", key_256b_weight) };
- str = {str, $sformatf("\n\t") };
+ str = {str, $sformatf("\n\t ----| 128 Weight: %d \t \t ", key_128b_weight)};
+ str = {str, $sformatf("\n\t ----| 192 Weight: %d \t \t ", key_192b_weight)};
+ str = {str, $sformatf("\n\t ----| 256 Weight: %d \t \t ", key_256b_weight)};
+ str = {str, $sformatf("\n\t")};
return str;
endfunction // conver2string
+ virtual function string print_data();
+ string txt="";
+
+ txt = $sformatf("\n\t ----| Printing message data \n\t ----| data length: %d", input_msg.size());
+ foreach (input_msg[i]) begin
+ txt = {txt, $sformatf("\n\t ----| [%0d] 0x%0h \t 0x%0h",i, input_msg[i], output_msg[i])};
+ end
+ return txt;
+ endfunction // get_data_length
+
+
virtual function void do_copy(uvm_object rhs);
aes_message_item rhs_;
diff --git a/hw/ip/aes/dv/env/aes_scoreboard.sv b/hw/ip/aes/dv/env/aes_scoreboard.sv
index 3efd7fd..d8f7f5f 100644
--- a/hw/ip/aes/dv/env/aes_scoreboard.sv
+++ b/hw/ip/aes/dv/env/aes_scoreboard.sv
@@ -12,7 +12,6 @@
);
`uvm_component_utils(aes_scoreboard)
-
`uvm_component_new
// local variables
@@ -20,7 +19,7 @@
aes_seq_item output_item; // item containing resulting output
aes_seq_item complete_item; // merge of input and output items
- bit aes_from_rst = 1; // 1: nothing has happened since rst was released
+ bit new_config = 1; // 1: from reset or a new config was entered
bit ok_to_fwd = 0; // 0: item is not ready to forward
bit finish_message = 0; // set when test is trying to end
// - to indicate the last message is finished
@@ -103,6 +102,7 @@
default: input_item.mode = AES_NONE;
endcase // case item.a_data[4:1]
input_item.clean();
+ new_config = 1;
end
@@ -148,36 +148,28 @@
(!uvm_re_match("trigger", csr_name)): begin
//start triggered
- if (item.a_data[0]) begin
+ if (get_field_val(ral.trigger.start, item.a_data)) begin
ok_to_fwd = 1;
- aes_from_rst = 0;
end
// clear key
- if (item.a_data[1]) begin
- if (cfg.clear_reg_w_rand) begin
- input_item.key = '{default: {8{$urandom()}}};
- end else begin
- input_item.key = '{default: '0};
- end
+ if (get_field_val(ral.trigger.key_clear, item.a_data)) begin
+ void'(input_item.key_clean(0,1));
+ new_config = 1;
+ `uvm_info(`gfn, $sformatf("\n\t ----clearing KEY"), UVM_MEDIUM)
end
// clear IV
- if (item.a_data[2]) begin
- if (cfg.clear_reg_w_rand) begin
- input_item.iv = {4{$urandom()}};
- end else begin
- input_item.iv = '0;
- end
+ if (get_field_val(ral.trigger.iv_clear, item.a_data)) begin
+ void'(input_item.iv_clean(0,1));
+ new_config = 1;
+ `uvm_info(`gfn, $sformatf("\n\t ----| clearing IV"), UVM_MEDIUM)
end
// clear data_in
- if (item.a_data[3]) begin
- if (cfg.clear_reg_w_rand) begin
- input_item.data_in = {4{$urandom()}};
- end else begin
- input_item.data_in = '0;
- end
+ if (get_field_val(ral.trigger.data_in_clear, item.a_data)) begin
+ input_item.clean_data_in();
+ `uvm_info(`gfn, $sformatf("\n\t ----| clearing DATA_IN"), UVM_MEDIUM)
end
// clear data out
- if (item.a_data[4]) begin
+ if (get_field_val(ral.trigger.data_out_clear, item.a_data)) begin
if (cfg.clear_reg_w_rand) begin
input_item.data_out = {4{$urandom()}};
end else begin
@@ -208,20 +200,20 @@
if (input_item.valid && !input_item.manual_op) begin
case (input_item.mode)
AES_ECB: begin
- `uvm_info(`gfn, $sformatf("\n\t ----| ECB mode"), UVM_MEDIUM)
- if (aes_from_rst) begin
+ `uvm_info(`gfn, $sformatf("\n\t ----| ECB mode"), UVM_FULL)
+ if (new_config) begin
// verify that all 4 data_in and all 8 key have been updated
- if (input_item.data_in_valid() && input_item.key_clean(0)) begin
+ if (input_item.data_in_valid() && input_item.key_clean(0,0)) begin
//clone and add to ref and rec data fifo
ok_to_fwd = 1;
- aes_from_rst = 0;
+ new_config = 0;
end
end else begin
// verify that all 4 data_in and all 8 key are clean
`uvm_info(`gfn, $sformatf("\n\t ----|data_inv_vld? %b, key clean ? %b",
- input_item.data_in_valid(), input_item.key_clean(1) ), UVM_MEDIUM)
+ input_item.data_in_valid(), input_item.key_clean(1,0)), UVM_MEDIUM)
- if (input_item.data_in_valid() && input_item.key_clean(1)) begin
+ if (input_item.data_in_valid() && input_item.key_clean(1,0)) begin
//clone and add to ref and rec data fifo
ok_to_fwd = 1;
end
@@ -229,20 +221,20 @@
end
AES_CBC: begin
- `uvm_info(`gfn, $sformatf("\n\t ----| CBC mode"), UVM_MEDIUM)
- if (aes_from_rst) begin
+ `uvm_info(`gfn, $sformatf("\n\t ----| CBC mode"), UVM_FULL)
+ if (new_config) begin
// verify that all 4 data_in and all 8 key and all 4 IV have been updated
- if (input_item.data_in_valid() && input_item.key_clean(0) && input_item.iv_clean(0)) begin
+ if (input_item.data_in_valid() && input_item.key_clean(0,0) && input_item.iv_clean(0,0)) begin
//clone and add to ref and rec data fifo
ok_to_fwd = 1;
- aes_from_rst = 0;
+ new_config = 0;
end
end else begin
// verify that all 4 data_in and all 8 key and all 4 IV are clean
`uvm_info(`gfn, $sformatf("\n\t ----|data_inv_vld? %b, key clean ? %b",
- input_item.data_in_valid(), input_item.key_clean(1) ), UVM_MEDIUM)
+ input_item.data_in_valid(), input_item.key_clean(1,0)), UVM_MEDIUM)
- if (input_item.data_in_valid() && input_item.key_clean(1) && input_item.iv_clean(1)) begin
+ if (input_item.data_in_valid() && input_item.key_clean(1,0) && input_item.iv_clean(1,0)) begin
//clone and add to ref and rec data fifo
ok_to_fwd = 1;
end
@@ -250,19 +242,19 @@
end
AES_CFB: begin
- if (aes_from_rst) begin
+ if (new_config) begin
// verify that all 4 data_in and all 8 key and all 4 IV have been updated
- if (input_item.data_in_valid() && input_item.key_clean(0) && input_item.iv_clean(0)) begin
+ if (input_item.data_in_valid() && input_item.key_clean(0,0) && input_item.iv_clean(0,0)) begin
//clone and add to ref and rec data fifo
ok_to_fwd = 1;
- aes_from_rst = 0;
+ new_config = 0;
end
end else begin
// verify that all 4 data_in and all 8 key and all 4 IV are clean
`uvm_info(`gfn, $sformatf("\n\t ----|data_inv_vld? %b, key clean ? %b",
- input_item.data_in_valid(), input_item.key_clean(1) ), UVM_HIGH)
+ input_item.data_in_valid(), input_item.key_clean(1,0)), UVM_HIGH)
- if (input_item.data_in_valid() && input_item.key_clean(1) && input_item.iv_clean(1)) begin
+ if (input_item.data_in_valid() && input_item.key_clean(1,0) && input_item.iv_clean(1,0)) begin
//clone and add to ref and rec data fifo
ok_to_fwd = 1;
end
@@ -270,19 +262,19 @@
end
AES_OFB: begin
- if (aes_from_rst) begin
+ if (new_config) begin
// verify that all 4 data_in and all 8 key and all 4 IV have been updated
- if (input_item.data_in_valid() && input_item.key_clean(0) && input_item.iv_clean(0)) begin
+ if (input_item.data_in_valid() && input_item.key_clean(0,0) && input_item.iv_clean(0,0)) begin
//clone and add to ref and rec data fifo
ok_to_fwd = 1;
- aes_from_rst = 0;
+ new_config = 0;
end
end else begin
// verify that all 4 data_in and all 8 key and all 4 IV are clean
`uvm_info(`gfn, $sformatf("\n\t ----|data_inv_vld? %b, key clean ? %b",
- input_item.data_in_valid(), input_item.key_clean(1) ), UVM_HIGH)
+ input_item.data_in_valid(), input_item.key_clean(1,0)), UVM_HIGH)
- if (input_item.data_in_valid() && input_item.key_clean(1) && input_item.iv_clean(1)) begin
+ if (input_item.data_in_valid() && input_item.key_clean(1,0) && input_item.iv_clean(1,0)) begin
//clone and add to ref and rec data fifo
ok_to_fwd = 1;
end
@@ -290,19 +282,19 @@
end
AES_CTR: begin
- `uvm_info(`gfn, $sformatf("\n\t ----| CTR mode"), UVM_MEDIUM)
- if (aes_from_rst) begin
+ `uvm_info(`gfn, $sformatf("\n\t ----| CTR mode"), UVM_FULL)
+ if (new_config) begin
// verify that all 4 data_in and all 8 key and all 4 IV have been updated
- if (input_item.data_in_valid() && input_item.key_clean(0) && input_item.iv_clean(0)) begin
+ if (input_item.data_in_valid() && input_item.key_clean(0,0) && input_item.iv_clean(0,0)) begin
//clone and add to ref and rec data fifo
ok_to_fwd = 1;
- aes_from_rst = 0;
+ new_config = 0;
end
end else begin
// verify that all 4 data_in and all 8 and all 4 IV key are clean
- `uvm_info(`gfn, $sformatf("\n\t ----|data_inv_vld? %b, key clean ? %b",input_item.data_in_valid(), input_item.key_clean(1) ),
+ `uvm_info(`gfn, $sformatf("\n\t ----|data_inv_vld? %b, key clean ? %b",input_item.data_in_valid(), input_item.key_clean(1,0)),
UVM_MEDIUM)
- if (input_item.data_in_valid() && input_item.key_clean(1) && input_item.iv_clean(1)) begin
+ if (input_item.data_in_valid() && input_item.key_clean(1,0) && input_item.iv_clean(1,0)) begin
//clone and add to ref and rec data fifo
ok_to_fwd = 1;
end
@@ -340,7 +332,7 @@
end
void'(csr.predict(.value(item.d_data), .kind(UVM_PREDICT_READ)));
`uvm_info(`gfn, $sformatf("\n\t ----| SAW READ - %s data %02h",csr.get_name(), item.d_data)
- , UVM_MEDIUM)
+ , UVM_FULL)
case (csr.get_name())
"data_out_0": begin
@@ -362,21 +354,24 @@
endcase // case (csr.get_name())
if (output_item.data_out_valid()) begin
- if ( rcv_item_q.size() == 0) begin
- `uvm_fatal(`gfn, $sformatf("\n\t ----| TRIED TO READ EMPTY RECEIVE QUEUE |----"))
+ // if data_out is read multipletimes in a row we should not pop input more than once
+ if (rcv_item_q.size() == 0) begin
+// `uvm_fatal(`gfn, $sformatf("\n\t ----| TRIED TO READ EMPTY RECEIVE QUEUE |----"))
+ output_item = new();
+ end else begin
+
+ complete_item = rcv_item_q.pop_back();
+ complete_item.data_out = output_item.data_out;
+
+ `downcast(complete_clone, complete_item.clone());
+ item_fifo.put(complete_clone);
+
+ output_item = new();
+ complete_item = new();
+ `uvm_info(`gfn,
+ $sformatf("\n\t ----|added data to item_fifo (output received) fifo entries %d",
+ item_fifo.num()), UVM_MEDIUM)
end
-
- complete_item = rcv_item_q.pop_back();
- complete_item.data_out = output_item.data_out;
-
- `downcast(complete_clone, complete_item.clone());
- item_fifo.put(complete_clone);
-
- output_item = new();
- complete_item = new();
- `uvm_info(`gfn,
- $sformatf("\n\t ----|added data to item_fifo (output received) fifo entries %d",
- item_fifo.num()), UVM_MEDIUM)
end
end
endtask // process_tl_access
@@ -396,7 +391,7 @@
fork
begin
forever begin
- case(msg_state)
+ case (msg_state)
MSG_START: begin
full_item = new();
item_fifo.get(full_item);
@@ -414,7 +409,7 @@
item_fifo.get(full_item);
`uvm_info(`gfn, $sformatf("\n\t ----| got item from item fifo"), UVM_FULL)
if (full_item.message_start() ) begin
- `uvm_info(`gfn, $sformatf("\n\t ----| adding message item to mg_fifo"), UVM_FULL)
+ `uvm_info(`gfn, $sformatf("\n\t ----| adding message item to mg_fifo"), UVM_MEDIUM)
`downcast(msg_clone, message.clone());
msg_fifo.put(msg_clone);
message = new();
@@ -428,7 +423,7 @@
end
begin
- wait( finish_message )
+ wait (finish_message)
`uvm_info(`gfn, $sformatf("\n\t ----| Finish test received adding message item to mg_fifo"),
UVM_MEDIUM)
@@ -453,6 +448,8 @@
msg.aes_key[0], msg.aes_key[1]),
UVM_MEDIUM)
+ `uvm_info(`gfn, $sformatf("/n/t ----| processing message %s \n\n \t message data %s", msg.convert2string(), msg.print_data()), UVM_LOW)
+
if (msg.aes_mode != AES_NONE) begin
msg.alloc_predicted_msg();
@@ -473,9 +470,9 @@
if (msg.output_msg[n] != msg.predicted_msg[n]) begin
txt = {"\t TEST FAILED MESSAGES DID NOT MATCH \n ", txt};
- txt = {txt, $sformatf("\n\n\t ----| ACTUAL OUTPUT DID NOT MATCH PREDICTED OUTPUT |----")};
- txt = {txt, $sformatf("\n\t ----| FAILED AT BYTE #%0d \t ACTUAL: 0x%h \t PREDICTED: 0x%h, ",
- n, msg.output_msg[n], msg.predicted_msg[n] )};
+ txt = {txt, $sformatf("\n\n\t ----| ACTUAL OUTPUT DID NOT MATCH PREDICTED OUTPUT |----")};
+ txt = {txt, $sformatf("\n\t ----| FAILED AT BYTE #%0d \t ACTUAL: 0x%h \t PREDICTED: 0x%h, ",
+ n, msg.output_msg[n], msg.predicted_msg[n])};
`uvm_fatal(`gfn, $sformatf(" # %0d \n\t %s \n", message_cnt, txt))
end
end
@@ -509,9 +506,9 @@
virtual task wait_fifo_empty();
`uvm_info(`gfn, $sformatf("item fifo entries %d", item_fifo.num()), UVM_MEDIUM)
- wait (rcv_item_q.size() == 0 );
- wait (item_fifo.num() == 0 );
- wait (msg_fifo.num() == 0 );
+ wait (rcv_item_q.size() == 0);
+ wait (item_fifo.num() == 0);
+ wait (msg_fifo.num() == 0);
endtask
@@ -542,7 +539,6 @@
`uvm_fatal(`gfn, $sformatf("%s", txt) )
end
end
-
endfunction
diff --git a/hw/ip/aes/dv/env/aes_seq_item.sv b/hw/ip/aes/dv/env/aes_seq_item.sv
index 9735846..c97bf43 100644
--- a/hw/ip/aes/dv/env/aes_seq_item.sv
+++ b/hw/ip/aes/dv/env/aes_seq_item.sv
@@ -4,11 +4,9 @@
class aes_seq_item extends uvm_sequence_item;
-
`uvm_object_utils(aes_seq_item)
aes_item_type_e item_type;
-
aes_op_e operation;
///////////////////////////////////////
@@ -77,7 +75,7 @@
// [2] input data
// [1] IV
// [0] key
- rand bit [3:0] clear_reg;
+ rand clear_t clear_reg;
constraint aes_mode_c {
// force to be !onehot
@@ -90,10 +88,11 @@
constraint aes_clear_reg_c {
clear_reg dist { 0 :/ (100 - clear_reg_pct),
- 1 :/ clear_reg_pct/5,
- 2 :/ clear_reg_pct/5,
- 4 :/ clear_reg_pct/5,
- 8 :/ clear_reg_pct/5
+ 1 :/ clear_reg_pct/10,
+ 2 :/ clear_reg_pct/10,
+ 4 :/ clear_reg_pct/10,
+ 8 :/ clear_reg_pct/10,
+ ($countones(clear_reg) > 2) :/ clear_reg_pct
};
}
@@ -117,16 +116,13 @@
default: begin
end
endcase // case (key_len)
-
- if (!en_b2b_transactions) do_b2b = 0;
-
- `uvm_info(`gfn, $sformatf("\n SUPERMAN mode is %s: %b" ,mode.name(), aes_mode), UVM_LOW)
-
end
+ if (!en_b2b_transactions) do_b2b = 0;
+
// mask unused data bits
- if(data_len != 0) begin
- for(int i=data_len; i<16; i++) begin
+ if (data_len != 0) begin
+ for (int i=data_len; i<16; i++) begin
data_in[i[3:2]][i[1:0]*8+7 -:8] = 8'd0;
end
end
@@ -136,7 +132,7 @@
// have been updated.
function bit data_in_valid();
`uvm_info(`gfn, $sformatf("\n\t ----| Checking if ALL data is updated %4b", data_in_vld)
- , UVM_MEDIUM)
+ , UVM_FULL)
return &data_in_vld;
endfunction // data_in_valid
@@ -152,12 +148,23 @@
// if ret_clean = 0
// return 1 only of all registers have been written
- // if ret_celan = 1
+ // if ret_clean = 1
// return 1 if all or none of the registers have been written
- function bit key_clean(bit ret_clean);
+ // if clear is set the register will be reset
+ function bit key_clean(bit ret_clean, bit clear);
`uvm_info(`gfn, $sformatf("\n\t ----| Key status %b %b", key_vld[0], key_vld[1]), UVM_MEDIUM)
- if(ret_clean) begin
- return ( (&key_vld[0] & &key_vld[1]) || ~(|key_vld[0] | |key_vld[1]));
+ if (clear) begin
+ // if(cfg.clear_reg_w_rand) begin
+ // key = '{default: {8{$urandom()}}};
+ // end else begin
+ key = '{default: '0};
+ // end
+ key_vld[0] = '0;
+ key_vld[1] = '0;
+ end
+
+ if (ret_clean) begin
+ return ((&key_vld[0] & &key_vld[1]) || ~(|key_vld[0] | |key_vld[1]));
end else begin
return (&key_vld[0] & &key_vld[1]);
end
@@ -167,9 +174,18 @@
// return 1 only of all registers have been written
// if ret_celan = 1
// return 1 if all or none of the registers have been written
- function bit iv_clean(bit ret_clean);
- if(ret_clean) begin
- return ( (&iv_vld) || ~(|iv_vld));
+ function bit iv_clean(bit ret_clean, bit clear);
+ if (clear) begin
+ // if (cfg.clear_reg_w_rand) begin
+ // iv = {4{$urandom()}};
+ // end else begin
+ iv = '0;
+ // end
+ iv_vld = '0;
+ end
+
+ if (ret_clean) begin
+ return ((&iv_vld) || ~(|iv_vld));
end else begin
return &iv_vld;
end
@@ -210,6 +226,15 @@
endcase // case (mode)
endfunction // message_start
+ function void clean_data_in();
+// if(cfg.clear_reg_w_rand) begin
+// data_in = {4{$urandom()}};
+// end else begin
+ data_in = '0;
+// end
+ data_in_vld = '0;
+ endfunction // clean_data_in
+
function void clean();
data_in_vld = '0;
@@ -269,23 +294,23 @@
str = {str, $psprintf("\n\t ----| Operation: \t %s |----\t ",
operation.name() ) };
str = {str, $psprintf("\n\t ----| Key len: \t %s \t(%3b) |----\t ",
- (key_len==3'b001) ? "128b" : (key_len == 3'b010) ? "192b" : "256b", key_len) };
- str = {str, $psprintf("\n\t ----| Key Share 0: \t ") };
- for(int i=0; i <8; i++) begin
+ (key_len==3'b001) ? "128b" : (key_len == 3'b010) ? "192b" : "256b", key_len)};
+ str = {str, $psprintf("\n\t ----| Key Share 0: \t ")};
+ for (int i=0; i <8; i++) begin
str = {str, $psprintf("%h ",key[0][i])};
end
str = {str, $psprintf("\n\t ----| Key Share 1: \t ") };
- for(int i=0; i <8; i++) begin
+ for (int i=0; i <8; i++) begin
str = {str, $psprintf("%h ",key[1][i])};
end
- str = {str, $sformatf("\n\t ----| Initializaion vector: \t ") };
- for(int i=0; i <4; i++) begin
+ str = {str, $sformatf("\n\t ----| Initializaion vector: \t ")};
+ for (int i=0; i <4; i++) begin
str = {str, $sformatf("%h ",iv[i])};
end
- str = {str, $psprintf("\n\t ----| key_mask: \t %d |----\t \t", key_mask) };
- str = {str, $psprintf("\n\t ----| Data Length: \t %d |----\t \t", data_len) };
- str = {str, $psprintf("\n\t ----| Input data: \t %h |----\t ", data_in) };
- str = {str, $psprintf("\n\t ----| Output data: \t %h |----\t ", data_out) };
+ str = {str, $psprintf("\n\t ----| key_mask: \t %d |----\t \t", key_mask)};
+ str = {str, $psprintf("\n\t ----| Data Length: \t %d |----\t \t", data_len)};
+ str = {str, $psprintf("\n\t ----| Input data: \t %h |----\t ", data_in)};
+ str = {str, $psprintf("\n\t ----| Output data: \t %h |----\t ", data_out)};
str = {str, $psprintf("\n\t") };
return str;
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 31adf76..9f5330d 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
@@ -59,6 +59,28 @@
endtask // trigger
+ virtual task clear_regs(clear_t clr_vector);
+ string txt="";
+ bit [TL_DW:0] reg_val = '0;
+
+ txt = $sformatf("\n data_out: \t %0b", clr_vector.data_out);
+ txt = {txt, $sformatf("\n data_in: \t %0b", clr_vector.data_in)};
+ txt = {txt, $sformatf("\n data_iv: \t %0b", clr_vector.iv)};
+ txt = {txt, $sformatf("\n data_key: \t %0b", clr_vector.key)};
+ txt = {txt, $sformatf("\n vector: \t %0b", clr_vector)};
+ `uvm_info(`gfn, $sformatf("%s",txt), UVM_MEDIUM)
+ reg_val[4:1] = clr_vector;
+ csr_wr(.csr(ral.trigger), .value(reg_val));
+ endtask // clear_registers
+
+
+ virtual task prng_reseed();
+ bit [TL_DW:0] reg_val = '0;
+ reg_val[5] = 1'b1;
+ csr_wr(.csr(ral.trigger), .value(reg_val));
+ endtask // prng_reseed
+
+
virtual task set_operation(bit operation);
ral.ctrl_shadowed.operation.set(operation);
csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
@@ -116,15 +138,23 @@
virtual task add_data(ref bit [3:0] [31:0] data, bit do_b2b);
+ int write_order[4] = {0,1,2,3};
+
`uvm_info(`gfn, $sformatf("\n\t ----| ADDING DATA TO DUT %h ", data), UVM_MEDIUM)
`uvm_info(`gfn, $sformatf("\n\t ----| DATA_IN_0: %h ", data[0]), UVM_HIGH)
`uvm_info(`gfn, $sformatf("\n\t ----| DATA_IN_1: %h ", data[1]), UVM_HIGH)
`uvm_info(`gfn, $sformatf("\n\t ----| DATA_IN_2: %h ", data[2]), UVM_HIGH)
`uvm_info(`gfn, $sformatf("\n\t ----| DATA_IN_3: %h ", data[3]), UVM_HIGH)
- csr_wr(.csr(ral.data_in_0), .value(data[0][31:0]), .blocking(~do_b2b) );
- csr_wr(.csr(ral.data_in_1), .value(data[1][31:0]), .blocking(~do_b2b) );
- csr_wr(.csr(ral.data_in_2), .value(data[2][31:0]), .blocking(~do_b2b) );
- csr_wr(.csr(ral.data_in_3), .value(data[3][31:0]), .blocking(~do_b2b) );
+
+ write_order.shuffle();
+ foreach (write_order[i]) begin
+ case (write_order[i])
+ 0: csr_wr(.csr(ral.data_in_0), .value(data[0][31:0]), .blocking(~do_b2b));
+ 1: csr_wr(.csr(ral.data_in_1), .value(data[1][31:0]), .blocking(~do_b2b));
+ 2: csr_wr(.csr(ral.data_in_2), .value(data[2][31:0]), .blocking(~do_b2b));
+ 3: csr_wr(.csr(ral.data_in_3), .value(data[3][31:0]), .blocking(~do_b2b));
+ endcase
+ end
endtask
@@ -133,8 +163,8 @@
// randomize read order
read_order.shuffle();
- foreach(read_order[i]) begin
- case(read_order[i])
+ foreach (read_order[i]) begin
+ case (read_order[i])
0: csr_rd(.ptr(ral.data_out_0), .value(cypher_txt[0]), .blocking(~do_b2b));
1: csr_rd(.ptr(ral.data_out_1), .value(cypher_txt[1]), .blocking(~do_b2b));
2: csr_rd(.ptr(ral.data_out_2), .value(cypher_txt[2]), .blocking(~do_b2b));
@@ -144,10 +174,10 @@
`uvm_info(`gfn, $sformatf("\n\t ----| READ OUTPUT DATA"), UVM_MEDIUM)
`uvm_info(`gfn, $sformatf("\n\t ----| DATA FROM DUT %h ", cypher_txt), UVM_HIGH)
- `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_0: %h ", cypher_txt[0][31:0]), UVM_HIGH)
- `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_1: %h ", cypher_txt[1][31:0]), UVM_HIGH)
- `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_2: %h ", cypher_txt[2][31:0]), UVM_HIGH)
- `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_3: %h ", cypher_txt[3][31:0]), UVM_HIGH)
+ `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_0: %h ", cypher_txt[0][31:0]), UVM_HIGH)
+ `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_1: %h ", cypher_txt[1][31:0]), UVM_HIGH)
+ `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_2: %h ", cypher_txt[2][31:0]), UVM_HIGH)
+ `uvm_info(`gfn, $sformatf("\n\t ----| DATA_OUT_3: %h ", cypher_txt[3][31:0]), UVM_HIGH)
endtask
@@ -162,10 +192,6 @@
set_mode(item.aes_mode);
set_key_len(item.key_len);
set_manual_operation(item.manual_op);
- if (!cfg.random_data_key_iv_order) begin
- write_key(item.key, item.do_b2b);
- if (item.mode != AES_ECB) write_iv(item.iv, item.do_b2b);
- end
endtask
@@ -196,8 +222,8 @@
`uvm_info(`gfn, $sformatf("\n\t ----| FIXED DATA ENABLED? : %0b", msg_item.fixed_data_en),
UVM_MEDIUM)
for (int n = 0; n < msg_item.message_length - 15; n += 16) begin
- if(msg_item.fixed_data_en) begin
- `DV_CHECK_RANDOMIZE_WITH_FATAL(aes_item, data_in == msg_item.fixed_data; )
+ if (msg_item.fixed_data_en) begin
+ `DV_CHECK_RANDOMIZE_WITH_FATAL(aes_item, data_in == msg_item.fixed_data;)
end else begin
`DV_CHECK_RANDOMIZE_FATAL(aes_item)
end
@@ -209,11 +235,11 @@
end
// check if message length is not divisible by 16bytes
- if( msg_item.message_length[3:0] != 4'd0) begin
+ if (msg_item.message_length[3:0] != 4'd0) begin
`uvm_info(`gfn, $sformatf("\n ----| generating runt "), UVM_MEDIUM)
aes_item.data_len = msg_item.message_length[3:0];
- if(msg_item.fixed_data_en) begin
- `DV_CHECK_RANDOMIZE_WITH_FATAL(aes_item, data_in == msg_item.fixed_data; )
+ if (msg_item.fixed_data_en) begin
+ `DV_CHECK_RANDOMIZE_WITH_FATAL(aes_item, data_in == msg_item.fixed_data;)
end else begin
`DV_CHECK_RANDOMIZE_FATAL(aes_item)
end
@@ -224,53 +250,71 @@
endtask // generate_data_stream
- virtual task write_interleaved_data_key_iv( bit [7:0] [31:0] key [2], [3:0] [31:0] iv, [3:0] [31:0] data );
+ virtual task write_data_key_iv( aes_seq_item item, bit [3:0] [31:0] data);
string txt="";
+ bit is_blocking = ~item.do_b2b;
string interleave_queue[] = '{ "key_share0_0", "key_share0_1", "key_share0_2", "key_share0_3",
"key_share0_4", "key_share0_5", "key_share0_6", "key_share0_7",
"key_share1_0", "key_share1_1", "key_share1_2", "key_share1_3",
"key_share1_4", "key_share1_5", "key_share1_6", "key_share1_7",
- "data_in_0", "data_in_1", "data_in_2", "data_in_3",
- "iv_0", "iv_1", "iv_2", "iv_3" };
+ "data_in_0", "data_in_1", "data_in_2", "data_in_3"};
- interleave_queue.shuffle();
+ // if non ECB mode add IV to queue
+ if (item.mode != AES_ECB) begin
+ interleave_queue = {"iv_0", "iv_1", "iv_2", "iv_3", interleave_queue};
+ end
- foreach ( interleave_queue[i] ) begin
- txt = {txt, $sformatf("----|\n \t %s", interleave_queue[i]) };
+ if (|item.clear_reg) begin
+ interleave_queue = { interleave_queue, "clear_reg"};
+ `uvm_info(`gfn, $sformatf("\n\t ----| Clear reg enabled adding register clear to Queue"),
+ UVM_MEDIUM)
+ end
- case (interleave_queue[i])
- "key_share0_0": csr_wr(.csr(ral.key_share0_0), .value(key[0][0]));
- "key_share0_1": csr_wr(.csr(ral.key_share0_1), .value(key[0][1]));
- "key_share0_2": csr_wr(.csr(ral.key_share0_2), .value(key[0][2]));
- "key_share0_3": csr_wr(.csr(ral.key_share0_3), .value(key[0][3]));
- "key_share0_4": csr_wr(.csr(ral.key_share0_4), .value(key[0][4]));
- "key_share0_5": csr_wr(.csr(ral.key_share0_5), .value(key[0][5]));
- "key_share0_6": csr_wr(.csr(ral.key_share0_6), .value(key[0][6]));
- "key_share0_7": csr_wr(.csr(ral.key_share0_7), .value(key[0][7]));
- "key_share1_0": csr_wr(.csr(ral.key_share1_0), .value(key[1][0]));
- "key_share1_1": csr_wr(.csr(ral.key_share1_1), .value(key[1][1]));
- "key_share1_2": csr_wr(.csr(ral.key_share1_2), .value(key[1][2]));
- "key_share1_3": csr_wr(.csr(ral.key_share1_3), .value(key[1][3]));
- "key_share1_4": csr_wr(.csr(ral.key_share1_4), .value(key[1][4]));
- "key_share1_5": csr_wr(.csr(ral.key_share1_5), .value(key[1][5]));
- "key_share1_6": csr_wr(.csr(ral.key_share1_6), .value(key[1][6]));
- "key_share1_7": csr_wr(.csr(ral.key_share1_7), .value(key[1][7]));
+ if (cfg.random_data_key_iv_order) interleave_queue.shuffle();
- "iv_0": csr_wr(.csr(ral.iv_0), .value(iv[0]));
- "iv_1": csr_wr(.csr(ral.iv_1), .value(iv[1]));
- "iv_2": csr_wr(.csr(ral.iv_2), .value(iv[2]));
- "iv_3": csr_wr(.csr(ral.iv_3), .value(iv[3]));
+ foreach ( interleave_queue[i] ) begin
+ txt = {txt, $sformatf("\n\t ----| \t %s", interleave_queue[i]) };
- "data_in_0": csr_wr(.csr(ral.data_in_0), .value(data[0][31:0]));
- "data_in_1": csr_wr(.csr(ral.data_in_1), .value(data[1][31:0]));
- "data_in_2": csr_wr(.csr(ral.data_in_2), .value(data[2][31:0]));
- "data_in_3": csr_wr(.csr(ral.data_in_3), .value(data[3][31:0]));
- endcase // case interleave_queue[i]
- end
- `uvm_info(`gfn, $sformatf("\n\t ----| Configuring the DUT in the following order: %s", txt),
+ case (interleave_queue[i])
+ "key_share0_0": csr_wr(.csr(ral.key_share0_0), .value(item.key[0][0]), .blocking(is_blocking));
+ "key_share0_1": csr_wr(.csr(ral.key_share0_1), .value(item.key[0][1]), .blocking(is_blocking));
+ "key_share0_2": csr_wr(.csr(ral.key_share0_2), .value(item.key[0][2]), .blocking(is_blocking));
+ "key_share0_3": csr_wr(.csr(ral.key_share0_3), .value(item.key[0][3]), .blocking(is_blocking));
+ "key_share0_4": csr_wr(.csr(ral.key_share0_4), .value(item.key[0][4]), .blocking(is_blocking));
+ "key_share0_5": csr_wr(.csr(ral.key_share0_5), .value(item.key[0][5]), .blocking(is_blocking));
+ "key_share0_6": csr_wr(.csr(ral.key_share0_6), .value(item.key[0][6]), .blocking(is_blocking));
+ "key_share0_7": csr_wr(.csr(ral.key_share0_7), .value(item.key[0][7]), .blocking(is_blocking));
+
+ "key_share1_0": csr_wr(.csr(ral.key_share1_0), .value(item.key[1][0]), .blocking(is_blocking));
+ "key_share1_1": csr_wr(.csr(ral.key_share1_1), .value(item.key[1][1]), .blocking(is_blocking));
+ "key_share1_2": csr_wr(.csr(ral.key_share1_2), .value(item.key[1][2]), .blocking(is_blocking));
+ "key_share1_3": csr_wr(.csr(ral.key_share1_3), .value(item.key[1][3]), .blocking(is_blocking));
+ "key_share1_4": csr_wr(.csr(ral.key_share1_4), .value(item.key[1][4]), .blocking(is_blocking));
+ "key_share1_5": csr_wr(.csr(ral.key_share1_5), .value(item.key[1][5]), .blocking(is_blocking));
+ "key_share1_6": csr_wr(.csr(ral.key_share1_6), .value(item.key[1][6]), .blocking(is_blocking));
+ "key_share1_7": csr_wr(.csr(ral.key_share1_7), .value(item.key[1][7]), .blocking(is_blocking));
+
+ "iv_0": csr_wr(.csr(ral.iv_0), .value(item.iv[0]), .blocking(is_blocking));
+ "iv_1": csr_wr(.csr(ral.iv_1), .value(item.iv[1]), .blocking(is_blocking));
+ "iv_2": csr_wr(.csr(ral.iv_2), .value(item.iv[2]), .blocking(is_blocking));
+ "iv_3": csr_wr(.csr(ral.iv_3), .value(item.iv[3]), .blocking(is_blocking));
+
+ "data_in_0": csr_wr(.csr(ral.data_in_0), .value(item.data_in[0][31:0]), .blocking(is_blocking));
+ "data_in_1": csr_wr(.csr(ral.data_in_1), .value(item.data_in[1][31:0]), .blocking(is_blocking));
+ "data_in_2": csr_wr(.csr(ral.data_in_2), .value(item.data_in[2][31:0]), .blocking(is_blocking));
+ "data_in_3": csr_wr(.csr(ral.data_in_3), .value(item.data_in[3][31:0]), .blocking(is_blocking));
+
+ "clear_reg": begin
+ clear_regs(item.clear_reg);
+ csr_spinwait(.ptr(ral.status.idle) , .exp_data(1'b1));
+ end
+
+ endcase // case interleave_queue[i]
+ end
+ `uvm_info(`gfn, $sformatf("\n\t ----| Configuring the DUT in the following order: %s, \n\t data 0x%0h", txt, data),
UVM_MEDIUM)
- endtask // write_interleaved_data_key_iv
+ endtask // write_data_key_iv
// TODO
@@ -290,15 +334,12 @@
nxt_item = aes_item_queue.pop_back();
setup_dut(nxt_item);
- // interleave data key and IV in random matter
- if ( cfg.random_data_key_iv_order) begin
- last_item = nxt_item;
- nxt_item = aes_item_queue.pop_back();
- write_interleaved_data_key_iv(last_item.key, last_item.iv, nxt_item.data_in);
- if (nxt_item.mode != AES_NONE) begin
- csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1)); // poll for data valid
- read_data(nxt_item.data_out, nxt_item.do_b2b);
- end
+ last_item = nxt_item;
+ nxt_item = aes_item_queue.pop_back();
+ write_data_key_iv(last_item, nxt_item.data_in);
+ if (nxt_item.mode != AES_NONE) begin
+ csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1)); // poll for data valid
+ read_data(nxt_item.data_out, nxt_item.do_b2b);
end
while (aes_item_queue.size() > 0) begin
@@ -308,7 +349,7 @@
`uvm_info(`gfn, $sformatf("\n\t ----| POLLING FOR DATA"), UVM_DEBUG)
csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1)); // poll for data valid
read_data(nxt_item.data_out, nxt_item.do_b2b);
- end
+ end
end
endtask // transmit_message_with_rd_back
@@ -338,12 +379,11 @@
setup_dut(nxt_item);
`uvm_info(`gfn, $sformatf("\n\t ....| STARTING MANUAL OPERATION |...."), UVM_MEDIUM)
- if ( cfg.random_data_key_iv_order) begin
- last_item = nxt_item;
- nxt_item = aes_item_queue.pop_back();
- write_interleaved_data_key_iv(last_item.key, last_item.iv, nxt_item.data_in);
- trigger();
- end
+
+ last_item = nxt_item;
+ nxt_item = aes_item_queue.pop_back();
+ write_data_key_iv(last_item, nxt_item.data_in);
+ trigger();
while (num_blocks > 0) begin // until all block has been processed and read out
`uvm_info(`gfn, $sformatf("\n\t ....| missing output from %d blocks |....",num_blocks),
@@ -386,55 +426,57 @@
if (aes_item_queue.size() < 1) begin
`uvm_fatal(`gfn, $sformatf("\n\t -| TRYING TO READ FROM AN EMPTY QUEUE |-"))
end
- num_blocks = aes_item_queue.size() - 1; // subtract cfg item
+ num_blocks = aes_item_queue.size() -1; // subtract cfg item
nxt_item = aes_item_queue.pop_back();
setup_dut(nxt_item);
`uvm_info(`gfn, $sformatf("\n\t ....| STARTING MANUAL OPERATION |...."), UVM_MEDIUM)
- if (cfg.random_data_key_iv_order) begin
- last_item = nxt_item;
- nxt_item = aes_item_queue.pop_back();
- num_blocks -= 1;
- write_interleaved_data_key_iv(last_item.key, last_item.iv, nxt_item.data_in);
- trigger();
- csr_spinwait(.ptr(ral.status.output_valid), .exp_data(1'b1)); // poll for data valid
- read_data(nxt_item.data_out, nxt_item.do_b2b);
- end
+
+ last_item = nxt_item;
+ nxt_item = aes_item_queue.pop_back();
+ num_blocks -= 1;
+ write_data_key_iv(last_item, nxt_item.data_in);
+ trigger();
+ csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1)); // poll for data valid
+ read_data(nxt_item.data_out, nxt_item.do_b2b);
while (num_blocks > 0) begin // until all block has been processed and read out
- `uvm_info(`gfn, $sformatf("\n\t ....| missing output from %d blocks |....", num_blocks),
+ `uvm_info(`gfn, $sformatf("\n\t ....| missing output from %d blocks |....",num_blocks),
UVM_MEDIUM)
csr_spinwait(.ptr(ral.status.input_ready) , .exp_data(1'b1));
`uvm_info(`gfn, $sformatf("\n\t ....| POLLED STATUS %h |....",status), UVM_MEDIUM)
- `uvm_info(`gfn, $sformatf("\n\t ....| blocks left in message %d |....", aes_item_queue.size()),
+ `uvm_info(`gfn, $sformatf("\n\t ....| blocks left in message %d |....",aes_item_queue.size()),
UVM_MEDIUM)
nxt_item = aes_item_queue.pop_back();
add_data(nxt_item.data_in, nxt_item.do_b2b);
trigger();
- csr_spinwait(.ptr(ral.status.output_valid), .exp_data(1'b1)); // poll for data valid
+ csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1)); // poll for data valid
read_data(nxt_item.data_out, nxt_item.do_b2b);
num_blocks -= 1;
end
- endtask // transmist_message_manual_op_w_rd_back
+ endtask // trasnmist_message_manual_op_w_rd_back
+ ///////////////////////////////////////////////////////////
+ /////////////// FUNCTIONS ////////////////////
+ ///////////////////////////////////////////////////////////
// initialize the global sequence item
// with values from the message item (happens once per message item
function void aes_item_init(ref aes_message_item message_item);
aes_item = new();
- aes_item.operation = message_item.aes_operation;
- aes_item.mode = message_item.aes_mode;
- aes_item.key_len = message_item.aes_keylen;
- aes_item.key = message_item.aes_key;
- aes_item.iv = message_item.aes_iv;
- aes_item.manual_op = message_item.manual_operation;
- aes_item.key_mask = message_item.keymask;
-
+ aes_item.operation = message_item.aes_operation;
+ aes_item.mode = message_item.aes_mode;
+ aes_item.key_len = message_item.aes_keylen;
+ aes_item.key = message_item.aes_key;
+ aes_item.iv = message_item.aes_iv;
+ aes_item.manual_op = message_item.manual_operation;
+ aes_item.key_mask = message_item.keymask;
+ aes_item.clear_reg_pct = cfg.clear_reg_pct;
endfunction // aes_item_init
@@ -485,7 +527,6 @@
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;
-
`downcast(cloned_message, aes_message.clone());
//`assert($cast(cloned_message, aes_message.clone());
message_queue.push_front(cloned_message);
@@ -503,5 +544,5 @@
`uvm_info(`gfn, $sformatf("----| ITEM #%d", n ), UVM_MEDIUM)
`uvm_info(`gfn, $sformatf("%s", print_item.convert2string()), UVM_MEDIUM)
end
- endfunction
+ endfunction // aes_print_item_queue
endclass : aes_base_vseq
diff --git a/hw/ip/aes/dv/env/seq_lib/aes_clear_vseq.sv b/hw/ip/aes/dv/env/seq_lib/aes_clear_vseq.sv
new file mode 100644
index 0000000..d22c902
--- /dev/null
+++ b/hw/ip/aes/dv/env/seq_lib/aes_clear_vseq.sv
@@ -0,0 +1,103 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+// This sequence will send a number of messages
+// and in each case it will try to reset one or more
+// registers in the DUT verifying that registers are
+// indeed reset and false values are not posted anywere
+// and more importantly that parts of the Key and IV are not exposed
+
+// the first part Runs in auto mode
+// where the DUT recognized when to start an operation
+// the second part is done in manual mode
+// where special cases are setup before the start is triggered.
+
+
+class aes_clear_vseq extends aes_base_vseq;
+ `uvm_object_utils(aes_clear_vseq)
+ `uvm_object_new
+
+ aes_message_item my_message;
+ aes_seq_item nxt_item = new();
+ aes_seq_item last_item = new();
+ clear_t clear_reg_vec;
+
+ task body();
+ `uvm_info(`gfn, $sformatf("\n\n\t ----| STARTING AES CLEAR SEQUENCE |----\n %s", cfg.convert2string()),
+ UVM_LOW)
+
+ // generate list of messages //
+ generate_message_queue();
+
+ // process all messages //
+ while (message_queue.size() > 0) begin
+ // get next message from queue
+ my_message = new();
+ my_message = message_queue.pop_back();
+
+ // for this message generate configuration
+ // and data items (split message into blocks)
+ generate_aes_item_queue(my_message);
+
+ // setup and transmit based on settings
+ nxt_item = aes_item_queue.pop_back();
+ setup_dut(nxt_item);
+
+ // data and config are not in same
+ // items so both are needed for this.
+ last_item = nxt_item;
+ nxt_item = aes_item_queue.pop_back();
+ write_data_key_iv(last_item, nxt_item.data_in);
+ if (my_message.manual_operation) trigger();
+
+ // if a register was cleared
+ // re write the data to have the DUT move on
+ `uvm_info(`gfn, $sformatf("\n\t polling for Idle"), UVM_LOW)
+ if (last_item.clear_reg.data_in) begin
+ clear_regs(last_item.clear_reg);
+ csr_spinwait(.ptr(ral.status.idle) , .exp_data(1'b1));
+ `uvm_info(`gfn, $sformatf("\n\t ----| Re-Adding cleared data "), UVM_LOW)
+ add_data(nxt_item.data_in, nxt_item.do_b2b);
+ end
+
+ if (last_item.clear_reg.iv) begin
+ clear_regs(last_item.clear_reg);
+ csr_spinwait(.ptr(ral.status.idle) , .exp_data(1'b1));
+ `uvm_info(`gfn, $sformatf("\n\t ----| Re-Adding cleared IV "), UVM_LOW)
+ write_iv(last_item.iv, last_item.do_b2b);
+ end
+
+ if (last_item.clear_reg.key) begin
+ clear_regs(last_item.clear_reg);
+ csr_spinwait(.ptr(ral.status.idle) , .exp_data(1'b1));
+ `uvm_info(`gfn, $sformatf("\n\t ----| Re-Adding cleared key "), UVM_LOW)
+ write_key(last_item.key, last_item.do_b2b);
+ end
+
+ // wait for ready
+ if (nxt_item.mode != AES_NONE) begin
+ csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1)); // poll for data valid
+ read_data(nxt_item.data_out, nxt_item.do_b2b);
+ end else begin
+ `uvm_fatal(`gfn, $sformatf("\n\t ----| Invalid Modes are not supported in this test"))
+ end
+
+ // transmit the rest of the message
+ `uvm_info(`gfn, $sformatf("\n\t ----| data left in queue %d",aes_item_queue.size()), UVM_LOW)
+ while (aes_item_queue.size() > 0) begin
+ nxt_item = aes_item_queue.pop_back();
+ add_data(nxt_item.data_in, nxt_item.do_b2b);
+ if (my_message.manual_operation) trigger();
+ if (nxt_item.mode != AES_NONE) begin
+ `uvm_info(`gfn, $sformatf("\n\t ----| POLLING FOR DATA"), UVM_DEBUG)
+ csr_spinwait(.ptr(ral.status.output_valid) , .exp_data(1'b1)); // poll for data valid
+ read_data(nxt_item.data_out, nxt_item.do_b2b);
+ end
+ end
+
+
+ `uvm_info(`gfn, $sformatf("\n\t ----| DONE TRANMISTTING MESSAGE"), UVM_LOW)
+ end
+ endtask : body
+endclass
diff --git a/hw/ip/aes/dv/env/seq_lib/aes_vseq_list.sv b/hw/ip/aes/dv/env/seq_lib/aes_vseq_list.sv
index 7d62c58..9ec00f3 100644
--- a/hw/ip/aes/dv/env/seq_lib/aes_vseq_list.sv
+++ b/hw/ip/aes/dv/env/seq_lib/aes_vseq_list.sv
@@ -6,3 +6,4 @@
`include "aes_wake_up_vseq.sv"
`include "aes_common_vseq.sv"
`include "aes_stress_vseq.sv"
+`include "aes_clear_vseq.sv"
diff --git a/hw/ip/aes/dv/tests/aes_clear_test.sv b/hw/ip/aes/dv/tests/aes_clear_test.sv
new file mode 100644
index 0000000..a22a99d
--- /dev/null
+++ b/hw/ip/aes/dv/tests/aes_clear_test.sv
@@ -0,0 +1,50 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+class aes_clear_test extends aes_base_test;
+
+ `uvm_component_utils(aes_clear_test)
+ `uvm_component_new
+
+
+ virtual function void build_phase(uvm_phase phase);
+ super.build_phase(phase);
+ configure_env();
+ endfunction
+
+ function void configure_env();
+ super.configure_env();
+
+ cfg.error_types = 0;
+ cfg.num_messages_min = 1;
+ cfg.num_messages_max = 5;
+ // message related knobs
+ cfg.ecb_weight = 10;
+ cfg.cbc_weight = 10;
+ cfg.ctr_weight = 10;
+ cfg.ofb_weight = 10;
+ cfg.cfb_weight = 10;
+
+ cfg.message_len_min = 1;
+ cfg.message_len_max = 317;
+ cfg.manual_operation_pct = 0;
+ cfg.use_key_mask = 0;
+
+ cfg.fixed_data_en = 0;
+ cfg.fixed_key_en = 0;
+
+ cfg.fixed_operation_en = 0;
+ cfg.fixed_operation = 0;
+
+ cfg.fixed_keylen_en = 0;
+ cfg.fixed_keylen = 3'b001;
+
+ cfg.fixed_iv_en = 0;
+
+ cfg.random_data_key_iv_order = 1;
+ cfg.clear_reg_pct = 100;
+
+ `DV_CHECK_RANDOMIZE_FATAL(cfg)
+ endfunction
+endclass : aes_clear_test
diff --git a/hw/ip/aes/dv/tests/aes_test.core b/hw/ip/aes/dv/tests/aes_test.core
index 1d37d8b..0f1550e 100644
--- a/hw/ip/aes/dv/tests/aes_test.core
+++ b/hw/ip/aes/dv/tests/aes_test.core
@@ -16,6 +16,7 @@
- aes_stress_test.sv: {is_include_file: true}
- aes_b2b_test.sv: {is_include_file: true}
- aes_config_error_test.sv: {is_include_file: true}
+ - aes_clear_test.sv: {is_include_file: true}
file_type: systemVerilogSource
targets:
diff --git a/hw/ip/aes/dv/tests/aes_test_pkg.sv b/hw/ip/aes/dv/tests/aes_test_pkg.sv
index 3883156..14e1875 100644
--- a/hw/ip/aes/dv/tests/aes_test_pkg.sv
+++ b/hw/ip/aes/dv/tests/aes_test_pkg.sv
@@ -23,5 +23,6 @@
`include "aes_stress_test.sv"
`include "aes_b2b_test.sv"
`include "aes_config_error_test.sv"
+ `include "aes_clear_test.sv"
endpackage