From 65e9747752eeeaa6c709b37eb6aa5c28185ccc99 Mon Sep 17 00:00:00 2001
From: Shreya Sanghai <ssanghai@hmc.edu>
Date: Wed, 31 Mar 2021 21:56:14 -0400
Subject: [PATCH 1/3] fixed bugs in global history to read latest GHRE

---
 wally-pipelined/config/rv64BP/wally-config.vh     | 2 +-
 wally-pipelined/src/ifu/globalHistoryPredictor.sv | 9 +++++----
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/wally-pipelined/config/rv64BP/wally-config.vh b/wally-pipelined/config/rv64BP/wally-config.vh
index bd053750c..f39c6cee3 100644
--- a/wally-pipelined/config/rv64BP/wally-config.vh
+++ b/wally-pipelined/config/rv64BP/wally-config.vh
@@ -97,5 +97,5 @@
 
 `define TWO_BIT_PRELOAD "../config/rv64icfd/twoBitPredictor.txt"
 `define BTB_PRELOAD "../config/rv64icfd/BTBPredictor.txt"
-`define BPTYPE "BPGSHARE" // BPGLOBAL or BPTWOBIT or BPGSHARE
+`define BPTYPE "BPGLOBAL" // BPGLOBAL or BPTWOBIT or BPGSHARE
 `define TESTSBP 1
diff --git a/wally-pipelined/src/ifu/globalHistoryPredictor.sv b/wally-pipelined/src/ifu/globalHistoryPredictor.sv
index b9addb381..babafb525 100644
--- a/wally-pipelined/src/ifu/globalHistoryPredictor.sv
+++ b/wally-pipelined/src/ifu/globalHistoryPredictor.sv
@@ -41,12 +41,13 @@ module globalHistoryPredictor
    input logic [1:0] 	   UpdatePrediction
    
    );
-   logic [k-1:0] GHRF, GHRD, GHRE;
+   logic [k-1:0] GHRF, GHRD, GHRE, GHRENext;
+   assign GHRENext = {PCSrcE, GHRE[k-1:1]}; 
 
     flopenr #(k) GlobalHistoryRegister(.clk(clk),
             .reset(reset),
             .en(UpdateEN),
-            .d({PCSrcE, GHRF[k-1:1] }),
+            .d(GHRENext),
             .q(GHRF));
 
 
@@ -66,8 +67,8 @@ module globalHistoryPredictor
 				.reset(reset),
 				.RA1(GHRF),
 				.RD1(PredictionMemory),
-				.REN1(1'b1),
-				.WA1(GHRE),
+				.REN1(~StallF),
+				.WA1(GHRENext),
 				.WD1(UpdatePrediction),
 				.WEN1(UpdateEN),
 				.BitWEN1(2'b11));

From e33007e30e1418584d8013ffa9a0acea53530a76 Mon Sep 17 00:00:00 2001
From: ShreyaSanghai <ssanghai@hmc.edu>
Date: Thu, 1 Apr 2021 22:22:40 +0530
Subject: [PATCH 2/3] added localHistoryPredictor

---
 .../src/ifu/globalHistoryPredictor.sv         |   9 +-
 .../src/ifu/localHistoryPredictor.sv          | 138 ++++++++++++++++++
 2 files changed, 141 insertions(+), 6 deletions(-)
 create mode 100644 wally-pipelined/src/ifu/localHistoryPredictor.sv

diff --git a/wally-pipelined/src/ifu/globalHistoryPredictor.sv b/wally-pipelined/src/ifu/globalHistoryPredictor.sv
index babafb525..1fd0720fc 100644
--- a/wally-pipelined/src/ifu/globalHistoryPredictor.sv
+++ b/wally-pipelined/src/ifu/globalHistoryPredictor.sv
@@ -37,7 +37,7 @@ module globalHistoryPredictor
    output logic [1:0] 	   Prediction,
    // update
    input logic [`XLEN-1:0] UpdatePC,
-   input logic 		   UpdateEN, PCSrcE, /// *** need to add as input from bpred.sv 
+   input logic 		   UpdateEN, PCSrcE, 
    input logic [1:0] 	   UpdatePrediction
    
    );
@@ -55,11 +55,8 @@ module globalHistoryPredictor
   logic [1:0] 		   PredictionMemory;
   logic 		   DoForwarding, DoForwardingF;
   logic [1:0] 		   UpdatePredictionF;
-  
-  // for gshare xor the PC with the GHR 
-  // TODO: change in sram memory2 module
-  // assign UpdatePCIndex = GHRE ^ UpdatePC;
-  //  assign LookUpPCIndex = LookUpPC ^ GHR;  
+ 
+
   // Make Prediction by reading the correct address in the PHT and also update the new address in the PHT 
   // GHR referes to the address that the past k branches points to in the prediction stage 
   // GHRE refers to the address that the past k branches points to in the exectution stage
diff --git a/wally-pipelined/src/ifu/localHistoryPredictor.sv b/wally-pipelined/src/ifu/localHistoryPredictor.sv
new file mode 100644
index 000000000..85f413572
--- /dev/null
+++ b/wally-pipelined/src/ifu/localHistoryPredictor.sv
@@ -0,0 +1,138 @@
+///////////////////////////////////////////
+// locallHistoryPredictor.sv
+//
+// Written: Shreya Sanghai
+// Email: ssanghai@hmc.edu
+// Created: March 16, 2021
+// Modified: 
+//
+// Purpose: Global History Branch predictor with parameterized global history register
+// 
+// A component of the Wally configurable RISC-V project.
+// 
+// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, 
+// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software 
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 
+// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 
+// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+///////////////////////////////////////////
+
+`include "wally-config.vh"
+
+module localHistoryPredictor
+  #(  parameter int m = 6, // 2^m = number of local history branches
+      parameter int k = 10 // number of past branches stored
+    )
+  (input logic clk,
+   input logic 		   reset,
+   input logic 		    StallF, StallD, StallE, FlushF, FlushD, FlushE,
+   input logic [`XLEN-1:0] LookUpPC,
+   output logic [1:0] 	   Prediction,
+   // update
+   input logic [`XLEN-1:0] UpdatePC,
+   input logic 		   UpdateEN, PCSrcE, 
+   input logic [1:0] 	   UpdatePrediction
+   
+   );
+
+   logic [2**m-1:0][k-1:0] LHRNextF;
+   logic [k-1:0]       LHRD, LHRE, LHRENext, ForwardLHRNext;
+   logic [m-1:0] 	   LookUpPCIndex, UpdatePCIndex;
+   logic [1:0] 		   PredictionMemory;
+   logic 		   DoForwarding, DoForwardingF, DoForwardingPHT, DoForwardingPHTF;
+   logic [1:0] 		   UpdatePredictionF;
+
+   assign LHRENext = {PCSrcE, LHRE[k-1:1]}; 
+   assign UpdatePCIndex = {UpdatePC[m+1] ^ UpdatePC[1], UpdatePC[m:2]};
+   assign LookUpPCIndex = {LookUpPC[m+1] ^ LookUpPC[1], LookUpPC[m:2]};  
+
+// INCASE we do ahead pipelining
+//    SRAM2P1R1W #(m,k) LHR(.clk(clk)),
+//                 .reset(reset),
+//                 .RA1(LookUpPCIndex), // need hashing function to get correct PC address 
+//                 .RD1(LHRF),
+//                 .REN1(~StallF),
+//                 .WA1(UpdatePCIndex),
+//                 .WD1(LHRENExt),
+//                 .WEN1(UpdateEN),
+//                 .BitWEN1(2'b11));  
+
+genvar index;
+generate
+    for (index = 0; index < 2**m; index = index +1) begin:index
+      
+        flopenr #(k) LocalHistoryRegister(.clk(clk),
+                .reset(reset),
+                .en(UpdateEN && (index == UpdatePCIndex)),
+                .d(LHRENext),
+                .q(LHRNextF[index]));
+    end 
+endgenerate
+
+// need to forward when updating to the same address as reading.
+// first we compare to see if the update and lookup addreses are the same
+assign DoForwarding = LookUpPCIndex == UpdatePCIndex;
+assign ForwardLHRNext = DoForwarding ? LHRENext :LHRNextF[LookUpPCIndex]; 
+
+  // Make Prediction by reading the correct address in the PHT and also update the new address in the PHT 
+  // LHR referes to the address that the past k branches points to in the prediction stage 
+  // LHRE refers to the address that the past k branches points to in the exectution stage
+    SRAM2P1R1W #(k, 2) PHT(.clk(clk), 
+				.reset(reset),
+				.RA1(ForwardLHRNext),
+				.RD1(PredictionMemory),
+				.REN1(~StallF),
+				.WA1(LHRENext),
+				.WD1(UpdatePrediction),
+				.WEN1(UpdateEN),
+				.BitWEN1(2'b11));
+
+
+  
+assign DoForwardingPHT = LHRENext == ForwardLHRNext; 
+
+  // register the update value and the forwarding signal into the Fetch stage
+  // TODO: add stall logic ***
+  flopr #(1) DoForwardingReg(.clk(clk),
+			     .reset(reset),
+			     .d(DoForwardingPHT),
+			     .q(DoForwardingPHTF));
+  
+  flopr #(2) UpdatePredictionReg(.clk(clk),
+				 .reset(reset),
+				 .d(UpdatePrediction),
+				 .q(UpdatePredictionF));
+
+  assign Prediction = DoForwardingPHTF ? UpdatePredictionF : PredictionMemory;
+  
+  //pipeline for LHR
+  flopenrc #(k) LHRFReg(.clk(clk),
+      .reset(reset),
+      .en(~StallF),
+      .clear(FlushF),
+      .d(ForwardLHRNext),
+      .q(LHRF));
+
+  flopenrc #(k) LHRDReg(.clk(clk),
+        .reset(reset),
+        .en(~StallD),
+        .clear(FlushD),
+        .d(LHRF),
+        .q(LHRD));
+    
+   flopenrc #(k) LHREReg(.clk(clk),
+        .reset(reset),
+        .en(~StallE),
+        .clear(FlushE),
+        .d(LHRD),
+        .q(LHRE));
+
+endmodule

From bf3f4ff5b25ec2d611239d08b9f9107c1f6a97a5 Mon Sep 17 00:00:00 2001
From: Shreya Sanghai <ssanghai@hmc.edu>
Date: Thu, 1 Apr 2021 13:40:08 -0400
Subject: [PATCH 3/3] fixed minor bugs in localHistory

---
 wally-pipelined/config/rv32ic/wally-config.vh    |  2 +-
 wally-pipelined/config/rv64ic/wally-config.vh    |  2 +-
 wally-pipelined/config/rv64icfd/wally-config.vh  |  2 +-
 wally-pipelined/src/ifu/bpred.sv                 | 13 +++++++++++++
 wally-pipelined/src/ifu/localHistoryPredictor.sv |  4 ++--
 5 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/wally-pipelined/config/rv32ic/wally-config.vh b/wally-pipelined/config/rv32ic/wally-config.vh
index fadbe36c6..f369c19bc 100644
--- a/wally-pipelined/config/rv32ic/wally-config.vh
+++ b/wally-pipelined/config/rv32ic/wally-config.vh
@@ -94,5 +94,5 @@
 
 `define TWO_BIT_PRELOAD "../config/rv32ic/twoBitPredictor.txt"
 `define BTB_PRELOAD "../config/rv32ic/BTBPredictor.txt"
-`define BPTYPE "BPGSHARE" // BPGLOBAL or BPTWOBIT or BPGSHARE
+`define BPTYPE "BPLOCALPAg" // BPGLOBAL or BPTWOBIT or BPGSHARE
 `define TESTSBP 0
diff --git a/wally-pipelined/config/rv64ic/wally-config.vh b/wally-pipelined/config/rv64ic/wally-config.vh
index b27a5e1c6..9cfb5a8e5 100644
--- a/wally-pipelined/config/rv64ic/wally-config.vh
+++ b/wally-pipelined/config/rv64ic/wally-config.vh
@@ -97,5 +97,5 @@
 
 `define TWO_BIT_PRELOAD "../config/rv64ic/twoBitPredictor.txt"
 `define BTB_PRELOAD "../config/rv64ic/BTBPredictor.txt"
-`define BPTYPE "BPGSHARE" // BPGLOBAL or BPTWOBIT or BPGSHARE
+`define BPTYPE "BPLOCALPAg" // BPGLOBAL or BPTWOBIT or BPGSHARE
 `define TESTSBP 0
diff --git a/wally-pipelined/config/rv64icfd/wally-config.vh b/wally-pipelined/config/rv64icfd/wally-config.vh
index 853b86855..6ea013d96 100644
--- a/wally-pipelined/config/rv64icfd/wally-config.vh
+++ b/wally-pipelined/config/rv64icfd/wally-config.vh
@@ -97,5 +97,5 @@
 
 `define TWO_BIT_PRELOAD "../config/rv64icfd/twoBitPredictor.txt"
 `define BTB_PRELOAD "../config/rv64icfd/BTBPredictor.txt"
-`define BPTYPE "BPGSHARE" // BPGLOBAL or BPTWOBIT or BPGSHARE
+`define BPTYPE "BPGLOBAL" // BPGLOBAL or BPTWOBIT or BPGSHARE
 `define TESTSBP 0
diff --git a/wally-pipelined/src/ifu/bpred.sv b/wally-pipelined/src/ifu/bpred.sv
index a96d43536..56ee1624e 100644
--- a/wally-pipelined/src/ifu/bpred.sv
+++ b/wally-pipelined/src/ifu/bpred.sv
@@ -104,6 +104,19 @@ module bpred
 				   .PCSrcE(PCSrcE),
 				   .UpdatePrediction(UpdateBPPredE));
     end 
+    else if (`BPTYPE == "BPLOCALPAg") begin:Predictor
+
+      localHistoryPredictor DirPredictor(.clk(clk),
+				   .reset(reset),
+				   .*, // Stalls and flushes
+				   .LookUpPC(PCNextF),
+				   .Prediction(BPPredF),
+				   // update
+				   .UpdatePC(PCE),
+				   .UpdateEN(InstrClassE[0] & ~StallE),
+				   .PCSrcE(PCSrcE),
+				   .UpdatePrediction(UpdateBPPredE));
+    end 
   endgenerate
 
 
diff --git a/wally-pipelined/src/ifu/localHistoryPredictor.sv b/wally-pipelined/src/ifu/localHistoryPredictor.sv
index 85f413572..ef33bbc81 100644
--- a/wally-pipelined/src/ifu/localHistoryPredictor.sv
+++ b/wally-pipelined/src/ifu/localHistoryPredictor.sv
@@ -44,7 +44,7 @@ module localHistoryPredictor
    );
 
    logic [2**m-1:0][k-1:0] LHRNextF;
-   logic [k-1:0]       LHRD, LHRE, LHRENext, ForwardLHRNext;
+   logic [k-1:0]       LHRF, LHRD, LHRE, LHRENext, ForwardLHRNext;
    logic [m-1:0] 	   LookUpPCIndex, UpdatePCIndex;
    logic [1:0] 		   PredictionMemory;
    logic 		   DoForwarding, DoForwardingF, DoForwardingPHT, DoForwardingPHTF;
@@ -67,7 +67,7 @@ module localHistoryPredictor
 
 genvar index;
 generate
-    for (index = 0; index < 2**m; index = index +1) begin:index
+    for (index = 0; index < 2**m; index = index +1) begin
       
         flopenr #(k) LocalHistoryRegister(.clk(clk),
                 .reset(reset),