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

Last change on this file since 107 was 107, checked in by rosiere, 15 years ago

1) Fix test in Direction_Glue for Conditionnal Branch
2) Fix Instruction Address Compute

  • Property svn:keywords set to Id
File size: 9.1 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Branch_Target_Buffer_Register_transition.cpp 107 2009-02-10 23:03:25Z 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_begin(Branch_Target_Buffer_Register,FUNCTION);
25    log_function(Branch_Target_Buffer_Register,FUNCTION,_name.c_str());
26
27    if (PORT_READ(in_NRESET) == 0)
28      {
29        for (uint32_t i=0; i<_param->_size_bank; i++)
30          for (uint32_t j=0; j<_param->_associativity; j++)
31            reg_BTB [i][j]._val = false;
32      }
33    else
34      {
35        if (not _param->_have_port_victim)
36          {
37            genMealy_decod  ();
38            genMealy_update ();
39          }
40
41        // =======================================================
42        // =====[ PREDICT ]=======================================
43        // =======================================================
44
45        // =======================================================
46        // =====[ DECOD ]=========================================
47        // =======================================================
48        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
49          if (PORT_READ(in_DECOD_VAL [i]) and internal_DECOD_ACK [i])
50            {
51              bool     hit       = internal_DECOD_HIT      [i];
52//            uint32_t num_bank  = internal_DECOD_NUM_BANK [i];
53//            uint32_t num_entry = (hit)?internal_DECOD_NUM_ENTRY [i]:((_param->_have_port_victim)?PORT_READ(in_DECOD_VICTIM [i]):0);
54
55              // detect new branch !!! insert in branch target buffer
56              if (not hit)
57                {
58                  // =====[ Miss Case ]
59                  uint32_t num_bank  = internal_DECOD_NUM_BANK [i];
60                  uint32_t num_entry = (_param->_have_port_victim)?PORT_READ(in_DECOD_VICTIM [i]):0;
61
62                  // dest_val if not jr or jalr
63                  Tbranch_condition_t cond     = PORT_READ(in_DECOD_CONDITION [i]);
64                  bool                dest_val = not ((cond == BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK) or
65                                                      (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK   ) or
66                                                      (cond == BRANCH_CONDITION_READ_STACK                       ));
67                 
68                  reg_BTB[num_bank][num_entry]._val              = 1;
69                  reg_BTB[num_bank][num_entry]._context          = (_param->_have_port_context_id)?PORT_READ(in_DECOD_CONTEXT_ID [i]):0;
70                  reg_BTB[num_bank][num_entry]._address_src      = PORT_READ(in_DECOD_ADDRESS_SRC  [i]);
71                  reg_BTB[num_bank][num_entry]._address_dest     = PORT_READ(in_DECOD_ADDRESS_DEST [i]);
72                  reg_BTB[num_bank][num_entry]._address_dest_val = dest_val;
73                  reg_BTB[num_bank][num_entry]._condition        = cond;
74                  reg_BTB[num_bank][num_entry]._last_take        = PORT_READ(in_DECOD_LAST_TAKE    [i]);
75                  reg_BTB[num_bank][num_entry]._accurate         = (PORT_READ(in_DECOD_IS_ACCURATE [i]))?_param->_first_accurate_if_hit:_param->_first_accurate_if_miss;
76                }
77              // else (hit) : no update -> it's not the last result of the branch
78            }
79
80        // =======================================================
81        // =====[ UPDATE ]=========================================
82        // =======================================================
83        for (uint32_t i=0; i<_param->_nb_inst_update; i++)
84          if (PORT_READ(in_UPDATE_VAL [i]) and internal_UPDATE_ACK [i])
85            {
86              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"  * UPDATE [%d]",i);
87 
88              bool     hit       = internal_UPDATE_HIT      [i];
89              uint32_t num_bank  = internal_UPDATE_NUM_BANK [i];
90              uint32_t num_entry = (hit)?internal_UPDATE_NUM_ENTRY [i]:((_param->_have_port_victim)?PORT_READ(in_UPDATE_VICTIM [i]):0);
91              bool     miss_pred = PORT_READ(in_UPDATE_MISS_PREDICTION [i]);
92
93              // detect new branch !!! insert in branch target buffer
94              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * hit          : %d",hit);
95              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * miss_pred    : %d",miss_pred);
96              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * num_bank     : %d",num_bank );
97              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * num_entry    : %d",num_entry);
98
99              Tcounter_t accurate_new = 0;
100
101              if (hit)
102                {
103                  // =====[ Hit  Case ]
104                  //  * Have destination
105                  //    * if cond == read_register or read_stack : destination valid in commit stage
106                  //    * if cond != read_register or read_stack : destination valid in decod  stage
107                  //    * in all case : is valid in this step
108                  Tcounter_t accurate_old = reg_BTB[num_bank][num_entry]._accurate;
109
110                  log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * accurate_old : %d",accurate_old);
111
112                  // hit  : increase accurate
113                  // miss : decrease accurate
114                  accurate_new = (miss_pred)?((accurate_old>0)?(accurate_old-1):accurate_old):((accurate_old<_param->_accurate_max)?(accurate_old+1):accurate_old);
115
116                  // test if accurate go to the threshold
117                  if ((accurate_old >= _param->_accurate_limit) and
118                      (accurate_new <  _param->_accurate_limit))
119                    {
120                      log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * decrease downto the accurate_limid (%d)",_param->_accurate_limit);
121                      accurate_new = 0;
122                    }
123                   
124                //reg_BTB[num_bank][num_entry]._val              : no update because hit
125                //reg_BTB[num_bank][num_entry]._context          : no update because hit
126                //reg_BTB[num_bank][num_entry]._address_src      : no update because hit
127                //reg_BTB[num_bank][num_entry]._condition        : no update because hit
128                }
129              else
130                {
131                  // =====[ Miss Case ]
132                  //reg_BTB[num_bank][num_entry]._val              = 1;
133                  //reg_BTB[num_bank][num_entry]._context          = (_param->_have_port_context_id)?PORT_READ(in_UPDATE_CONTEXT_ID [i]):0;
134                  //reg_BTB[num_bank][num_entry]._address_src      = PORT_READ(in_UPDATE_ADDRESS_SRC  [i]);
135                  //reg_BTB[num_bank][num_entry]._condition        = PORT_READ(in_UPDATE_CONDITION    [i]);
136
137                  accurate_new =  (miss_pred)?_param->_first_accurate_if_miss:_param->_first_accurate_if_hit;
138
139//                reg_BTB[num_bank][num_entry]._val              = 1;
140//                reg_BTB[num_bank][num_entry]._context          = (_param->_have_port_context_id)?PORT_READ(in_UPDATE_CONTEXT_ID [i]):0;
141//                reg_BTB[num_bank][num_entry]._address_src      = PORT_READ(in_UPDATE_ADDRESS_SRC  [i]);
142//                reg_BTB[num_bank][num_entry]._condition        = PORT_READ(in_UPDATE_CONDITION    [i]);
143//                reg_BTB[num_bank][num_entry]._last_take        = PORT_READ(in_UPDATE_LAST_TAKE    [i]);
144//                reg_BTB[num_bank][num_entry]._address_dest_val = 0;
145                }
146
147              // =====[ All Case ]
148//            if (reg_BTB[num_bank][num_entry]._address_dest_val == 0)
149//              {
150//                reg_BTB[num_bank][num_entry]._address_dest_val = 1;
151//                reg_BTB[num_bank][num_entry]._address_dest     = PORT_READ(in_UPDATE_ADDRESS_DEST [i]);
152//              }
153
154              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * accurate_new : %d",accurate_new);
155
156              reg_BTB[num_bank][num_entry]._val              = 1;
157              reg_BTB[num_bank][num_entry]._context          = (_param->_have_port_context_id)?PORT_READ(in_UPDATE_CONTEXT_ID [i]):0;
158              reg_BTB[num_bank][num_entry]._address_src      = PORT_READ(in_UPDATE_ADDRESS_SRC  [i]);
159              reg_BTB[num_bank][num_entry]._condition        = PORT_READ(in_UPDATE_CONDITION    [i]);
160              reg_BTB[num_bank][num_entry]._last_take        = PORT_READ(in_UPDATE_LAST_TAKE    [i]);
161              reg_BTB[num_bank][num_entry]._address_dest_val = 1;
162              reg_BTB[num_bank][num_entry]._address_dest     = PORT_READ(in_UPDATE_ADDRESS_DEST [i]);
163              reg_BTB[num_bank][num_entry]._accurate         = accurate_new;
164            }
165
166#if (DEBUG >= DEBUG_TRACE) and DEBUG_Branch_Target_Buffer_Register
167        log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"  * Dump BTB");
168        for (uint32_t i=0; i<_param->_size_bank; i++)
169          for (uint32_t j=0; j<_param->_associativity; j++)
170            log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    [%.4d][%.4d] %d - %.4d %.8x (%.8x) %.1d %.8x (%.8x) %.3d %.1d %.4d", 
171                       i,j,
172                       reg_BTB [i][j]._val             ,
173                       reg_BTB [i][j]._context         ,
174                       reg_BTB [i][j]._address_src     ,
175                       reg_BTB [i][j]._address_src <<2,
176                       reg_BTB [i][j]._address_dest_val,
177                       reg_BTB [i][j]._address_dest    ,
178                       reg_BTB [i][j]._address_dest<<2 ,
179                       reg_BTB [i][j]._condition       ,
180                       reg_BTB [i][j]._last_take       ,
181                       reg_BTB [i][j]._accurate        );
182#endif
183      }
184
185#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
186    end_cycle ();
187#endif
188
189    log_end(Branch_Target_Buffer_Register,FUNCTION);
190  };
191
192}; // end namespace branch_target_buffer_register
193}; // end namespace branch_target_buffer
194}; // end namespace prediction_unit
195}; // end namespace front_end
196}; // end namespace multi_front_end
197}; // end namespace core
198
199}; // end namespace behavioural
200}; // end namespace morpheo             
201#endif
Note: See TracBrowser for help on using the repository browser.