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
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());
[81]26   
27    for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++)
[88]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
[81]32      {
[88]33        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * BRANCH_COMPLETE [%d]",i);
34
[81]35        Tcontext_t          context   = (_param->_have_port_context_id)?PORT_READ(in_BRANCH_COMPLETE_CONTEXT_ID [i]):0;
[88]36        Tdepth_t            depth     = (_param->_have_port_depth     )?PORT_READ(in_BRANCH_COMPLETE_DEPTH      [i]):0;
[81]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
[88]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
[81]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
[88]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
[81]71              break;
72            }
73          case BRANCH_CONDITION_FLAG_UNSET                        : // l.bnf
74            {
[88]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
[81]79              miss = (take != take_good);
80              take = take_good;
[88]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
[81]87              break;
88            }
89          case BRANCH_CONDITION_FLAG_SET                          : // l.bf
90            {
[88]91              //addr_dest : compute in decod stage
92              //miss if the direction is bad
93              Tcontrol_t take_good = flag; // flag set = take
94
[81]95              miss = (take != take_good);
96              take = take_good;
97
[88]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
[81]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            {
[88]109              // miss if destination address is bad
110              miss      = (addr_dest != addr_good);
[81]111              addr_dest = addr_good;
[88]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             
[81]118              break;
119            }
120          }
121
[88]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       
[81]127        internal_BRANCH_COMPLETE_MISS_PREDICTION [i] = miss     ;
128        internal_BRANCH_COMPLETE_TAKE            [i] = take     ;
129        internal_BRANCH_COMPLETE_ADDRESS_DEST    [i] = addr_dest;
[88]130       
[81]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
[88]137    log_end(Update_Prediction_Table,FUNCTION);
[81]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.