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

Last change on this file since 82 was 82, checked in by rosiere, 16 years ago
  • support locale (now must "just" translate)
  • update all component with new test format
  • update all component with usage
  • New component : decod queue and prediction_unit
File size: 4.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_printf(FUNC,Update_Prediction_Table,FUNCTION,"Begin");
25   
26    for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++)
27      {
28        Tcontext_t          context   = (_param->_have_port_context_id)?PORT_READ(in_BRANCH_COMPLETE_CONTEXT_ID [i]):0;
29        Tdepth_t            depth     = (_param->_have_port_max_depth )?PORT_READ(in_BRANCH_COMPLETE_DEPTH      [i]):0;
30        Tcontrol_t          miss      = false;
31        Tcontrol_t          take      = reg_UPDATE_PREDICTION_TABLE [context][depth]._last_take   ;
32        Taddress_t          addr_dest = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest;
33        Tbranch_condition_t condition = reg_UPDATE_PREDICTION_TABLE [context][depth]._condition   ;
34
35        switch (condition)
36          {
37          case BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK          : // l.j
38          case BRANCH_CONDITION_NONE_WITH_WRITE_STACK             : // l.jal
39            {
40              //miss      : always hit
41              //addr_dest : know in decod stage
42              break;
43            }
44          case BRANCH_CONDITION_FLAG_UNSET                        : // l.bnf
45            {
46              Tcontrol_t take_good = PORT_READ(in_BRANCH_COMPLETE_FLAG [i]) == 0;
47              miss = (take != take_good);
48              take = take_good;
49              //addr_dest : know in decod stage
50              break;
51            }
52          case BRANCH_CONDITION_FLAG_SET                          : // l.bf
53            {
54//            log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * BRANCH_CONDITION_FLAG_SET");
55             
56              Tcontrol_t take_good = PORT_READ(in_BRANCH_COMPLETE_FLAG [i]) == 1;
57              miss = (take != take_good);
58              take = take_good;
59
60//            log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * flag      : %d",PORT_READ(in_BRANCH_COMPLETE_FLAG [i]));
61//            log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * take_good : %d",take_good);
62//            log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * miss      : %d",miss);
63             
64              //addr_dest : know in decod stage
65              break;
66            }
67          case BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK : // l.jr (rb!=r9)
68          case BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK    : // l.jalr
69          case BRANCH_CONDITION_READ_STACK                        : // l.jr (rb==r9)
70            {
71              Taddress_t addr_good = PORT_READ(in_BRANCH_COMPLETE_ADDRESS [i]);
72              miss = ((take == 1) and
73                      (addr_dest = addr_good));
74              take = 1;
75              addr_dest = addr_good;
76              break;
77            }
78          }
79
80//      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * miss      : %d",miss);
81//      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * take      : %d",take);
82//      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * address   : %x",addr_dest);
83
84        internal_BRANCH_COMPLETE_MISS_PREDICTION [i] = miss     ;
85        internal_BRANCH_COMPLETE_TAKE            [i] = take     ;
86        internal_BRANCH_COMPLETE_ADDRESS_DEST    [i] = addr_dest;
87
88        PORT_WRITE(out_BRANCH_COMPLETE_MISS_PREDICTION [i], internal_BRANCH_COMPLETE_MISS_PREDICTION [i]);
89        PORT_WRITE(out_BRANCH_COMPLETE_TAKE            [i], internal_BRANCH_COMPLETE_TAKE            [i]);
90        PORT_WRITE(out_BRANCH_COMPLETE_ADDRESS_SRC     [i], reg_UPDATE_PREDICTION_TABLE [context][depth]._address_src);
91        PORT_WRITE(out_BRANCH_COMPLETE_ADDRESS_DEST    [i], internal_BRANCH_COMPLETE_ADDRESS_DEST    [i]);
92      }
93
94    log_printf(FUNC,Update_Prediction_Table,FUNCTION,"End");
95  };
96
97}; // end namespace update_prediction_table
98}; // end namespace prediction_unit
99}; // end namespace front_end
100}; // end namespace multi_front_end
101}; // end namespace core
102
103}; // end namespace behavioural
104}; // end namespace morpheo             
105#endif
Note: See TracBrowser for help on using the repository browser.