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

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

1) Bug fix (Operation, Instruction)
2) Modif Return Address Stack
3) Add Soft Test
4) Add Soc Test

  • Property svn:keywords set to Id
File size: 2.2 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Return_Address_Stack_genMealy_predict.cpp 100 2009-01-08 13:06:27Z 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_predict"
22  void Return_Address_Stack::genMealy_predict (void)
23  {
24    log_begin(Return_Address_Stack,FUNCTION);
25    log_function(Return_Address_Stack,FUNCTION,_name.c_str());
26
27#ifdef DEBUG_TEST
28    // just to test if have many transaction on a same context
29    bool context_valid [_param->_nb_context];
30    for (uint32_t i=0; i<_param->_nb_context; i++)
31      context_valid [i] = true;
32#endif
33
34    for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
35      {
36        // Read context number
37        Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_PREDICT_CONTEXT_ID [i]):0;
38       
39#ifdef DEBUG_TEST
40        if (PORT_READ(in_PREDICT_VAL [i]))
41          {
42            if (context_valid[context] == false)
43              ERRORMORPHEO(FUNCTION,"Can't have 2 transactions with the same context_id");
44            context_valid[context] = false;
45          }
46#endif
47       
48        // Get top
49        Tptr_t     top  = reg_PREDICT_TOP[context];
50        Tcontrol_t push = PORT_READ(in_PREDICT_PUSH [i]);
51
52        // Hit :
53        //   * if push : value is hit
54        //   * if pop  : no empty
55        internal_PREDICT_HIT [i] = (push or (reg_PREDICT_NB_ELT[context]>0));
56
57        PORT_WRITE(out_PREDICT_HIT         [i], internal_PREDICT_HIT [i]);
58
59        // if pop  : address_pop   = stack [top]
60        // if push : stock [top+1] = address_push; also stack [top+1] is erase ! save the old value in the update table
61        if (push)
62          top = (top+1)%_param->_size_queue[context];
63
64        PORT_WRITE(out_PREDICT_ADDRESS_POP [i], reg_stack[context][top]._address);
65        PORT_WRITE(out_PREDICT_INDEX       [i], top);
66      }
67
68    log_end(Return_Address_Stack,FUNCTION);
69  };
70
71}; // end namespace return_address_stack
72}; // end namespace prediction_unit
73}; // end namespace front_end
74}; // end namespace multi_front_end
75}; // end namespace core
76}; // end namespace behavioural
77}; // end namespace morpheo             
78#endif
Note: See TracBrowser for help on using the repository browser.