diff --git a/src/frontend/frontend.sv b/src/frontend/frontend.sv index d0f7b5ca4e9119c53da0d7442e4e0fb8610487a0..018573b4d5044e8bdfb83cd4497a42c9628367a7 100644 --- a/src/frontend/frontend.sv +++ b/src/frontend/frontend.sv @@ -380,14 +380,15 @@ module frontend import ariane_pkg::*; #( ) i_ras ( .clk_i, .rst_ni, - .flush_i ( flush_bp_i ), - .push_i ( ras_push ), - .pop_i ( ras_pop ), - .data_i ( ras_update ), - .begin_spec_i ( begin_spec_o ), - .valid_spec_i ( is_correct_predict ), - .bad_spec_i ( is_mispredict ), - .data_o ( ras_predict ) + .flush_i ( flush_bp_i ), + .push_i ( ras_push ), + .pop_i ( ras_pop ), + .data_i ( ras_update ), + .begin_spec_i ( begin_spec_o ), + .valid_spec_i ( is_correct_predict ), + .bad_spec_i ( is_mispredict ), + .resolved_type_i ( resolved_branch_i.cf_type ), + .data_o ( ras_predict ) ); btb #( diff --git a/src/frontend/sras.sv b/src/frontend/sras.sv index e5f7f8b618f1cc61f31af7e8ea53113b84e6c0db..a1ca55878e698bdb36b491a1bbc9cda3f22767db 100644 --- a/src/frontend/sras.sv +++ b/src/frontend/sras.sv @@ -28,6 +28,7 @@ module sras #( input logic begin_spec_i, input logic valid_spec_i, input logic bad_spec_i, + input ariane_pkg::cf_t resolved_type_i, output ariane_pkg::ras_t data_o ); @@ -68,12 +69,16 @@ module sras #( ovf_counter_d[ptr_spec_q] = ovf_counter_q[ptr_spec_q] + 1'b1; end end else if (!push_i && pop_i) begin - if (ovf_counter_q[ptr_spec_q] != '0) begin + if (ovf_counter_q[ptr_spec_q] == '0) begin + ovf_counter_d[ptr_spec_d] = '0; // ovf_counter_d[ptr_spec_d] = ovf_counter_q[ptr_spec_q]; + end else begin ovf_counter_d[ptr_spec_d] = ovf_counter_q[ptr_spec_q] - 1'b1; end end else if (begin_spec_i) begin ovf_counter_d[ptr_spec_d] = ovf_counter_q[ptr_spec_q]; end + end else if (bad_spec_i && resolved_type_i == ariane_pkg::Return && ovf_counter_q[ptr_spec_q] != '0) begin + ovf_counter_d[ptr_spec_d] = ovf_counter_q[ptr_spec_q] - 1'b1; end end