source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_genMealy_branch_complete.cpp @ 145

Last change on this file since 145 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

File size: 6.4 KB
RevLine 
[81]1#ifdef SYSTEMC
2/*
3 * $Id$
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/include/Update_Prediction_Table.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_front_end {
15namespace front_end {
16namespace prediction_unit {
17namespace update_prediction_table {
18
19
20#undef  FUNCTION
21#define FUNCTION "Update_Prediction_Table::genMealy_branch_complete"
22  void Update_Prediction_Table::genMealy_branch_complete (void)
23  {
[88]24    log_begin(Update_Prediction_Table,FUNCTION);
25    log_function(Update_Prediction_Table,FUNCTION,_name.c_str());
[123]26
27    if (PORT_READ(in_NRESET))
28      {
[81]29    for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++)
[88]30#ifdef DEBUG_TEST
31      // just to don't have exception in not transaction
32      if (PORT_READ(in_BRANCH_COMPLETE_VAL [i]))
33#endif
[81]34      {
[88]35        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * BRANCH_COMPLETE [%d]",i);
36
[122]37        // Read information
38        Tcontext_t          context     = (_param->_have_port_context_id)?PORT_READ(in_BRANCH_COMPLETE_CONTEXT_ID [i]):0;
39        Tdepth_t            depth       = (_param->_have_port_depth     )?PORT_READ(in_BRANCH_COMPLETE_DEPTH      [i]):0;
40        Tcontrol_t          miss        = false; // init
41        Tcontrol_t          take        = reg_UPDATE_PREDICTION_TABLE [context][depth]._last_take   ;
42        Taddress_t          addr_dest   = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest;
43        Tbranch_condition_t condition   = reg_UPDATE_PREDICTION_TABLE [context][depth]._condition   ;
[81]44
[98]45        Tcontrol_t          no_sequence = PORT_READ(in_BRANCH_COMPLETE_NO_SEQUENCE [i]);
[122]46        Taddress_t          addr_good   = PORT_READ(in_BRANCH_COMPLETE_ADDRESS [i]);
[88]47
48        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * context        : %d",context);
49        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * depth          : %d",depth  );
50        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * condition      : %s",toString(condition).c_str());
[98]51        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * no_sequence    : %d",no_sequence);
[88]52        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * address_good   : %.8x",addr_good);
53
54        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * (before)");
55        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * miss         : %d",miss);
56        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * take         : %d",take);
57        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * address_dest : %.8x",addr_dest);
58
[122]59        // Test branch condition
[81]60        switch (condition)
61          {
62          case BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK          : // l.j
63          case BRANCH_CONDITION_NONE_WITH_WRITE_STACK             : // l.jal
64            {
65              //miss      : always hit
[88]66              //addr_dest : compute in decod stage
[94]67              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK");
68              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * BRANCH_CONDITION_NONE_WITH_WRITE_STACK   ");
[88]69
70#ifdef DEBUG_TEST
71              if (take != 1)
72                throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad direction.",i,toString(condition).c_str()));
[97]73//               if (addr_dest != addr_good)
74//                 throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad destination address.",i,toString(condition).c_str()));
[88]75#endif
76
[81]77              break;
78            }
79          case BRANCH_CONDITION_FLAG_UNSET                        : // l.bnf
80          case BRANCH_CONDITION_FLAG_SET                          : // l.bf
81            {
[88]82              //addr_dest : compute in decod stage
83              //miss if the direction is bad
[98]84              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * BRANCH_CONDITION_FLAG");
[94]85
[98]86              Tcontrol_t take_good = no_sequence;
[88]87
[81]88              miss = (take != take_good);
89              take = take_good;
90
[88]91#ifdef DEBUG_TEST
[97]92//               if (addr_dest != addr_good)
93//                 throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad destination address.",i,toString(condition).c_str()));
[88]94#endif
95
[81]96              break;
97            }
98          case BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK : // l.jr (rb!=r9)
99          case BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK    : // l.jalr
100          case BRANCH_CONDITION_READ_STACK                        : // l.jr (rb==r9)
101            {
[94]102              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK");
103              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK   ");
104              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * BRANCH_CONDITION_READ_STACK                       ");
105
[88]106              // miss if destination address is bad
107              miss      = (addr_dest != addr_good);
[81]108              addr_dest = addr_good;
[88]109
110#ifdef DEBUG_TEST
111              if (take != 1)
112                throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad direction.",i,toString(condition).c_str()));
113#endif
114             
[81]115              break;
116            }
117          }
118
[88]119        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * (after)");
120        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * miss         : %d",miss);
121        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * take         : %d",take);
122        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * address_dest : %.8x",addr_dest);
123       
[81]124        internal_BRANCH_COMPLETE_MISS_PREDICTION [i] = miss     ;
125        internal_BRANCH_COMPLETE_TAKE            [i] = take     ;
126        internal_BRANCH_COMPLETE_ADDRESS_DEST    [i] = addr_dest;
[88]127       
[81]128        PORT_WRITE(out_BRANCH_COMPLETE_MISS_PREDICTION [i], internal_BRANCH_COMPLETE_MISS_PREDICTION [i]);
[111]129//      PORT_WRITE(out_BRANCH_COMPLETE_TAKE            [i], internal_BRANCH_COMPLETE_TAKE            [i]);
130//      PORT_WRITE(out_BRANCH_COMPLETE_ADDRESS_SRC     [i], reg_UPDATE_PREDICTION_TABLE [context][depth]._address_src);
131//      PORT_WRITE(out_BRANCH_COMPLETE_ADDRESS_DEST    [i], internal_BRANCH_COMPLETE_ADDRESS_DEST    [i]);
[81]132      }
[123]133      }
[88]134    log_end(Update_Prediction_Table,FUNCTION);
[81]135  };
136
137}; // end namespace update_prediction_table
138}; // end namespace prediction_unit
139}; // end namespace front_end
140}; // end namespace multi_front_end
141}; // end namespace core
142
143}; // end namespace behavioural
144}; // end namespace morpheo             
145#endif
Note: See TracBrowser for help on using the repository browser.