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

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

Modif for performance :
1) Load Store Unit : store send request to valid exeception
2) Commit_unit : retire can bypass store
3) Commit_unit : add stat to manage store instruction
4) Load Store Unit and Load Store Pointer Manager : add store_queue_ptr_read
5) Fix lot of bug

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