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

Last change on this file since 88 was 88, checked in by rosiere, 16 years ago

Almost complete design
with Test and test platform

File size: 6.0 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          flag      = PORT_READ(in_BRANCH_COMPLETE_FLAG [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,"    * flag           : %d",flag);
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
64#ifdef DEBUG_TEST
65              if (take != 1)
66                throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad direction.",i,toString(condition).c_str()));
67              if (addr_dest != addr_good)
68                throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad destination address.",i,toString(condition).c_str()));
69#endif
70
71              break;
72            }
73          case BRANCH_CONDITION_FLAG_UNSET                        : // l.bnf
74            {
75              //addr_dest : compute in decod stage
76              //miss if the direction is bad
77              Tcontrol_t take_good = not flag; // flag set = not take
78
79              miss = (take != take_good);
80              take = take_good;
81
82#ifdef DEBUG_TEST
83              if (addr_dest != addr_good)
84                throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad destination address.",i,toString(condition).c_str()));
85#endif
86
87              break;
88            }
89          case BRANCH_CONDITION_FLAG_SET                          : // l.bf
90            {
91              //addr_dest : compute in decod stage
92              //miss if the direction is bad
93              Tcontrol_t take_good = flag; // flag set = take
94
95              miss = (take != take_good);
96              take = take_good;
97
98#ifdef DEBUG_TEST
99              if (addr_dest != addr_good)
100                throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad destination address.",i,toString(condition).c_str()));
101#endif
102
103              break;
104            }
105          case BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK : // l.jr (rb!=r9)
106          case BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK    : // l.jalr
107          case BRANCH_CONDITION_READ_STACK                        : // l.jr (rb==r9)
108            {
109              // miss if destination address is bad
110              miss      = (addr_dest != addr_good);
111              addr_dest = addr_good;
112
113#ifdef DEBUG_TEST
114              if (take != 1)
115                throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad direction.",i,toString(condition).c_str()));
116#endif
117             
118              break;
119            }
120          }
121
122        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * (after)");
123        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * miss         : %d",miss);
124        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * take         : %d",take);
125        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * address_dest : %.8x",addr_dest);
126       
127        internal_BRANCH_COMPLETE_MISS_PREDICTION [i] = miss     ;
128        internal_BRANCH_COMPLETE_TAKE            [i] = take     ;
129        internal_BRANCH_COMPLETE_ADDRESS_DEST    [i] = addr_dest;
130       
131        PORT_WRITE(out_BRANCH_COMPLETE_MISS_PREDICTION [i], internal_BRANCH_COMPLETE_MISS_PREDICTION [i]);
132        PORT_WRITE(out_BRANCH_COMPLETE_TAKE            [i], internal_BRANCH_COMPLETE_TAKE            [i]);
133        PORT_WRITE(out_BRANCH_COMPLETE_ADDRESS_SRC     [i], reg_UPDATE_PREDICTION_TABLE [context][depth]._address_src);
134        PORT_WRITE(out_BRANCH_COMPLETE_ADDRESS_DEST    [i], internal_BRANCH_COMPLETE_ADDRESS_DEST    [i]);
135      }
136
137    log_end(Update_Prediction_Table,FUNCTION);
138  };
139
140}; // end namespace update_prediction_table
141}; // end namespace prediction_unit
142}; // end namespace front_end
143}; // end namespace multi_front_end
144}; // end namespace core
145
146}; // end namespace behavioural
147}; // end namespace morpheo             
148#endif
Note: See TracBrowser for help on using the repository browser.