From e17128ee85ae4fccf671f168e75cfabf7d3c53c7 Mon Sep 17 00:00:00 2001
From: Alban Gruin <alban.gruin@irit.fr>
Date: Fri, 18 Feb 2022 13:43:20 +0100
Subject: [PATCH] sras: handle unhandled cases wrt. the overflow

Signed-off-by: Alban Gruin <alban.gruin@irit.fr>
---
 src/frontend/frontend.sv | 17 +++++++++--------
 src/frontend/sras.sv     |  7 ++++++-
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/src/frontend/frontend.sv b/src/frontend/frontend.sv
index d0f7b5ca..018573b4 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 e5f7f8b6..a1ca5587 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
 
-- 
GitLab