Skip to content

Commit 06367c4

Browse files
committed
[aes/dv] Add missing predict() calls to update mirrored RAL values
When using .set() method of the uvm_reg_field base class (this only updates the desired value in the abstraction class) followed by a csr_update() call (this updates the DUT in case the desired value doesn't match the mirrored value), we also need to explicitly update the mirrored value. This can happen either by using the .predict() method, or by calling csr_rd() or csr_wr(). This commit adds missing calls to the .predict() method were required. Without these calls, the mirrored values can get out of sync and since in some cases we use the mirrored value to decide whether we need to update register values, the DUT and the DV environment can get out of sync. Signed-off-by: Pirmin Vogel <[email protected]>
1 parent de45e87 commit 06367c4

File tree

3 files changed

+26
-0
lines changed

3 files changed

+26
-0
lines changed

hw/ip/aes/dv/env/seq_lib/aes_base_vseq.sv

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ class aes_base_vseq extends cip_base_vseq #(
133133
if (ral.ctrl_shadowed.operation.get_mirrored_value() != operation) begin
134134
ral.ctrl_shadowed.operation.set(operation);
135135
csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
136+
void'(ral.ctrl_shadowed.operation.predict(operation));
136137
end
137138
endtask // set_operation
138139

@@ -141,6 +142,7 @@ class aes_base_vseq extends cip_base_vseq #(
141142
if (ral.ctrl_shadowed.mode.get_mirrored_value() != mode) begin
142143
ral.ctrl_shadowed.mode.set(mode);
143144
csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
145+
void'(ral.ctrl_shadowed.mode.predict(mode));
144146
end
145147
endtask
146148

@@ -149,6 +151,7 @@ class aes_base_vseq extends cip_base_vseq #(
149151
if (ral.ctrl_shadowed.key_len.get_mirrored_value() != key_len) begin
150152
ral.ctrl_shadowed.key_len.set(key_len);
151153
csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
154+
void'(ral.ctrl_shadowed.key_len.predict(key_len));
152155
end
153156
endtask // set_key_len
154157

@@ -157,6 +160,7 @@ class aes_base_vseq extends cip_base_vseq #(
157160
if (ral.ctrl_shadowed.sideload.get_mirrored_value() != sideload) begin
158161
ral.ctrl_shadowed.sideload.set(sideload);
159162
csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
163+
void'(ral.ctrl_shadowed.sideload.predict(sideload));
160164
end
161165
endtask
162166

@@ -165,6 +169,7 @@ class aes_base_vseq extends cip_base_vseq #(
165169
if (ral.ctrl_shadowed.prng_reseed_rate.get_mirrored_value() != reseed_rate) begin
166170
ral.ctrl_shadowed.prng_reseed_rate.set(reseed_rate);
167171
csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
172+
void'(ral.ctrl_shadowed.prng_reseed_rate.predict(reseed_rate));
168173
end
169174
endtask
170175

@@ -173,6 +178,7 @@ class aes_base_vseq extends cip_base_vseq #(
173178
if (ral.ctrl_shadowed.manual_operation.get_mirrored_value() != manual_operation) begin
174179
ral.ctrl_shadowed.manual_operation.set(manual_operation);
175180
csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
181+
void'(ral.ctrl_shadowed.manual_operation.predict(manual_operation));
176182
end
177183
endtask
178184

@@ -209,6 +215,8 @@ class aes_base_vseq extends cip_base_vseq #(
209215
ral.ctrl_gcm_shadowed.phase.set(phase);
210216
ral.ctrl_gcm_shadowed.num_valid_bytes.set(num_bytes);
211217
csr_update(.csr(ral.ctrl_gcm_shadowed), .en_shadow_wr(1'b1), .blocking(1));
218+
void'(ral.ctrl_gcm_shadowed.phase.predict(phase));
219+
void'(ral.ctrl_gcm_shadowed.num_valid_bytes.set(num_bytes));
212220
endtask
213221

214222
virtual task add_data(ref bit [3:0] [31:0] data, bit do_b2b);
@@ -1029,6 +1037,11 @@ class aes_base_vseq extends cip_base_vseq #(
10291037
csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(is_blocking));
10301038
end
10311039

1040+
// Read the main control register. This will update the mirrored values thereby getting them
1041+
// back in sync with the DUT (updated via csr_update() above) and the predicted values (updated
1042+
// via set() above).
1043+
csr_rd(.ptr(ral.ctrl_shadowed), .value(ctrl), .backdoor(1));
1044+
10321045
if (cfg_item.mode == AES_GCM && !status.alert_fatal_fault) begin
10331046
// As we are splitting the message, we also need to recalculate the length
10341047
// of the AAD and PTX -> len(aad) || len(data) that is stored in a AES_GCM_TAG

hw/ip/aes/dv/env/seq_lib/aes_nist_vectors_gcm_vseq.sv

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ class aes_nist_vectors_gcm_vseq extends aes_base_vseq;
6464
ral.ctrl_shadowed.mode.set(nist_vectors[i].mode);
6565
ral.ctrl_shadowed.prng_reseed_rate.set(PER_8K);
6666
csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
67+
void'(ral.ctrl_shadowed.operation.predict(AES_ENC));
68+
void'(ral.ctrl_shadowed.key_len.predict(nist_vectors[i].key_len));
69+
void'(ral.ctrl_shadowed.mode.predict(nist_vectors[i].mode));
70+
void'(ral.ctrl_shadowed.prng_reseed_rate.predict(PER_8K));
6771

6872
// Put AES-GCM into init phase.
6973
cov_if.cg_ctrl_gcm_reg_sample(GCM_INIT);
@@ -191,6 +195,9 @@ class aes_nist_vectors_gcm_vseq extends aes_base_vseq;
191195
ral.ctrl_shadowed.key_len.set(nist_vectors[i].key_len);
192196
ral.ctrl_shadowed.mode.set(nist_vectors[i].mode);
193197
csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
198+
void'(ral.ctrl_shadowed.operation.predict(AES_DEC));
199+
void'(ral.ctrl_shadowed.key_len.predict(nist_vectors[i].key_len));
200+
void'(ral.ctrl_shadowed.mode.predict(nist_vectors[i].mode));
194201

195202
// Put AES-GCM into init phase.
196203
cov_if.cg_ctrl_gcm_reg_sample(GCM_INIT);

hw/ip/aes/dv/env/seq_lib/aes_nist_vectors_vseq.sv

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ class aes_nist_vectors_vseq extends aes_base_vseq;
4646
ral.ctrl_shadowed.key_len.set(nist_vectors[i].key_len);
4747
ral.ctrl_shadowed.mode.set(nist_vectors[i].mode);
4848
csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
49+
void'(ral.ctrl_shadowed.operation.predict(AES_ENC));
50+
void'(ral.ctrl_shadowed.key_len.predict(nist_vectors[i].key_len));
51+
void'(ral.ctrl_shadowed.mode.predict(nist_vectors[i].mode));
4952
// transpose key To match NIST format ( little endian)
5053
init_key = '{ {<<8{nist_vectors[i].key}} , 256'h0 };
5154
write_key(init_key, do_b2b);
@@ -84,6 +87,9 @@ class aes_nist_vectors_vseq extends aes_base_vseq;
8487
ral.ctrl_shadowed.key_len.set(nist_vectors[i].key_len);
8588
ral.ctrl_shadowed.mode.set(nist_vectors[i].mode);
8689
csr_update(.csr(ral.ctrl_shadowed), .en_shadow_wr(1'b1), .blocking(1));
90+
void'(ral.ctrl_shadowed.operation.predict(AES_DEC));
91+
void'(ral.ctrl_shadowed.key_len.predict(nist_vectors[i].key_len));
92+
void'(ral.ctrl_shadowed.mode.predict(nist_vectors[i].mode));
8793

8894
// transpose key To match NIST format ( little endian)
8995
init_key = '{ {<<8{nist_vectors[i].key}} , 256'h0 };

0 commit comments

Comments
 (0)