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

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

1) Fix performance
2) add auto generation to SPECINT2000
3) add reset in genMoore and genMealy

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