Skip to content

Commit bd68f07

Browse files
committed
[ibex,dv] Add new test for memory integrity errors
This test picks between inserting an integrity error or a bus error to the response in the case of a memory request from Ibex. Introduces a control knob `enable_mem_intg_err` which can control the rate of having integrity errors per request. This commit also disables checking for double fault alerts in the scoreboard because they're expected to be seen while simulating and they don't cause infinite loop problems because every time a memory response is requested the error causing part is just randomized. That means Ibex trying to execute same instruction again would have a chance to succeed this time. Signed-off-by: Canberk Topal <ctopal@lowrisc.org>
1 parent e96832f commit bd68f07

File tree

6 files changed

+67
-6
lines changed

6 files changed

+67
-6
lines changed

dv/uvm/core_ibex/common/ibex_mem_intf_agent/ibex_mem_intf_response_seq_lib.sv

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class ibex_mem_intf_response_seq extends uvm_sequence #(ibex_mem_intf_seq_item);
1010

1111
ibex_mem_intf_seq_item item;
1212
mem_model m_mem;
13+
bit enable_intg_error = 1'b0;
1314
bit enable_error = 1'b0;
1415
// Used to ensure that whenever inject_error() is called, the very next transaction will inject an
1516
// error, and that enable_error will not be flipped back to 0 immediately
@@ -64,6 +65,7 @@ class ibex_mem_intf_response_seq extends uvm_sequence #(ibex_mem_intf_seq_item);
6465
// TODO: Parametrize this. Until then, this needs to be changed manually.
6566
if (aligned_addr == 32'h8ffffff8) begin
6667
req.error = 1'b0;
68+
enable_intg_error = 1'b0;
6769
end
6870
if (req.error) begin
6971
`DV_CHECK_STD_RANDOMIZE_FATAL(rand_data)
@@ -90,7 +92,10 @@ class ibex_mem_intf_response_seq extends uvm_sequence #(ibex_mem_intf_seq_item);
9092

9193
// If data_was_uninitialized is true then we want to force bad integrity bits: invert the
9294
// correct ones, which we know will break things for the codes we use.
93-
if (data_was_uninitialized) req.intg = ~req.intg;
95+
if (data_was_uninitialized || enable_intg_error) begin
96+
req.intg = ~req.intg;
97+
enable_intg_error = 1'b0;
98+
end
9499

95100
`uvm_info(get_full_name(), $sformatf("Response transfer:\n%0s", req.sprint()), UVM_HIGH)
96101
start_item(req);
@@ -111,6 +116,10 @@ class ibex_mem_intf_response_seq extends uvm_sequence #(ibex_mem_intf_seq_item);
111116
this.enable_error = 1'b1;
112117
endfunction
113118

119+
virtual function void inject_intg_error();
120+
this.enable_intg_error = 1'b1;
121+
endfunction
122+
114123
virtual function bit get_error_synch();
115124
return this.error_synch;
116125
endfunction

dv/uvm/core_ibex/env/core_ibex_env_cfg.sv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ class core_ibex_env_cfg extends uvm_object;
77
virtual clk_rst_if ibex_clk_vif;
88
virtual core_ibex_dut_probe_if ibex_dut_vif;
99

10+
bit enable_mem_intg_err;
1011
bit enable_irq_single_seq;
1112
bit enable_irq_multiple_seq;
1213
bit enable_irq_nmi_seq;
@@ -31,6 +32,7 @@ class core_ibex_env_cfg extends uvm_object;
3132
`uvm_object_utils_begin(core_ibex_env_cfg)
3233
`uvm_field_int(enable_double_fault_detector, UVM_DEFAULT)
3334
`uvm_field_int(is_double_fault_detected_fatal, UVM_DEFAULT)
35+
`uvm_field_int(enable_mem_intg_err, UVM_DEFAULT)
3436
`uvm_field_int(enable_irq_single_seq, UVM_DEFAULT)
3537
`uvm_field_int(enable_irq_multiple_seq, UVM_DEFAULT)
3638
`uvm_field_int(enable_irq_nmi_seq, UVM_DEFAULT)
@@ -48,6 +50,7 @@ class core_ibex_env_cfg extends uvm_object;
4850
super.new(name);
4951
void'($value$plusargs("enable_double_fault_detector=%0d", enable_double_fault_detector));
5052
void'($value$plusargs("is_double_fault_detected_fatal=%0d", is_double_fault_detected_fatal));
53+
void'($value$plusargs("enable_mem_intg_err=%0d", enable_mem_intg_err));
5154
void'($value$plusargs("enable_irq_single_seq=%0d", enable_irq_single_seq));
5255
void'($value$plusargs("enable_irq_multiple_seq=%0d", enable_irq_multiple_seq));
5356
void'($value$plusargs("enable_irq_nmi_seq=%0d", enable_irq_nmi_seq));

dv/uvm/core_ibex/riscv_dv_extension/testlist.yaml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,27 @@
549549
+suppress_pmp_setup=1
550550
rtl_test: core_ibex_mem_error_test
551551
sim_opts: >
552+
+enable_mem_intg_err=0
553+
+enable_double_fault_detector=0
554+
+require_signature_addr=1
555+
compare_opts:
556+
compare_final_value_only: 1
557+
558+
- test: riscv_mem_intg_error_test
559+
description: >
560+
Normal random instruction test, but randomly insert memory load/store integrity errors
561+
iterations: 15
562+
gen_test: riscv_rand_instr_test
563+
gen_opts: >
564+
+require_signature_addr=1
565+
+instr_cnt=10000
566+
+randomize_csr=1
567+
+enable_unaligned_load_store=1
568+
+suppress_pmp_setup=1
569+
rtl_test: core_ibex_mem_error_test
570+
sim_opts: >
571+
+enable_mem_intg_err=1
572+
+enable_double_fault_detector=0
552573
+require_signature_addr=1
553574
compare_opts:
554575
compare_final_value_only: 1

dv/uvm/core_ibex/tb/core_ibex_tb_top.sv

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,9 @@ module core_ibex_tb_top;
158158
);
159159

160160
// We should never see any alerts triggered in normal testing
161-
`ASSERT(NoAlertsTriggered,
161+
`ASSERT(NoAlertsTriggered_A,
162162
!dut_if.alert_minor && !dut_if.alert_major_internal && !dut_if.alert_major_bus, clk, !rst_n)
163+
`DV_ASSERT_CTRL("NoAlertsTriggered", core_ibex_tb_top.NoAlertsTriggered_A)
163164

164165
// Data load/store vif connection
165166
assign data_mem_vif.reset = ~rst_n;

dv/uvm/core_ibex/tests/core_ibex_new_seq_lib.sv

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,13 @@ class memory_error_seq extends core_base_new_seq#(ibex_mem_intf_seq_item);
205205
bit start_seq = 0; // Use this bit to start any unique sequence once
206206

207207
rand error_type_e err_type = PickErr;
208+
rand bit inject_intg_err;
209+
// CONTROL_KNOB: Configure the rate between seeing an integrity error versus seeing a bus error.
210+
int unsigned intg_err_pct = 50;
211+
constraint inject_intg_err_c {
212+
inject_intg_err dist {1 :/ intg_err_pct,
213+
0 :/ 100 - intg_err_pct};
214+
}
208215

209216
`uvm_object_utils(memory_error_seq)
210217
`uvm_declare_p_sequencer(core_ibex_vseqr)
@@ -214,21 +221,39 @@ class memory_error_seq extends core_base_new_seq#(ibex_mem_intf_seq_item);
214221
endfunction
215222

216223
virtual task send_req();
217-
case (err_type)
218-
IsideErr: begin
224+
`DV_CHECK_MEMBER_RANDOMIZE_FATAL(inject_intg_err)
225+
// If we expect to see only bus errors, we can enable this assertion. Otherwise
226+
// integrity errors would cause alerts to trigger.
227+
`DV_ASSERT_CTRL_REQ("NoAlertsTriggered", intg_err_pct == 0)
228+
case ({err_type, inject_intg_err})
229+
{IsideErr, 1'b0}: begin
219230
vseq.instr_intf_seq.inject_error();
220231
end
221-
DsideErr: begin
232+
{DsideErr, 1'b0}: begin
222233
vseq.data_intf_seq.inject_error();
223234
end
224-
PickErr: begin
235+
{PickErr, 1'b0}: begin
225236
`DV_CHECK_STD_RANDOMIZE_FATAL(choose_side)
226237
if (choose_side) begin
227238
vseq.instr_intf_seq.inject_error();
228239
end else begin
229240
vseq.data_intf_seq.inject_error();
230241
end
231242
end
243+
{IsideErr, 1'b1}: begin
244+
vseq.instr_intf_seq.inject_intg_error();
245+
end
246+
{DsideErr, 1'b1}: begin
247+
vseq.data_intf_seq.inject_intg_error();
248+
end
249+
{PickErr, 1'b1}: begin
250+
`DV_CHECK_STD_RANDOMIZE_FATAL(choose_side)
251+
if (choose_side) begin
252+
vseq.instr_intf_seq.inject_intg_error();
253+
end else begin
254+
vseq.data_intf_seq.inject_intg_error();
255+
end
256+
end
232257
default: begin
233258
// DO nothing
234259
end

dv/uvm/core_ibex/tests/core_ibex_test_lib.sv

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,6 +1174,8 @@ class core_ibex_mem_error_test extends core_ibex_directed_test;
11741174
memory_error_seq_h = memory_error_seq::type_id::create("memory_error_seq_h", this);
11751175
`uvm_info(`gfn, "Running core_ibex_mem_error_test", UVM_LOW)
11761176
memory_error_seq_h.vseq = vseq;
1177+
memory_error_seq_h.iteration_modes = InfiniteRuns;
1178+
memory_error_seq_h.intg_err_pct = cfg.enable_mem_intg_err ? 75 : 0;
11771179
fork
11781180
begin
11791181
// Wait for the hart to initialize

0 commit comments

Comments
 (0)