OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [src_processor/] [mor1kx-5.0/] [rtl/] [verilog/] [mor1kx_branch_predictor_gshare.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
/******************************************************************************
2
 This Source Code Form is subject to the terms of the
3
 Open Hardware Description License, v. 1.0. If a copy
4
 of the OHDL was not distributed with this file, You
5
 can obtain one at http://juliusbaxter.net/ohdl/ohdl.txt
6
 
7
 Description: gshare branch predictor
8
 This predictor is based on array of FSMs with 4 states: strongly not taken,
9
 weakly not taken, weakly taken, strongly taken. Check saturation predictor.
10
 Index to the array of FSMs is built using xor of global history and lower bits of PC.
11
 
12
 Copyright (C) 2016 Alexey Baturo <baturo.alexey@gmail.com>
13
 
14
 ******************************************************************************/
15
 
16
`include "mor1kx-defines.v"
17
 
18
module mor1kx_branch_predictor_gshare
19
  #(
20
    parameter GSHARE_BITS_NUM = 10,
21
    parameter OPTION_OPERAND_WIDTH = 32
22
    )
23
   (
24
    input clk,
25
    input rst,
26
 
27
    // Signals belonging to the stage where the branch is predicted.
28
    output predicted_flag_o,     //result of predictor
29
 
30
    input execute_op_bf_i,       // prev insn was bf
31
    input execute_op_bnf_i,      // prev insn was bnf
32
    input op_bf_i,               // cur insn is bf
33
    input op_bnf_i,              // cur insn is bnf
34
    input padv_decode_i,         // pipeline is moved
35
    input flag_i,                // prev predicted flag
36
 
37
    // Signals belonging to the stage where the branch is resolved.
38
    input prev_op_brcond_i,      // prev op was cond brn
39
    input branch_mispredict_i,    // prev brn was mispredicted
40
 
41
    input [OPTION_OPERAND_WIDTH-1:0]  brn_pc_i
42
    );
43
 
44
   localparam [1:0]
45
      STATE_STRONGLY_NOT_TAKEN = 2'b00,
46
      STATE_WEAKLY_NOT_TAKEN   = 2'b01,
47
      STATE_WEAKLY_TAKEN       = 2'b10,
48
      STATE_STRONGLY_TAKEN     = 2'b11;
49
   localparam FSM_NUM = 2 ** GSHARE_BITS_NUM;
50
 
51
   integer i = 0;
52
 
53
   reg [1:0] state [0:FSM_NUM];
54
   reg [GSHARE_BITS_NUM:0] brn_hist_reg = 0;
55
 
56
   reg [GSHARE_BITS_NUM - 1:0] prev_idx = 0;
57
 
58
   // +2 bits for alignement
59
   wire [GSHARE_BITS_NUM - 1:0] state_index = brn_hist_reg[GSHARE_BITS_NUM - 1:0] ^ brn_pc_i[GSHARE_BITS_NUM + 1:2];
60
 
61
   assign predicted_flag_o = (state[state_index][1] && op_bf_i) ||
62
                             (!state[state_index][1] && op_bnf_i);
63
   wire brn_taken = (execute_op_bf_i && flag_i) || (execute_op_bnf_i && !flag_i);
64
 
65
   always @(posedge clk) begin
66
      if (rst) begin
67
         brn_hist_reg <= 0;
68
         prev_idx <= 0;
69
         for(i = 0; i < FSM_NUM; i = i + 1) begin
70
            state[i] <= STATE_WEAKLY_TAKEN;
71
         end
72
      end else begin
73
         if (op_bf_i || op_bnf_i) begin
74
            // store prev index
75
            prev_idx <= state_index;
76
         end
77
 
78
         if (prev_op_brcond_i && padv_decode_i) begin
79
            brn_hist_reg <= {brn_hist_reg[GSHARE_BITS_NUM - 1 : 0], brn_taken};
80
            if (!brn_taken) begin
81
               // change fsm state:
82
               //   STATE_STRONGLY_TAKEN -> STATE_WEAKLY_TAKEN
83
               //   STATE_WEAKLY_TAKEN -> STATE_WEAKLY_NOT_TAKEN
84
               //   STATE_WEAKLY_NOT_TAKEN -> STATE_STRONGLY_NOT_TAKEN
85
               //   STATE_STRONGLY_NOT_TAKEN -> STATE_STRONGLY_NOT_TAKEN
86
               case (state[prev_idx])
87
                  STATE_STRONGLY_TAKEN:
88
                     state[prev_idx] <= STATE_WEAKLY_TAKEN;
89
                  STATE_WEAKLY_TAKEN:
90
                     state[prev_idx] <= STATE_WEAKLY_NOT_TAKEN;
91
                  STATE_WEAKLY_NOT_TAKEN:
92
                     state[prev_idx] <= STATE_STRONGLY_NOT_TAKEN;
93
                  STATE_STRONGLY_NOT_TAKEN:
94
                     state[prev_idx] <= STATE_STRONGLY_NOT_TAKEN;
95
               endcase
96
            end else begin
97
               // change fsm state:
98
               //   STATE_STRONGLY_NOT_TAKEN -> STATE_WEAKLY_NOT_TAKEN
99
               //   STATE_WEAKLY_NOT_TAKEN -> STATE_WEAKLY_TAKEN
100
               //   STATE_WEAKLY_TAKEN -> STATE_STRONGLY_TAKEN
101
               //   STATE_STRONGLY_TAKEN -> STATE_STRONGLY_TAKEN
102
               case (state[prev_idx])
103
                  STATE_STRONGLY_NOT_TAKEN:
104
                     state[prev_idx] <= STATE_WEAKLY_NOT_TAKEN;
105
                  STATE_WEAKLY_NOT_TAKEN:
106
                     state[prev_idx] <= STATE_WEAKLY_TAKEN;
107
                  STATE_WEAKLY_TAKEN:
108
                     state[prev_idx] <= STATE_STRONGLY_TAKEN;
109
                  STATE_STRONGLY_TAKEN:
110
                     state[prev_idx] <= STATE_STRONGLY_TAKEN;
111
               endcase
112
            end
113
         end
114
      end
115
   end
116
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.