source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Return_Address_Stack/src/Return_Address_Stack_genMealy_decod.cpp @ 88

Last change on this file since 88 was 81, checked in by rosiere, 16 years ago
  • Finish Environment (and test)
  • Continue predictor_unit
  • Add external tools
  • svn keyword "Id" set
  • Property svn:keywords set to Id
File size: 2.1 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Return_Address_Stack_genMealy_decod.cpp 81 2008-04-15 18:40:01Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Return_Address_Stack/include/Return_Address_Stack.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_front_end {
15namespace front_end {
16namespace prediction_unit {
17namespace return_address_stack {
18
19
20#undef  FUNCTION
21#define FUNCTION "Return_Address_Stack::genMealy_decod"
22  void Return_Address_Stack::genMealy_decod (void)
23  {
24    log_printf(FUNC,Return_Address_Stack,FUNCTION,"Begin");
25
26#ifdef DEBUG_TEST
27    bool context_valid [_param->_nb_context];
28    for (uint32_t i=0; i<_param->_nb_context; i++)
29      context_valid [i] = true;
30#endif
31
32    for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
33      {
34        Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_DECOD_CONTEXT_ID [i]):0;
35
36#ifdef DEBUG_TEST
37        if (PORT_READ(in_DECOD_VAL [i]))
38          {
39            if (context_valid[context] == false)
40              ERRORMORPHEO(FUNCTION,"Can't have 2 transactions with the same context_id");
41            context_valid[context] = false;
42          }
43#endif
44
45        Tptr_t     top  = reg_TOP[context];
46        Tcontrol_t push = PORT_READ(in_DECOD_PUSH [i]);
47
48        // if push : value is hit
49        // if pop  : val and not miss
50        //   when the predictor : if hit = 0, wait (is not accurate)
51        internal_DECOD_HIT [i] = (push or (reg_stack[context][top]._val and not reg_stack[context][top]._miss and (reg_NB_ELT[context]>0)));
52        PORT_WRITE(out_DECOD_HIT         [i], internal_DECOD_HIT [i]);
53
54        // if pop  : address_pop   = stack [top]
55        // if push : stock [top+1] = address_push; also stock [top+1] is erase ! give the old value at the update table
56        if (push)
57          top = (top+1)%_param->_size_queue[context];
58
59        PORT_WRITE(out_DECOD_ADDRESS_POP [i], reg_stack[context][top]._address);
60        PORT_WRITE(out_DECOD_INDEX       [i], top);
61      }
62
63    log_printf(FUNC,Return_Address_Stack,FUNCTION,"End");
64  };
65
66}; // end namespace return_address_stack
67}; // end namespace prediction_unit
68}; // end namespace front_end
69}; // end namespace multi_front_end
70}; // end namespace core
71}; // end namespace behavioural
72}; // end namespace morpheo             
73#endif
Note: See TracBrowser for help on using the repository browser.