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 @ 82

Last change on this file since 82 was 82, checked in by rosiere, 16 years ago
  • support locale (now must "just" translate)
  • update all component with new test format
  • update all component with usage
  • New component : decod queue and prediction_unit
  • Property svn:keywords set to Id
File size: 7.1 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Branch_Target_Buffer_Register_transition.cpp 82 2008-05-01 16:48:45Z rosiere $
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        if (not _param->_have_port_victim)
35          {
36            genMealy_decod  ();
37            genMealy_update ();
38          }
39
40        // =======================================================
41        // =====[ PREDICT ]=======================================
42        // =======================================================
43
44        // =======================================================
45        // =====[ DECOD ]=========================================
46        // =======================================================
47        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
48          if (PORT_READ(in_DECOD_VAL [i]) and internal_DECOD_ACK [i])
49            {
50              bool     hit       = internal_DECOD_HIT      [i];
51//            uint32_t num_bank  = internal_DECOD_NUM_BANK [i];
52//            uint32_t num_entry = (hit)?internal_DECOD_NUM_ENTRY [i]:((_param->_have_port_victim)?PORT_READ(in_DECOD_VICTIM [i]):0);
53
54              // detect new branch !!! insert in branch target buffer
55              if (not hit)
56                {
57                  // =====[ Miss Case ]
58                  uint32_t num_bank  = internal_DECOD_NUM_BANK [i];
59                  uint32_t num_entry = (_param->_have_port_victim)?PORT_READ(in_DECOD_VICTIM [i]):0;
60
61                  // dest_val if not jr or jalr
62                  Tbranch_condition_t cond     = PORT_READ(in_DECOD_CONDITION [i]);
63                  bool                dest_val = not ((cond == BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK) or
64                                                      (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK   ) or
65                                                      (cond == BRANCH_CONDITION_READ_STACK                       ));
66                 
67                  reg_BTB[num_bank][num_entry]._val              = 1;
68                  reg_BTB[num_bank][num_entry]._context          = (_param->_have_port_context_id)?PORT_READ(in_DECOD_CONTEXT_ID [i]):0;
69                  reg_BTB[num_bank][num_entry]._address_src      = PORT_READ(in_DECOD_ADDRESS_SRC  [i]);
70                  reg_BTB[num_bank][num_entry]._address_dest     = PORT_READ(in_DECOD_ADDRESS_DEST [i]);
71                  reg_BTB[num_bank][num_entry]._address_dest_val = dest_val;
72                  reg_BTB[num_bank][num_entry]._condition        = cond;
73                  reg_BTB[num_bank][num_entry]._last_take        = PORT_READ(in_DECOD_LAST_TAKE    [i]);
74                  reg_BTB[num_bank][num_entry]._accurate         = (PORT_READ(in_DECOD_IS_ACCURATE [i]))?_param->_first_accurate_if_hit:_param->_first_accurate_if_miss;
75                }
76              // else (hit) : no update -> it's not the last result of the branch
77            }
78
79        // =======================================================
80        // =====[ UPDATE ]=========================================
81        // =======================================================
82        for (uint32_t i=0; i<_param->_nb_inst_update; i++)
83          if (PORT_READ(in_UPDATE_VAL [i]) and internal_UPDATE_ACK [i])
84            {
85              bool     hit       = internal_UPDATE_HIT      [i];
86              uint32_t num_bank  = internal_UPDATE_NUM_BANK [i];
87              uint32_t num_entry = (hit)?internal_UPDATE_NUM_ENTRY [i]:((_param->_have_port_victim)?PORT_READ(in_UPDATE_VICTIM [i]):0);
88              bool     miss_pred = PORT_READ(in_UPDATE_MISS_PREDICTION [i]);
89
90              // detect new branch !!! insert in branch target buffer
91              Tcounter_t accurate_new = 0;
92
93              if (hit)
94                {
95                  // =====[ Hit  Case ]
96                  //  * Have destination
97                  //    * if cond == read_register or read_stack : destination valid in commit stage
98                  //    * if cond != read_register or read_stack : destination valid in decod  stage
99                  //    * in all case : is valid in this step
100                  Tcounter_t accurate_old = reg_BTB[num_bank][num_entry]._accurate;
101                  // hit  : increase accurate
102                  // miss : decrease accurate
103                  Tcounter_t accurate_new = (miss_pred)?((accurate_old>0)?(accurate_old-1):accurate_old):((accurate_old<_param->_accurate_max)?(accurate_old+1):accurate_old);
104
105                  // test if accurate go to the threshold
106                  if ((accurate_old >= _param->_accurate_limit) and
107                      (accurate_new <  _param->_accurate_limit))
108                    accurate_new = 0;
109                   
110                //reg_BTB[num_bank][num_entry]._val              : no update because hit
111                //reg_BTB[num_bank][num_entry]._context          : no update because hit
112                //reg_BTB[num_bank][num_entry]._address_src      : no update because hit
113                //reg_BTB[num_bank][num_entry]._condition        : no update because hit
114                }
115              else
116                {
117                  // =====[ Miss Case ]
118                  //reg_BTB[num_bank][num_entry]._val              = 1;
119                  //reg_BTB[num_bank][num_entry]._context          = (_param->_have_port_context_id)?PORT_READ(in_UPDATE_CONTEXT_ID [i]):0;
120                  //reg_BTB[num_bank][num_entry]._address_src      = PORT_READ(in_UPDATE_ADDRESS_SRC  [i]);
121                  //reg_BTB[num_bank][num_entry]._condition        = PORT_READ(in_UPDATE_CONDITION    [i]);
122
123                  accurate_new =  (miss_pred)?_param->_first_accurate_if_miss:_param->_first_accurate_if_hit;
124
125                  reg_BTB[num_bank][num_entry]._val              = 1;
126                  reg_BTB[num_bank][num_entry]._context          = (_param->_have_port_context_id)?PORT_READ(in_UPDATE_CONTEXT_ID [i]):0;
127                  reg_BTB[num_bank][num_entry]._address_src      = PORT_READ(in_UPDATE_ADDRESS_SRC  [i]);
128                  reg_BTB[num_bank][num_entry]._condition        = PORT_READ(in_UPDATE_CONDITION    [i]);
129                  reg_BTB[num_bank][num_entry]._last_take        = PORT_READ(in_UPDATE_LAST_TAKE    [i]);
130                }
131
132              // =====[ All Case ]
133              if (reg_BTB[num_bank][num_entry]._address_dest_val == 0)
134                {
135                  reg_BTB[num_bank][num_entry]._address_dest_val = 1;
136                  reg_BTB[num_bank][num_entry]._address_dest     = PORT_READ(in_UPDATE_ADDRESS_DEST [i]);
137                }
138              reg_BTB[num_bank][num_entry]._accurate         = accurate_new;
139            }
140
141        for (uint32_t i=0; i<_param->_size_bank; i++)
142          for (uint32_t j=0; j<_param->_associativity; j++)
143            log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"[%.4d][%.4d] %d - %.2d %.8x %.1d %.8x %.3d %.1d %.4d", 
144                       i,j,
145                       reg_BTB [i][j]._val             ,
146                       reg_BTB [i][j]._context         ,
147                       reg_BTB [i][j]._address_src     ,
148                       reg_BTB [i][j]._address_dest_val,
149                       reg_BTB [i][j]._address_dest    ,
150                       reg_BTB [i][j]._condition       ,
151                       reg_BTB [i][j]._last_take       ,
152                       reg_BTB [i][j]._accurate        );
153      }
154   
155#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
156    end_cycle ();
157#endif
158
159    log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"End");
160  };
161
162}; // end namespace branch_target_buffer_register
163}; // end namespace branch_target_buffer
164}; // end namespace prediction_unit
165}; // end namespace front_end
166}; // end namespace multi_front_end
167}; // end namespace core
168
169}; // end namespace behavioural
170}; // end namespace morpheo             
171#endif
Note: See TracBrowser for help on using the repository browser.