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

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

1) Fix bug (read unit, RAT -> write in R0, SPR desallocation ...)
2) Change VHDL Execute_queue -> use Generic/Queue?
3) Complete document on VHDL generation
4) Add soc test

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    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        Tcontext_t          context   = (_param->_have_port_context_id)?PORT_READ(in_BRANCH_COMPLETE_CONTEXT_ID [i]):0;
36        Tdepth_t            depth     = (_param->_have_port_depth     )?PORT_READ(in_BRANCH_COMPLETE_DEPTH      [i]):0;
37        Tcontrol_t          miss      = false;
38        Tcontrol_t          take      = reg_UPDATE_PREDICTION_TABLE [context][depth]._last_take   ;
39        Taddress_t          addr_dest = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest;
40        Tbranch_condition_t condition = reg_UPDATE_PREDICTION_TABLE [context][depth]._condition   ;
41
42        Tcontrol_t          no_sequence = PORT_READ(in_BRANCH_COMPLETE_NO_SEQUENCE [i]);
43        Taddress_t          addr_good = PORT_READ(in_BRANCH_COMPLETE_ADDRESS [i]);
44
45        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * context        : %d",context);
46        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * depth          : %d",depth  );
47        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * condition      : %s",toString(condition).c_str());
48        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * no_sequence    : %d",no_sequence);
49        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * address_good   : %.8x",addr_good);
50
51        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * (before)");
52        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * miss         : %d",miss);
53        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * take         : %d",take);
54        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * address_dest : %.8x",addr_dest);
55
56        switch (condition)
57          {
58          case BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK          : // l.j
59          case BRANCH_CONDITION_NONE_WITH_WRITE_STACK             : // l.jal
60            {
61              //miss      : always hit
62              //addr_dest : compute in decod stage
63              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK");
64              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * BRANCH_CONDITION_NONE_WITH_WRITE_STACK   ");
65
66#ifdef DEBUG_TEST
67              if (take != 1)
68                throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad direction.",i,toString(condition).c_str()));
69//               if (addr_dest != addr_good)
70//                 throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad destination address.",i,toString(condition).c_str()));
71#endif
72
73              break;
74            }
75          case BRANCH_CONDITION_FLAG_UNSET                        : // l.bnf
76          case BRANCH_CONDITION_FLAG_SET                          : // l.bf
77            {
78              //addr_dest : compute in decod stage
79              //miss if the direction is bad
80              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * BRANCH_CONDITION_FLAG");
81
82//               Tcontrol_t take_good = not flag; // flag set = not take
83//               Tcontrol_t take_good = flag; // flag set = take
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.