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_genMealy_predict.cpp @ 108

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

1) decod_queue : add reg_LAST_SLOT.
2) Commit : insert on event -> to pop decod_queue. Head test : add information (speculative or not)
3) Context State / UPT : Branch miss and Load miss in same cycle.
4) Free List : Bank is on LSB not MSB.
5) Platforms : move data

  • Property svn:keywords set to Id
File size: 3.3 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Branch_Target_Buffer_Register_genMealy_predict.cpp 108 2009-02-12 11:55:06Z 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::genMealy_predict"
22  void Branch_Target_Buffer_Register::genMealy_predict (void)
23  {
24    log_begin(Branch_Target_Buffer_Register,FUNCTION);
25    log_function(Branch_Target_Buffer_Register,FUNCTION,_name.c_str());
26   
27    for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
28      {
29        log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"  * PREDICT [%d]",i);
30        Tcontext_t      context   = (_param->_have_port_context_id)?PORT_READ(in_PREDICT_CONTEXT_ID  [i]):0;
31        Tgeneral_data_t address   = PORT_READ(in_PREDICT_ADDRESS [i]);
32        uint32_t        num_bank  = (address>>_param->_shift_bank)&_param->_mask_bank;
33
34        Tgeneral_data_t address_tag    =  address >> _param->_shift_tag    ;
35        Tgeneral_data_t address_offset = (address >> _param->_shift_offset)&_param->_mask_offset;
36
37        log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * address_    (tag, bank, offset) : %.8x %.8x %.8x",address_tag,num_bank, address_offset);
38
39        for (uint32_t j=0; j<_param->_associativity; j++)
40          {
41            Tgeneral_data_t address_src_tag    =  reg_BTB[num_bank][j]._address_src >> _param->_shift_tag    ;
42            Tgeneral_data_t address_src_offset = (reg_BTB[num_bank][j]._address_src >> _param->_shift_offset)&_param->_mask_offset;
43
44            Tcontrol_t hit = ((reg_BTB[num_bank][j]._val         == 1             ) and
45                              (reg_BTB[num_bank][j]._context     == context       ) and
46                              (address_src_tag                   == address_tag   ) and
47                              //address_bank is the same
48                              (address_src_offset                >= address_offset));
49
50            log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * address_src (tag, bank, offset) : %.8x %.8x %.8x - hit : %d",address_src_tag,num_bank,address_src_offset, hit);
51
52            // Hit :
53            //  * entry is valid
54            //  * context is the same
55            //  * address_src must be higher that the address, because the address lower is previous the current pc.
56            //  * prediction is no accurate is address_dest is not valid.
57            PORT_WRITE(out_PREDICT_HIT          [i][j],hit);
58            PORT_WRITE(out_PREDICT_ADDRESS_SRC  [i][j],reg_BTB[num_bank][j]._address_src );
59            PORT_WRITE(out_PREDICT_ADDRESS_DEST [i][j],reg_BTB[num_bank][j]._address_dest);
60            PORT_WRITE(out_PREDICT_CONDITION    [i][j],reg_BTB[num_bank][j]._condition   );
61            PORT_WRITE(out_PREDICT_LAST_TAKE    [i][j],reg_BTB[num_bank][j]._last_take   );
62            PORT_WRITE(out_PREDICT_IS_ACCURATE  [i][j],((reg_BTB[num_bank][j]._accurate >= _param->_accurate_limit) and
63                                                        (reg_BTB[num_bank][j]._address_dest_val == 1)));
64          }
65      }
66
67    log_end(Branch_Target_Buffer_Register,FUNCTION);
68  };
69
70}; // end namespace branch_target_buffer_register
71}; // end namespace branch_target_buffer
72}; // end namespace prediction_unit
73}; // end namespace front_end
74}; // end namespace multi_front_end
75}; // end namespace core
76
77}; // end namespace behavioural
78}; // end namespace morpheo             
79#endif
Note: See TracBrowser for help on using the repository browser.