source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Ifetch_unit/Address_management/src/Address_management_transition.cpp @ 84

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

Change Address_manager :

  • before : pc_previous, pc_current, pc_next
  • now : pc_current, pc_next, pc_next_next.

pc_next is send at the prediction_unit, it return the instruction_enable and pc_next_next

  • Property svn:keywords set to Id
File size: 6.0 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Address_management_transition.cpp 84 2008-05-13 18:04:50Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Front_end/Front_end/Ifetch_unit/Address_management/include/Address_management.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_front_end {
15namespace front_end {
16namespace ifetch_unit {
17namespace address_management {
18
19
20#undef  FUNCTION
21#define FUNCTION "Address_management::transition"
22  void Address_management::transition (void)
23  {
24    log_printf(FUNC,Address_management,FUNCTION,"Begin");
25
26    if (PORT_READ(in_NRESET) == 0)
27      {
28        // nothing is valid
29        reg_PC_CURRENT_VAL   = 0;
30        reg_PC_NEXT_VAL      = 0;
31        reg_PC_NEXT_NEXT_VAL = 0;
32      }
33    else
34      {
35        // =========================================
36        // ===== PREDICT ===========================
37        // =========================================
38        if (PORT_READ(in_PREDICT_ACK) and internal_PREDICT_VAL)
39          {
40            for (uint32_t i=0; i<_param->_nb_instruction; i++)
41            reg_PC_NEXT_INSTRUCTION_ENABLE [i] = PORT_READ(in_PREDICT_INSTRUCTION_ENABLE [i]);
42            if (_param->_have_port_instruction_ptr)
43            reg_PC_NEXT_INST_IFETCH_PTR             = PORT_READ(in_PREDICT_INST_IFETCH_PTR            );
44            reg_PC_NEXT_BRANCH_STATE                = PORT_READ(in_PREDICT_BRANCH_STATE               );
45            if (_param->_have_port_branch_update_prediction_id)
46            reg_PC_NEXT_BRANCH_UPDATE_PREDICTION_ID = PORT_READ(in_PREDICT_BRANCH_UPDATE_PREDICTION_ID);
47           
48            reg_PC_NEXT_NEXT_VAL                    = 1; // address is valid
49            reg_PC_NEXT_NEXT                        = PORT_READ(in_PREDICT_PC_NEXT                    );
50            reg_PC_NEXT_NEXT_IS_DS_TAKE             = PORT_READ(in_PREDICT_PC_NEXT_IS_DS_TAKE         );
51
52#ifdef STATISTICS
53            (*_stat_nb_transaction_predict) ++;
54#endif
55          }
56
57        // =========================================
58        // ===== ADDRESS ===========================
59        // =========================================
60        // transaction with icache
61        if ( (internal_ADDRESS_VAL and PORT_READ(in_ADDRESS_ACK)) or not reg_PC_CURRENT_VAL)
62          {
63#ifdef STATISTICS
64            if (reg_PC_CURRENT_VAL)
65              {
66                (*_stat_nb_transaction_address) ++;
67
68                for (uint32_t i=0; i<_param->_nb_instruction; i++)
69                  if (reg_PC_CURRENT_INSTRUCTION_ENABLE [i] == true)
70                    (*_stat_sum_packet_size) ++;
71              }
72#endif
73
74
75            Tcontrol_t pc_next_val = reg_PC_NEXT_VAL and reg_PC_NEXT_NEXT_VAL;
76
77            // next pc became current pc
78            reg_PC_CURRENT_VAL                             = pc_next_val;
79
80            // if pc_next is not valid : don't erase PC and PC_IS_DS_TAKE : this register is send a the predict (to compute pc_next)
81            if (pc_next_val)
82              {
83                reg_PC_CURRENT                             = reg_PC_NEXT                            ;
84                reg_PC_CURRENT_IS_DS_TAKE                  = reg_PC_NEXT_IS_DS_TAKE                 ;
85                reg_PC_CURRENT_INST_IFETCH_PTR             = reg_PC_NEXT_INST_IFETCH_PTR            ;
86                reg_PC_CURRENT_BRANCH_STATE                = reg_PC_NEXT_BRANCH_STATE               ;
87                reg_PC_CURRENT_BRANCH_UPDATE_PREDICTION_ID = reg_PC_NEXT_BRANCH_UPDATE_PREDICTION_ID;
88
89                for (uint32_t i=0; i<_param->_nb_instruction; i++)
90                reg_PC_CURRENT_INSTRUCTION_ENABLE [i] = reg_PC_NEXT_INSTRUCTION_ENABLE [i];
91           
92                reg_PC_NEXT_VAL                            = reg_PC_NEXT_NEXT_VAL       ;
93                // if pc_next_next is not valid : don't erase PC_NEXT and PC_NEXT_IS_DS_TAKE : this register is send a the predict (to compute pc_next)
94                if (reg_PC_NEXT_NEXT_VAL)
95                  {
96                    reg_PC_NEXT                            = reg_PC_NEXT_NEXT           ;
97                    reg_PC_NEXT_IS_DS_TAKE                 = reg_PC_NEXT_NEXT_IS_DS_TAKE;
98                  }
99               
100                // invalid next next pc
101                reg_PC_NEXT_NEXT_VAL                       = 0;
102              }
103
104          }
105       
106
107        // =========================================
108        // ===== EVENT =============================
109        // =========================================
110        if (PORT_READ(in_EVENT_VAL) and internal_EVENT_ACK)
111          {
112            log_printf(TRACE,Address_management,FUNCTION,"EVENT : Transaction");
113            reg_PC_CURRENT_VAL                      = 0;
114            reg_PC_NEXT_VAL                         = 1;
115            reg_PC_NEXT                             = PORT_READ(in_EVENT_ADDRESS);
116            // Event is never is ds_take :
117            //  * branch miss speculation : can't be place a branch in delay slot
118            //  * load   miss speculation : the load is execute, the event_address is the next address (also the destination of branch)
119            //  * exception               : goto the first instruction of exception handler (also is not in delay slot).
120            reg_PC_NEXT_IS_DS_TAKE                  = 0;
121//          reg_PC_NEXT_INST_IFETCH_PTR             = 0;
122//          reg_PC_NEXT_BRANCH_STATE                = BRANCH_STATE_NONE;
123//          reg_PC_NEXT_BRANCH_UPDATE_PREDICTION_ID = 0;
124           
125//          reg_PC_NEXT_INSTRUCTION_ENABLE [0]      = 1; // only the instruction at the event address is valid, because we have no information on the branch presence in the instruction bundle.
126//          for (uint32_t i=1; i<_param->_nb_instruction; i++)
127//            reg_PC_NEXT_INSTRUCTION_ENABLE [i] = 0;
128
129            reg_PC_NEXT_NEXT_VAL                    = 0; // cancel all prediction (event is send at the predict unit)
130
131#ifdef STATISTICS
132            (*_stat_nb_transaction_event) ++;
133#endif
134          }
135      }
136
137#if DEBUG >= DEBUG_TRACE
138    log_printf(TRACE,Address_management,FUNCTION,"Address_Management : ");
139    log_printf(TRACE,Address_management,FUNCTION,"Current   : %d %d 0x%x",reg_PC_CURRENT_VAL, reg_PC_CURRENT_IS_DS_TAKE, reg_PC_CURRENT);
140    log_printf(TRACE,Address_management,FUNCTION,"Next      : %d %d 0x%x",reg_PC_NEXT_VAL, reg_PC_NEXT_IS_DS_TAKE, reg_PC_NEXT);   
141    log_printf(TRACE,Address_management,FUNCTION,"Next_Next : %d %d 0x%x",reg_PC_NEXT_NEXT_VAL, reg_PC_NEXT_NEXT_IS_DS_TAKE, reg_PC_NEXT_NEXT);   
142#endif
143
144#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
145    end_cycle ();
146#endif
147
148    log_printf(FUNC,Address_management,FUNCTION,"End");
149  };
150
151}; // end namespace address_management
152}; // end namespace ifetch_unit
153}; // end namespace front_end
154}; // end namespace multi_front_end
155}; // end namespace core
156
157}; // end namespace behavioural
158}; // end namespace morpheo             
159#endif
Note: See TracBrowser for help on using the repository browser.