[aes/dv] Adapt CSR test exclusions
This commit adapts and documents the CSR exclusions for the AES module.
For the TRIGGER and the STATUS register, the exclusions are now specified
on a field basis.
The STATUS register is updated based on writes to other registers. Upon a
reset, internal operations are triggered (reseeding LFSRs, clearing
registers) that temporarily change the IDLE field in the STATUS register.
The TRIGGER register is updated by the hardware and fields with non-zero
reset values are cleared to zero by the hardware automatically.
Signed-off-by: Pirmin Vogel <vogelpi@lowrisc.org>
diff --git a/hw/ip/aes/data/aes.hjson b/hw/ip/aes/data/aes.hjson
index c507ae6..7bc432e 100644
--- a/hw/ip/aes/data/aes.hjson
+++ b/hw/ip/aes/data/aes.hjson
@@ -122,8 +122,9 @@
{ bits: "31:0", name: "data_out", desc: "Output Data" }
]
tags: [// Updated by the HW.
+ // Updates based on writes to other regs.
// No reset but sync clear with random data.
- // Exclude from init and write checks.
+ // Exclude from init and write-read checks.
"excl:CsrAllTests:CsrExclCheck"]
}
},
@@ -176,7 +177,9 @@
'''
}
]
- tags: [// Updated by hw. Exclude from write-checks.
+ tags: [// Updated by the HW.
+ // Updates based on writes to this reg (reset test possible).
+ // Exclude from write-read checks.
"excl:CsrNonInitTests:CsrExclWriteCheck"]
},
{ name: "TRIGGER",
@@ -187,6 +190,12 @@
'''
swaccess: "wo",
hwaccess: "hrw",
+ # Tag info (CSR test exclusions):
+ # Updated by the HW.
+ # Updates based on writes to this reg.
+ # -> Exclude all fields from write-read checks.
+ # Upon reset, the non-zero values trigger internal operations that clear this reg to zero.
+ # -> Exclude fields with non-zero reset value from init and write-read checks (also in reset test).
fields: [
{ bits: "0",
name: "START",
@@ -194,6 +203,7 @@
Keep AES unit paused (0) or trigger the encryption/decryption of one data block (1).
This trigger is ignored if MANUAL_OPERATION=0 (see Control Register).
'''
+ tags: ["excl:CsrNonInitTests:CsrExclWriteCheck"]
}
{ bits: "1",
name: "KEY_CLEAR",
@@ -202,6 +212,7 @@
Keep current values in Initial Key, internal Full Key and Decryption Key registers (0)
or clear those registers with pseudo-random data (1).
'''
+ tags: ["excl:CsrAllTests:CsrExclCheck"]
}
{ bits: "2",
name: "IV_CLEAR",
@@ -209,6 +220,7 @@
desc: '''
Keep current values in IV registers (0) or clear those registers with pseudo-random data (1).
'''
+ tags: ["excl:CsrAllTests:CsrExclCheck"]
}
{ bits: "3",
name: "DATA_IN_CLEAR",
@@ -216,6 +228,7 @@
desc: '''
Keep current values in input registers (0) or clear those registers with pseudo-random data (1).
'''
+ tags: ["excl:CsrAllTests:CsrExclCheck"]
}
{ bits: "4",
name: "DATA_OUT_CLEAR",
@@ -223,6 +236,7 @@
desc: '''
Keep current values in output registers (0) or clear those registers with pseudo-random data (1).
'''
+ tags: ["excl:CsrAllTests:CsrExclCheck"]
}
{ bits: "5",
name: "PRNG_RESEED",
@@ -230,17 +244,20 @@
desc: '''
Keep continuing with the current internal state of the internal pseudo-random number generator (0) or perform a reseed of the internal state from the connected entropy source (1).
'''
+ tags: ["excl:CsrAllTests:CsrExclCheck"]
}
]
- tags: [// Updated by the HW.
- // Reset value cleared to zero.
- // Exclude from init and write checks.
- "excl:CsrAllTests:CsrExclCheck"]
},
{ name: "STATUS",
desc: "Status Register",
swaccess: "ro",
hwaccess: "hwo",
+ # Tag info (CSR test exclusions):
+ # Updated by the HW.
+ # Updates based on writes to other regs.
+ # -> Exclude all fields from init and write-read checks.
+ # Upon reset, internal operations are triggered that temporarily change the IDLE field.
+ # -> Exclude IDLE field from init and write-read checks (also in reset test).
fields: [
{ bits: "0",
name: "IDLE",
@@ -248,6 +265,7 @@
desc: '''
The AES unit is idle (1) or busy (0).
'''
+ tags: ["excl:CsrAllTests:CsrExclCheck"]
}
{ bits: "1",
name: "STALL",
@@ -256,12 +274,14 @@
output data that must be read by the processor before the AES unit can
overwrite this data.
'''
+ tags: ["excl:CsrNonInitTests:CsrExclCheck"]
}
{ bits: "2",
name: "OUTPUT_VALID",
desc: '''
The AES unit has no valid output (0) or has valid output data (1).
'''
+ tags: ["excl:CsrNonInitTests:CsrExclCheck"]
}
{ bits: "3",
name: "INPUT_READY",
@@ -271,10 +291,9 @@
the present values in the DATA_IN registers have not yet been loaded into the
module (0).
'''
+ tags: ["excl:CsrNonInitTests:CsrExclCheck"]
}
]
- tags: [// Updated by hw. Exclude from write-checks.
- "excl:CsrNonInitTests:CsrExclWriteCheck"]
},
],
}
diff --git a/hw/ip/aes/dv/env/seq_lib/aes_common_vseq.sv b/hw/ip/aes/dv/env/seq_lib/aes_common_vseq.sv
index db58409..df33b6e 100644
--- a/hw/ip/aes/dv/env/seq_lib/aes_common_vseq.sv
+++ b/hw/ip/aes/dv/env/seq_lib/aes_common_vseq.sv
@@ -10,6 +10,11 @@
}
`uvm_object_new
+ virtual task pre_start();
+ do_aes_init = 1'b0;
+ super.pre_start();
+ endtask
+
virtual task body();
run_common_vseq_wrapper(num_trans);
endtask : body