From 992f1e299a06288d346d27227be06db42c5bf316 Mon Sep 17 00:00:00 2001
From: Alban Gruin <alban.gruin@irit.fr>
Date: Wed, 24 Mar 2021 15:23:14 +0100
Subject: [PATCH] perf_counters: add perf counters to check for SIC violations

Signed-off-by: Alban Gruin <alban.gruin@irit.fr>
---
 include/riscv_pkg.sv     |  8 ++++----
 src/ariane.sv            |  9 ++++++++-
 src/frontend/frontend.sv |  5 ++++-
 src/perf_counters.sv     | 22 ++++++++++++++++++++--
 4 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/include/riscv_pkg.sv b/include/riscv_pkg.sv
index 45809efb..613e47dd 100644
--- a/include/riscv_pkg.sv
+++ b/include/riscv_pkg.sv
@@ -392,10 +392,10 @@ package riscv;
         CSR_MMIS_PREDICT    = 12'hB0E,  // Branch mis-predicted
         CSR_MSB_FULL        = 12'hB0F,  // Scoreboard full
         CSR_MIF_EMPTY       = 12'hB10,  // instruction fetch queue empty
-        CSR_MHPM_COUNTER_17 = 12'hB11,  // reserved
-        CSR_MHPM_COUNTER_18 = 12'hB12,  // reserved
-        CSR_MHPM_COUNTER_19 = 12'hB13,  // reserved
-        CSR_MHPM_COUNTER_20 = 12'hB14,  // reserved
+        CSR_MHPM_COUNTER_17 = 12'hB11,  // SIC / brpending
+        CSR_MHPM_COUNTER_18 = 12'hB12,  // SIC / mempending
+        CSR_MHPM_COUNTER_19 = 12'hB13,  // SIC / LSU blocked by an IF
+        CSR_MHPM_COUNTER_20 = 12'hB14,  // SIC / I$ miss && mempending
         CSR_MHPM_COUNTER_21 = 12'hB15,  // reserved
         CSR_MHPM_COUNTER_22 = 12'hB16,  // reserved
         CSR_MHPM_COUNTER_23 = 12'hB17,  // reserved
diff --git a/src/ariane.sv b/src/ariane.sv
index eaefd779..ddc063c4 100644
--- a/src/ariane.sv
+++ b/src/ariane.sv
@@ -80,6 +80,7 @@ module ariane import ariane_pkg::*; #(
   // IF -> verifier
   // --------------
   logic                     has_mem_access_if_verif;
+  logic                     bsp_if_perf;
 
   // --------------
   // ID <-> ISSUE
@@ -278,6 +279,7 @@ module ariane import ariane_pkg::*; #(
     .fetch_entry_valid_o ( fetch_valid_if_id             ),
     .fetch_entry_ready_i ( fetch_ready_id_if             ),
     .has_mem_access_o    ( has_mem_access_if_verif       ),
+    .branch_speculation_o( bsp_if_perf                   ),
     .*
   );
 
@@ -590,7 +592,12 @@ module ariane import ariane_pkg::*; #(
     .if_empty_i        ( ~fetch_valid_if_id     ),
     .ex_i              ( ex_commit              ),
     .eret_i            ( eret                   ),
-    .resolved_branch_i ( resolved_branch        )
+    .resolved_branch_i ( resolved_branch        ),
+
+    .branch_speculation_i    ( bsp_if_perf                                ),
+    .mempending_i            ( icache_stall_ctrl                          ),
+    .lsu_locked_i            ( 1'b0                                       ),
+    .icache_miss_while_mem_i ( icache_stall_ctrl & icache_miss_cache_perf )
   );
 
   // ------------
diff --git a/src/frontend/frontend.sv b/src/frontend/frontend.sv
index 7b37a788..991db656 100644
--- a/src/frontend/frontend.sv
+++ b/src/frontend/frontend.sv
@@ -45,7 +45,8 @@ module frontend import ariane_pkg::*; #(
   output logic               fetch_entry_valid_o, // instruction in IF is valid
   input  logic               fetch_entry_ready_i, // ID acknowledged this instruction
 
-  output logic               has_mem_access_o
+  output logic               has_mem_access_o,
+  output logic               branch_speculation_o
 );
     // Instruction Cache Registers, from I$
     logic [FETCH_WIDTH-1:0] icache_data_q;
@@ -137,6 +138,8 @@ module frontend import ariane_pkg::*; #(
     // address of the call/return already
     logic bp_valid;
 
+    assign branch_speculation_o = bp_valid;
+
     logic [INSTR_PER_FETCH-1:0] is_branch;
     logic [INSTR_PER_FETCH-1:0] is_call;
     logic [INSTR_PER_FETCH-1:0] is_jump;
diff --git a/src/perf_counters.sv b/src/perf_counters.sv
index 1ddbe2e6..763c4b62 100644
--- a/src/perf_counters.sv
+++ b/src/perf_counters.sv
@@ -39,11 +39,17 @@ module perf_counters import ariane_pkg::*; (
   // from PC Gen
   input  exception_t                              ex_i,
   input  logic                                    eret_i,
-  input  bp_resolve_t                             resolved_branch_i
+  input  bp_resolve_t                             resolved_branch_i,
+
+  // SIC
+  input logic branch_speculation_i,
+  input logic mempending_i,
+  input logic lsu_locked_i,
+  input logic icache_miss_while_mem_i
 );
   localparam logic [6:0] RegOffset = riscv::CSR_ML1_ICACHE_MISS >> 5;
 
-  logic [riscv::CSR_MIF_EMPTY : riscv::CSR_ML1_ICACHE_MISS][riscv::XLEN-1:0] perf_counter_d, perf_counter_q;
+  logic [riscv::CSR_MHPM_COUNTER_20 : riscv::CSR_ML1_ICACHE_MISS][riscv::XLEN-1:0] perf_counter_d, perf_counter_q;
 
   always_comb begin : perf_counters
     perf_counter_d = perf_counter_q;
@@ -66,6 +72,18 @@ module perf_counters import ariane_pkg::*; (
       if (dtlb_miss_i)
         perf_counter_d[riscv::CSR_MDTLB_MISS] = perf_counter_q[riscv::CSR_MDTLB_MISS] + 1'b1;
 
+      if (branch_speculation_i)
+        perf_counter_d[riscv::CSR_MHPM_COUNTER_17] = perf_counter_q[riscv::CSR_MHPM_COUNTER_17] + 1'b1;
+
+      if (mempending_i)
+        perf_counter_d[riscv::CSR_MHPM_COUNTER_18] = perf_counter_q[riscv::CSR_MHPM_COUNTER_18] + 1'b1;
+
+      if (lsu_locked_i)
+        perf_counter_d[riscv::CSR_MHPM_COUNTER_19] = perf_counter_q[riscv::CSR_MHPM_COUNTER_19] + 1'b1;
+
+      if (icache_miss_while_mem_i)
+        perf_counter_d[riscv::CSR_MHPM_COUNTER_20] = perf_counter_q[riscv::CSR_MHPM_COUNTER_20] + 1'b1;
+
       // instruction related perf counters
       for (int unsigned i = 0; i < NR_COMMIT_PORTS-1; i++) begin
         if (commit_ack_i[i]) begin
-- 
GitLab