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

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

1) Update Prediction Table : statistics
2) Size instruction address on 30 bits
3) Change Log File
4) Add debug_level in simulation configuration file

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