source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/src/Branch_Target_Buffer_Register_transition.cpp @ 78

Last change on this file since 78 was 78, checked in by rosiere, 16 years ago

Add :

  • Execute_loop (must be test systemC)
  • Prediction
    • Direction : predifined scheme
    • Branch Target Buffer
  • iFetch_unit
    • ifetch_queue
    • pc management
  • Decod_unit
    • coming soon : support for custom operation
  • Rename_unit
    • RAT
    • Free_list
    • Dependence RAW check
    • Load store unit pointer
  • New Environnement (hierarchy_memory will remove in a next version)


Modif :

  • Manage Custom Operation
  • All component in execute_loop to use the new statistics management

Not Finish :

  • Return Address Stack
  • Environnement
File size: 6.9 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id$
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/include/Branch_Target_Buffer_Register.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_front_end {
15namespace front_end {
16namespace prediction_unit {
17namespace branch_target_buffer {
18namespace branch_target_buffer_register {
19
20#undef  FUNCTION
21#define FUNCTION "Branch_Target_Buffer_Register::transition"
22  void Branch_Target_Buffer_Register::transition (void)
23  {
24    log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"Begin");
25
26    if (PORT_READ(in_NRESET) == 0)
27      {
28        for (uint32_t i=0; i<_param->_size_bank; i++)
29          for (uint32_t j=0; j<_param->_associativity; j++)
30            reg_BTB [i][j]._val = false;
31      }
32    else
33      {
34        // =======================================================
35        // =====[ PREDICT ]=======================================
36        // =======================================================
37
38        // =======================================================
39        // =====[ DECOD ]=========================================
40        // =======================================================
41        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
42          if (PORT_READ(in_DECOD_VAL [i]) and internal_DECOD_ACK [i])
43            {
44              bool     hit       = internal_DECOD_HIT      [i];
45//            uint32_t num_bank  = internal_DECOD_NUM_BANK [i];
46//            uint32_t num_entry = (hit)?internal_DECOD_NUM_ENTRY [i]:((_param->_have_port_victim)?PORT_READ(in_DECOD_VICTIM [i]):0);
47
48              // detect new branch !!! insert in branch target buffer
49              if (not hit)
50                {
51                  // =====[ Miss Case ]
52                  uint32_t num_bank  = internal_DECOD_NUM_BANK [i];
53                  uint32_t num_entry = (_param->_have_port_victim)?PORT_READ(in_DECOD_VICTIM [i]):0;
54
55                  // dest_val if not jr or jalr
56                  Tbranch_condition_t cond     = PORT_READ(in_DECOD_CONDITION [i]);
57                  bool                dest_val = not ((cond == BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK) or
58                                                      (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK   ) or
59                                                      (cond == BRANCH_CONDITION_READ_STACK                       ));
60                 
61                  reg_BTB[num_bank][num_entry]._val              = 1;
62                  reg_BTB[num_bank][num_entry]._context          = (_param->_have_port_context_id)?PORT_READ(in_DECOD_CONTEXT_ID [i]):0;
63                  reg_BTB[num_bank][num_entry]._address_src      = PORT_READ(in_DECOD_ADDRESS_SRC  [i]);
64                  reg_BTB[num_bank][num_entry]._address_dest     = PORT_READ(in_DECOD_ADDRESS_DEST [i]);
65                  reg_BTB[num_bank][num_entry]._address_dest_val = dest_val;
66                  reg_BTB[num_bank][num_entry]._condition        = cond;
67                  reg_BTB[num_bank][num_entry]._last_take        = PORT_READ(in_DECOD_LAST_TAKE    [i]);
68                  reg_BTB[num_bank][num_entry]._accurate         = _param->_first_accurate_if_hit;
69                }
70              // else (hit) : no update -> it's not the last result of the branch
71            }
72
73        // =======================================================
74        // =====[ UPDATE ]=========================================
75        // =======================================================
76        for (uint32_t i=0; i<_param->_nb_inst_update; i++)
77          if (PORT_READ(in_UPDATE_VAL [i]) and internal_UPDATE_ACK [i])
78            {
79              bool     hit       = internal_UPDATE_HIT      [i];
80              uint32_t num_bank  = internal_UPDATE_NUM_BANK [i];
81              uint32_t num_entry = (hit)?internal_UPDATE_NUM_ENTRY [i]:((_param->_have_port_victim)?PORT_READ(in_UPDATE_VICTIM [i]):0);
82              bool     miss_pred = PORT_READ(in_UPDATE_MISS_PREDICTION [i]);
83
84              // detect new branch !!! insert in branch target buffer
85              Tcounter_t accurate_new = 0;
86
87              if (hit)
88                {
89                  // =====[ Hit  Case ]
90                  //  * Have destination
91                  //    * if cond == read_register or read_stack : destination valid in commit stage
92                  //    * if cond != read_register or read_stack : destination valid in decod  stage
93                  //    * in all case : is valid in this step
94                  Tcounter_t accurate_old = reg_BTB[num_bank][num_entry]._accurate;
95                  // hit  : increase accurate
96                  // miss : decrease accurate
97                  Tcounter_t accurate_new = (miss_pred)?((accurate_old>0)?(accurate_old-1):accurate_old):((accurate_old<_param->_accurate_max)?(accurate_old+1):accurate_old);
98
99                  // test if accurate go to the threshold
100                  if ((accurate_old >= _param->_accurate_limit) and
101                      (accurate_new <  _param->_accurate_limit))
102                    accurate_new = 0;
103                   
104                //reg_BTB[num_bank][num_entry]._val              : no update because hit
105                //reg_BTB[num_bank][num_entry]._context          : no update because hit
106                //reg_BTB[num_bank][num_entry]._address_src      : no update because hit
107                //reg_BTB[num_bank][num_entry]._condition        : no update because hit
108                }
109              else
110                {
111                  // =====[ Miss Case ]
112                  //reg_BTB[num_bank][num_entry]._val              = 1;
113                  //reg_BTB[num_bank][num_entry]._context          = (_param->_have_port_context_id)?PORT_READ(in_UPDATE_CONTEXT_ID [i]):0;
114                  //reg_BTB[num_bank][num_entry]._address_src      = PORT_READ(in_UPDATE_ADDRESS_SRC  [i]);
115                  //reg_BTB[num_bank][num_entry]._condition        = PORT_READ(in_UPDATE_CONDITION    [i]);
116
117                  accurate_new =  (miss_pred)?_param->_first_accurate_if_miss:_param->_first_accurate_if_hit;
118                }
119
120              // =====[ All Case ]
121              reg_BTB[num_bank][num_entry]._val              = 1;
122              reg_BTB[num_bank][num_entry]._context          = (_param->_have_port_context_id)?PORT_READ(in_UPDATE_CONTEXT_ID [i]):0;
123              reg_BTB[num_bank][num_entry]._address_src      = PORT_READ(in_UPDATE_ADDRESS_SRC  [i]);
124              reg_BTB[num_bank][num_entry]._condition        = PORT_READ(in_UPDATE_CONDITION    [i]);
125
126              reg_BTB[num_bank][num_entry]._address_dest_val = 1;
127              reg_BTB[num_bank][num_entry]._address_dest     = PORT_READ(in_UPDATE_ADDRESS_DEST [i]);
128              reg_BTB[num_bank][num_entry]._last_take        = PORT_READ(in_UPDATE_LAST_TAKE    [i]);
129              reg_BTB[num_bank][num_entry]._accurate         = accurate_new;
130            }
131
132        for (uint32_t i=0; i<_param->_size_bank; i++)
133          for (uint32_t j=0; j<_param->_associativity; j++)
134            log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"[%.4d][%.4d] %d - %.2d %.8x %.1d %.8x %.3d %.1d %.4d", 
135                       i,j,
136                       reg_BTB [i][j]._val             ,
137                       reg_BTB [i][j]._context         ,
138                       reg_BTB [i][j]._address_src     ,
139                       reg_BTB [i][j]._address_dest_val,
140                       reg_BTB [i][j]._address_dest    ,
141                       reg_BTB [i][j]._condition       ,
142                       reg_BTB [i][j]._last_take       ,
143                       reg_BTB [i][j]._accurate        );
144      }
145   
146#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
147    end_cycle ();
148#endif
149
150    log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"End");
151  };
152
153}; // end namespace branch_target_buffer_register
154}; // end namespace branch_target_buffer
155}; // end namespace prediction_unit
156}; // end namespace front_end
157}; // end namespace multi_front_end
158}; // end namespace core
159
160}; // end namespace behavioural
161}; // end namespace morpheo             
162#endif
Note: See TracBrowser for help on using the repository browser.