source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Decod_unit/Decod/src/Decod_genMealy.cpp @ 78

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

Add :

  • Execute_loop (must be test systemC)
  • Prediction
    • Direction : predifined scheme
    • Branch Target Buffer
  • iFetch_unit
    • ifetch_queue
    • pc management
  • Decod_unit
    • coming soon : support for custom operation
  • Rename_unit
    • RAT
    • Free_list
    • Dependence RAW check
    • Load store unit pointer
  • New Environnement (hierarchy_memory will remove in a next version)


Modif :

  • Manage Custom Operation
  • All component in execute_loop to use the new statistics management

Not Finish :

  • Return Address Stack
  • Environnement
File size: 9.2 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id$
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Front_end/Front_end/Decod_unit/Decod/include/Decod.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_front_end {
15namespace front_end {
16namespace decod_unit {
17namespace decod {
18
19
20#undef  FUNCTION
21#define FUNCTION "Decod::genMealy"
22  void Decod::genMealy (void)
23  {
24    log_printf(TRACE,Decod,FUNCTION,"Begin");
25
26    //-----------------------------------
27    // Initialization
28    //-----------------------------------
29    Tcontrol_t context_event_val;
30    Tcontrol_t ifetch_ack [_param->_nb_context][_param->_max_nb_inst_fetch];
31    for (uint32_t i=0; i<_param->_nb_context; i++)
32      for (uint32_t j=0; j<_param->_nb_inst_fetch[i]; j++)
33        ifetch_ack [i][j] = false;
34
35    Tcontrol_t predict_val [_param->_nb_inst_decod];
36    Tcontrol_t decod_val   [_param->_nb_inst_decod];
37    for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
38      {
39        decod_val   [i] = false;
40      }
41
42    Tcontrol_t can_continue      [_param->_nb_context];
43    Tcontrol_t can_continue_next [_param->_nb_context];   
44
45    for (uint32_t i=0; i<_param->_nb_context; i++)
46      {
47        internal_CONTEXT_HAVE_TRANSACTION [i] = false;
48        internal_CONTEXT_ADDRESS_PREVIOUS [i] = reg_CONTEXT_ADDRESS_PREVIOUS [i];
49        internal_CONTEXT_IS_DELAY_SLOT    [i] = reg_CONTEXT_IS_DELAY_SLOT    [i];
50
51        can_continue                      [i] = PORT_READ(in_CONTEXT_DECOD_ENABLE [i]);
52        can_continue_next                 [i] = PORT_READ(in_CONTEXT_DECOD_ENABLE [i]);
53      }
54   
55    //-----------------------------------
56    // Loop of decod
57    //-----------------------------------
58    // scan all decod "slot_out"
59    std::list<select_t>::iterator it=select.begin();
60    for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
61      {
62        while ((it != select.end())     and  // have a no scanned "slot_in" ?
63               (decod_val [i] == false) and  // have not a previous selected entry?
64               (context_event_val == false)) // Have not a context_event (spr_access, exception, ...)
65          {
66            predict_val [i] = false;
67            context_event_val = false;
68
69            Tcontext_t x = it->_context ;
70            uint32_t   y = it->_inst_fetch;
71
72            // Test if this instruction is valid
73            if ((PORT_READ(in_IFETCH_VAL [x][y]) == 1) and // entry is valid
74                (can_continue [x]                == 1))    // context can decod instruction (have not a previous event)
75              {
76                can_continue      [x] = can_continue_next [x];
77
78                decod_val  [i]    = true;                        // fetch_val and decod_enable
79                ifetch_ack [x][y] = PORT_READ(in_DECOD_ACK [i]); // fetch_val and decod_enable and decod_ack
80
81                Tgeneral_data_t addr = PORT_READ(in_IFETCH_ADDRESS [x])+4*y;
82
83                _decod_instruction->_instruction      = PORT_READ(in_IFETCH_INSTRUCTION [x][y]);
84                _decod_instruction->_context_id       = x;
85                _decod_instruction->_address_previous = internal_CONTEXT_ADDRESS_PREVIOUS [x];
86                _decod_instruction->_address          = addr; //Compute the current address
87                _decod_instruction->_address_next     = addr+4;
88                _decod_instruction->_is_delay_slot    = internal_CONTEXT_IS_DELAY_SLOT [x];
89
90                // Decod !
91                log_printf(TRACE,Decod,FUNCTION,"DECOD [%d]",i);
92                log_printf(TRACE,Decod,FUNCTION,"  * context       : %d",x);
93                log_printf(TRACE,Decod,FUNCTION,"  * fetch         : %d",y);
94                log_printf(TRACE,Decod,FUNCTION,"  * address       : %.8x",addr);
95                log_printf(TRACE,Decod,FUNCTION,"  * is_delay_slot : %d",internal_CONTEXT_IS_DELAY_SLOT [x]);
96                instruction_decod (_decod_instruction, _decod_param[x]);
97
98                Ttype_t type = _decod_instruction->_type;
99
100                if (_param->_have_port_context_id)
101                PORT_WRITE(out_DECOD_CONTEXT_ID    [i], x);
102                if (_param->_have_port_depth)
103                PORT_WRITE(out_DECOD_DEPTH         [i], PORT_READ(in_CONTEXT_DEPTH [x]));
104                PORT_WRITE(out_DECOD_TYPE          [i], type);
105                PORT_WRITE(out_DECOD_OPERATION     [i], _decod_instruction->_operation     );
106                PORT_WRITE(out_DECOD_IS_DELAY_SLOT [i], _decod_instruction->_is_delay_slot );
107                PORT_WRITE(out_DECOD_ADDRESS       [i], addr);
108                PORT_WRITE(out_DECOD_HAS_IMMEDIAT  [i], _decod_instruction->_has_immediat  );
109                PORT_WRITE(out_DECOD_IMMEDIAT      [i], _decod_instruction->_immediat      );
110                PORT_WRITE(out_DECOD_READ_RA       [i], _decod_instruction->_read_ra       );
111                PORT_WRITE(out_DECOD_NUM_REG_RA    [i], _decod_instruction->_num_reg_ra    );
112                PORT_WRITE(out_DECOD_READ_RB       [i], _decod_instruction->_read_rb       );
113                PORT_WRITE(out_DECOD_NUM_REG_RB    [i], _decod_instruction->_num_reg_rb    );
114                PORT_WRITE(out_DECOD_READ_RC       [i], _decod_instruction->_read_rc       );
115                PORT_WRITE(out_DECOD_NUM_REG_RC    [i], _decod_instruction->_num_reg_rc    );
116                PORT_WRITE(out_DECOD_WRITE_RD      [i], _decod_instruction->_write_rd      );
117                PORT_WRITE(out_DECOD_NUM_REG_RD    [i], _decod_instruction->_num_reg_rd    );
118                PORT_WRITE(out_DECOD_WRITE_RE      [i], _decod_instruction->_write_re      );
119                PORT_WRITE(out_DECOD_NUM_REG_RE    [i], _decod_instruction->_num_reg_re    );
120                PORT_WRITE(out_DECOD_EXCEPTION_USE [i], _decod_instruction->_exception_use );
121
122                if (type == TYPE_BRANCH)
123                  {
124                    predict_val [i]     = ifetch_ack  [x][y] // and decod_val [i]
125                      ;
126                    decod_val   [i]    &= PORT_READ(in_PREDICT_ACK [i]);// predict_ack and fetch_val and decod_enable               
127                    ifetch_ack  [x][y] &= PORT_READ(in_PREDICT_ACK [i]);// predict_ack and fetch_val and decod_enable and decod_ack
128
129                    if (_param->_have_port_context_id)
130                    PORT_WRITE(out_PREDICT_CONTEXT_ID                  [i],x);
131                    PORT_WRITE(out_PREDICT_MATCH_INST_IFETCH_PTR       [i],y == ((_param->_have_port_inst_ifetch_ptr)?PORT_READ(in_IFETCH_INST_IFETCH_PTR [x]):0));
132                    PORT_WRITE(out_PREDICT_BRANCH_STATE                [i],PORT_READ(in_IFETCH_BRANCH_STATE                [x]));
133                    if (_param->_have_port_branch_update_prediction_id)
134                    PORT_WRITE(out_PREDICT_BRANCH_UPDATE_PREDICTION_ID [i],PORT_READ(in_IFETCH_BRANCH_UPDATE_PREDICTION_ID [x]));
135                    PORT_WRITE(out_PREDICT_BRANCH_CONDITION            [i],_decod_instruction->_branch_condition  );
136//                  PORT_WRITE(out_PREDICT_BRANCH_STACK_WRITE          [i],_decod_instruction->_branch_stack_write);
137                    PORT_WRITE(out_PREDICT_BRANCH_DIRECTION            [i],_decod_instruction->_branch_direction  );
138                    PORT_WRITE(out_PREDICT_ADDRESS_SRC                 [i],_decod_instruction->_address           );
139                    PORT_WRITE(out_PREDICT_ADDRESS_DEST                [i],_decod_instruction->_address_next      );
140               
141                    //can_continue_next [x] = PORT_READ(in_PREDICT_CAN_CONTINUE [i]); // can continue is set if direction is "not take" (also, continue is sequential order)
142                    can_continue_next [x] = false; // one branch per context
143                  }
144
145                Tevent_type_t event_type = _decod_instruction->_event_type;
146                if (event_type != EVENT_TYPE_NONE)
147                  {
148                    // speculative jump at the exception handler
149                    // if type = TYPE_BRANCH, also event_type == EVENT_TYPE_NONE
150                    context_event_val   = ifetch_ack  [x][y] // and decod_val [i]
151                      ;
152                    decod_val   [i]    &= PORT_READ(in_CONTEXT_EVENT_ACK);// context_event_ack and fetch_val and decod_enable             
153                    ifetch_ack  [x][y] &= PORT_READ(in_CONTEXT_EVENT_ACK);// context_event_ack and fetch_val and decod_enable and decod_ack
154
155                    if (_param->_have_port_context_id)
156                    PORT_WRITE(out_CONTEXT_EVENT_CONTEXT_ID   , x);
157                    PORT_WRITE(out_CONTEXT_EVENT_TYPE         , _decod_instruction->_event_type    );
158                    PORT_WRITE(out_CONTEXT_EVENT_IS_DELAY_SLOT, _decod_instruction->_is_delay_slot );
159                    PORT_WRITE(out_CONTEXT_EVENT_ADDRESS      , _decod_instruction->_address       );
160                    PORT_WRITE(out_CONTEXT_EVENT_ADDRESS_EPCR , _decod_instruction->_address_next  );
161                  }
162
163                // fetch_ack =
164                //   ((event_type == EVENT_TYPE_NONE) or ((event_type != EVENT_TYPE_NONE) and context_event_ack)) and
165                //   ((type       == TYPE_BRANCH    ) or ((type       != TYPE_BRANCH    ) and predict_ack      )) and
166                //   fetch_val and decod_ack and decod_enable and true (is decod_val)
167
168                // To compute the "next previous" address
169                Tcontrol_t have_transaction = ifetch_ack [x][y];
170
171                internal_CONTEXT_HAVE_TRANSACTION [x] |= have_transaction;
172                if (have_transaction)
173                  {
174#ifdef STATISTICS
175                    (*_stat_sum_inst_decod) ++;
176#endif
177                    internal_CONTEXT_ADDRESS_PREVIOUS [x] = addr;
178                    internal_CONTEXT_IS_DELAY_SLOT    [x] = (type == TYPE_BRANCH); // next is a delay slot if current have branch type
179                  }
180
181                can_continue [x] &= have_transaction; // to have a in order decod !!! if a previous instruction can decod, also next instruction can't decod.
182              }
183           
184            it ++;
185          }
186      }
187
188    //-----------------------------------
189    // Write output
190    //-----------------------------------
191
192    for (uint32_t i=0; i<_param->_nb_context; i++)
193      for (uint32_t j=0; j<_param->_nb_inst_fetch[i]; j++)
194        PORT_WRITE(out_IFETCH_ACK [i][j], ifetch_ack [i][j]);
195
196    PORT_WRITE(out_CONTEXT_EVENT_VAL, context_event_val);
197
198    for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
199      {
200        PORT_WRITE(out_PREDICT_VAL [i], predict_val [i]);
201        PORT_WRITE(out_DECOD_VAL   [i], decod_val   [i]);
202      }
203
204    log_printf(FUNC,Decod,FUNCTION,"End");
205  };
206
207}; // end namespace decod
208}; // end namespace decod_unit
209}; // end namespace front_end
210}; // end namespace multi_front_end
211}; // end namespace core
212
213}; // end namespace behavioural
214}; // end namespace morpheo             
215#endif
Note: See TracBrowser for help on using the repository browser.