source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Ifetch_unit/Address_management/src/Address_management_transition.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: 5.5 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id$
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        reg_PC_PREVIOUS_VAL = 0;
29        reg_PC_CURRENT_VAL  = 0;
30        reg_PC_NEXT_VAL     = 0;       
31      }
32    else
33      {
34        // =========================================
35        // ===== ADDRESS ===========================
36        // =========================================
37        // transaction with icache
38        if (internal_ADDRESS_VAL and PORT_READ(in_ADDRESS_ACK))
39          {
40            // current pc became previous pc
41            reg_PC_PREVIOUS_VAL                        = 1;
42            reg_PC_PREVIOUS                            = reg_PC_CURRENT    ;
43           
44            // next    pc became next     pc
45            reg_PC_CURRENT_VAL                         = reg_PC_NEXT_VAL; // can be not valid
46
47            // 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)
48            if (reg_PC_NEXT_VAL)
49              {
50            reg_PC_CURRENT                             = reg_PC_NEXT    ;
51            reg_PC_CURRENT_IS_DS_TAKE                  = reg_PC_NEXT_IS_DS_TAKE                 ;
52              }
53
54            reg_PC_CURRENT_INST_IFETCH_PTR             = reg_PC_NEXT_INST_IFETCH_PTR            ;
55            reg_PC_CURRENT_BRANCH_STATE                = reg_PC_NEXT_BRANCH_STATE               ;
56            reg_PC_CURRENT_BRANCH_UPDATE_PREDICTION_ID = reg_PC_NEXT_BRANCH_UPDATE_PREDICTION_ID;
57
58            for (uint32_t i=0; i<_param->_nb_instruction; i++)
59              reg_PC_CURRENT_INSTRUCTION_ENABLE [i] = reg_PC_NEXT_INSTRUCTION_ENABLE [i];
60
61            // have not next pc
62            reg_PC_NEXT_VAL                            = 0;
63          }
64       
65        // =========================================
66        // ===== PREDICT ===========================
67        // =========================================
68        bool new_pc_current = not reg_PC_CURRENT_VAL;
69        if (PORT_READ(in_PREDICT_ACK) and internal_PREDICT_VAL)
70          if (new_pc_current)
71            {
72              reg_PC_CURRENT_VAL                         = 1;
73              reg_PC_CURRENT                             = PORT_READ(in_PREDICT_PC_NEXT                    );
74              reg_PC_CURRENT_IS_DS_TAKE                  = PORT_READ(in_PREDICT_PC_NEXT_IS_DS_TAKE         );
75              if (_param->_have_port_instruction_ptr)
76              reg_PC_CURRENT_INST_IFETCH_PTR             = PORT_READ(in_PREDICT_INST_IFETCH_PTR            );
77              reg_PC_CURRENT_BRANCH_STATE                = PORT_READ(in_PREDICT_BRANCH_STATE               );
78              if (_param->_have_port_branch_update_prediction_id)
79              reg_PC_CURRENT_BRANCH_UPDATE_PREDICTION_ID = PORT_READ(in_PREDICT_BRANCH_UPDATE_PREDICTION_ID);
80
81              for (uint32_t i=0; i<_param->_nb_instruction; i++)
82                reg_PC_CURRENT_INSTRUCTION_ENABLE [i] = PORT_READ(in_PREDICT_INSTRUCTION_ENABLE [i]);
83            }
84          else
85            {
86              reg_PC_NEXT_VAL                         = 1;
87              reg_PC_NEXT                             = PORT_READ(in_PREDICT_PC_NEXT                    );
88              reg_PC_NEXT_IS_DS_TAKE                  = PORT_READ(in_PREDICT_PC_NEXT_IS_DS_TAKE         );
89              if (_param->_have_port_instruction_ptr)
90              reg_PC_NEXT_INST_IFETCH_PTR             = PORT_READ(in_PREDICT_INST_IFETCH_PTR            );
91              reg_PC_NEXT_BRANCH_STATE                = PORT_READ(in_PREDICT_BRANCH_STATE               );
92              if (_param->_have_port_branch_update_prediction_id)
93              reg_PC_NEXT_BRANCH_UPDATE_PREDICTION_ID = PORT_READ(in_PREDICT_BRANCH_UPDATE_PREDICTION_ID);
94
95              for (uint32_t i=0; i<_param->_nb_instruction; i++)
96                reg_PC_NEXT_INSTRUCTION_ENABLE [i] = PORT_READ(in_PREDICT_INSTRUCTION_ENABLE [i]);
97            }
98
99        // =========================================
100        // ===== EVENT =============================
101        // =========================================
102        if (PORT_READ(in_EVENT_VAL) and internal_EVENT_ACK)
103          {
104            reg_PC_CURRENT_VAL                         = 1;
105            reg_PC_CURRENT                             = PORT_READ(in_EVENT_ADDRESS);
106            // Event is never is ds_take :
107            //  * branch miss speculation : can't be place a branch in delay slot
108            //  * load   miss speculation : the load is execute, the event_address is the next address (also the destination of branch)
109            //  * exception               : goto the first instruction of exception handler (also is not in delay slot).
110            reg_PC_CURRENT_IS_DS_TAKE                  = 0;
111            reg_PC_CURRENT_INST_IFETCH_PTR             = 0;
112            reg_PC_CURRENT_BRANCH_STATE                = BRANCH_STATE_NONE;
113            reg_PC_CURRENT_BRANCH_UPDATE_PREDICTION_ID = 0;
114           
115            reg_PC_CURRENT_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.
116            for (uint32_t i=1; i<_param->_nb_instruction; i++)
117              reg_PC_CURRENT_INSTRUCTION_ENABLE [i] = 0;
118
119            reg_PC_NEXT_VAL                            = 0; // cancel all prediction (event is send at the predict unit)
120          }
121      }
122
123#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
124    end_cycle ();
125#endif
126
127    log_printf(FUNC,Address_management,FUNCTION,"End");
128  };
129
130}; // end namespace address_management
131}; // end namespace ifetch_unit
132}; // end namespace front_end
133}; // end namespace multi_front_end
134}; // end namespace core
135
136}; // end namespace behavioural
137}; // end namespace morpheo             
138#endif
Note: See TracBrowser for help on using the repository browser.