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

File size: 6.4 KB
Line 
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  {
24    log_begin(Update_Prediction_Table,FUNCTION);
25    log_function(Update_Prediction_Table,FUNCTION,_name.c_str());
26
27    if (PORT_READ(in_NRESET))
28      {
29    for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++)
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
34      {
35        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * BRANCH_COMPLETE [%d]",i);
36
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   ;
44
45        Tcontrol_t          no_sequence = PORT_READ(in_BRANCH_COMPLETE_NO_SEQUENCE [i]);
46        Taddress_t          addr_good   = PORT_READ(in_BRANCH_COMPLETE_ADDRESS [i]);
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());
51        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * no_sequence    : %d",no_sequence);
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
59        // Test branch condition
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
66              //addr_dest : compute in decod stage
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   ");
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()));
73//               if (addr_dest != addr_good)
74//                 throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad destination address.",i,toString(condition).c_str()));
75#endif
76
77              break;
78            }
79          case BRANCH_CONDITION_FLAG_UNSET                        : // l.bnf
80          case BRANCH_CONDITION_FLAG_SET                          : // l.bf
81            {
82              //addr_dest : compute in decod stage
83              //miss if the direction is bad
84              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * BRANCH_CONDITION_FLAG");
85
86              Tcontrol_t take_good = no_sequence;
87
88              miss = (take != take_good);
89              take = take_good;
90
91#ifdef DEBUG_TEST
92//               if (addr_dest != addr_good)
93//                 throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad destination address.",i,toString(condition).c_str()));
94#endif
95
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            {
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
106              // miss if destination address is bad
107              miss      = (addr_dest != addr_good);
108              addr_dest = addr_good;
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             
115              break;
116            }
117          }
118
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       
124        internal_BRANCH_COMPLETE_MISS_PREDICTION [i] = miss     ;
125        internal_BRANCH_COMPLETE_TAKE            [i] = take     ;
126        internal_BRANCH_COMPLETE_ADDRESS_DEST    [i] = addr_dest;
127       
128        PORT_WRITE(out_BRANCH_COMPLETE_MISS_PREDICTION [i], internal_BRANCH_COMPLETE_MISS_PREDICTION [i]);
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]);
132      }
133      }
134    log_end(Update_Prediction_Table,FUNCTION);
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.