Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ecc fix #2190

Merged
merged 3 commits into from
Jul 15, 2024
Merged

Ecc fix #2190

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions dv/uvm/core_ibex/env/core_ibex_dut_probe_if.sv
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ interface core_ibex_dut_probe_if(input logic clk);
logic rf_ren_b;
logic rf_rd_a_wb_match;
logic rf_rd_b_wb_match;
logic rf_write_wb;
logic sync_exc_seen;
logic irq_exc_seen;
logic csr_save_cause;
Expand Down Expand Up @@ -80,6 +81,7 @@ interface core_ibex_dut_probe_if(input logic clk);
input rf_ren_b;
input rf_rd_a_wb_match;
input rf_rd_b_wb_match;
input rf_write_wb;
input sync_exc_seen;
input irq_exc_seen;
input wb_exception;
Expand All @@ -93,6 +95,7 @@ interface core_ibex_dut_probe_if(input logic clk);
`DV_CREATE_SIGNAL_PROBE_FUNCTION(signal_probe_rf_ren_b, rf_ren_b)
`DV_CREATE_SIGNAL_PROBE_FUNCTION(signal_probe_rf_rd_a_wb_match, rf_rd_a_wb_match)
`DV_CREATE_SIGNAL_PROBE_FUNCTION(signal_probe_rf_rd_b_wb_match, rf_rd_b_wb_match)
`DV_CREATE_SIGNAL_PROBE_FUNCTION(signal_probe_rf_write_wb, rf_write_wb)
`DV_CREATE_SIGNAL_PROBE_FUNCTION(signal_probe_alert_minor, alert_minor)
`DV_CREATE_SIGNAL_PROBE_FUNCTION(signal_probe_ic_tag_req, ic_tag_req)
`DV_CREATE_SIGNAL_PROBE_FUNCTION(signal_probe_ic_tag_write, ic_tag_write)
Expand Down
8 changes: 7 additions & 1 deletion dv/uvm/core_ibex/riscv_dv_extension/testlist.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -683,8 +683,14 @@
- test: riscv_rf_intg_test
description: >
Randomly corrupt the register file read port once in the middle of program execution
iterations: 15
iterations: 100
gen_test: riscv_rand_instr_test
gen_opts: >
+instr_cnt=10000
+num_of_sub_program=5
+gen_all_csrs_by_default=1
+add_csr_write=MSTATUS,MEPC,MCAUSE,MTVAL,0x7c0,0x7c1
+no_csr_instr=0
rtl_test: core_ibex_rf_intg_test
rtl_params:
SecureIbex: 1
Expand Down
1 change: 1 addition & 0 deletions dv/uvm/core_ibex/tb/core_ibex_tb_top.sv
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,7 @@ module core_ibex_tb_top;
assign dut_if.rf_ren_b = dut.u_ibex_top.u_ibex_core.rf_ren_b;
assign dut_if.rf_rd_a_wb_match = dut.u_ibex_top.u_ibex_core.rf_rd_a_wb_match;
assign dut_if.rf_rd_b_wb_match = dut.u_ibex_top.u_ibex_core.rf_rd_b_wb_match;
assign dut_if.rf_write_wb = dut.u_ibex_top.u_ibex_core.rf_write_wb;
assign dut_if.sync_exc_seen = dut.u_ibex_top.u_ibex_core.cs_registers_i.cpuctrlsts_part_q.sync_exc_seen;
assign dut_if.csr_save_cause = dut.u_ibex_top.u_ibex_core.csr_save_cause;
assign dut_if.exc_cause = dut.u_ibex_top.u_ibex_core.exc_cause;
Expand Down
12 changes: 9 additions & 3 deletions dv/uvm/core_ibex/tests/core_ibex_test_lib.sv
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,8 @@ class core_ibex_rf_intg_test extends core_ibex_base_test;
endfunction

virtual task send_stimulus();
bit port_idx;
int rnd_delay;
bit port_idx;
string port_name;

vseq.start(env.vseqr);
Expand All @@ -138,14 +139,19 @@ class core_ibex_rf_intg_test extends core_ibex_base_test;
port_idx = $urandom_range(1);
port_name = port_idx ? "rf_rdata_b_ecc" : "rf_rdata_a_ecc";

`DV_CHECK_STD_RANDOMIZE_WITH_FATAL(rnd_delay, rnd_delay > 1000; rnd_delay < 10_000;)
clk_vif.wait_n_clks(rnd_delay);

forever begin
logic rf_ren, rf_rd_wb_match;
logic rf_ren, rf_rd_wb_match, rf_write_wb;
int unsigned bit_idx;
uvm_hdl_data_t data, mask;
logic exp_alert, alert_major_internal;

clk_vif.wait_n_clks(1);

rf_write_wb = dut_vif.signal_probe_rf_write_wb(dv_utils_pkg::SignalProbeSample);

// Check if port is being read.
if (port_idx) begin
rf_ren = dut_vif.signal_probe_rf_ren_b(dv_utils_pkg::SignalProbeSample);
Expand All @@ -156,7 +162,7 @@ class core_ibex_rf_intg_test extends core_ibex_base_test;
end

// Only corrupt port if it is read.
if (!(rf_ren == 1'b1 && rf_rd_wb_match == 1'b0)) continue;
if (!(rf_ren == 1'b1 && (rf_rd_wb_match == 1'b0 || rf_write_wb == 1'b0))) continue;

data = read_data(port_name);
`uvm_info(`gfn, $sformatf("Corrupting %s; original value: 'h%0x", port_name, data), UVM_LOW)
Expand Down
4 changes: 2 additions & 2 deletions rtl/ibex_core.sv
Original file line number Diff line number Diff line change
Expand Up @@ -916,8 +916,8 @@ module ibex_core import ibex_pkg::*; #(
assign rf_rdata_b = rf_rdata_b_ecc_i[31:0];

// Calculate errors - qualify with WB forwarding to avoid xprop into the alert signal
assign rf_ecc_err_a_id = |rf_ecc_err_a & rf_ren_a & ~rf_rd_a_wb_match;
assign rf_ecc_err_b_id = |rf_ecc_err_b & rf_ren_b & ~rf_rd_b_wb_match;
assign rf_ecc_err_a_id = |rf_ecc_err_a & rf_ren_a & ~(rf_rd_a_wb_match & rf_write_wb);
assign rf_ecc_err_b_id = |rf_ecc_err_b & rf_ren_b & ~(rf_rd_b_wb_match & rf_write_wb);

// Combined error
assign rf_ecc_err_comb = instr_valid_id & (rf_ecc_err_a_id | rf_ecc_err_b_id);
Expand Down
Loading