source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Load_Store_pointer_unit/src/Load_Store_pointer_unit_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_OOO_Engine/OOO_Engine/Rename_unit/Load_Store_pointer_unit/include/Load_Store_pointer_unit.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_ooo_engine {
15namespace ooo_engine {
16namespace rename_unit {
17namespace load_store_pointer_unit {
18
19
20#undef  FUNCTION
21#define FUNCTION "Load_Store_pointer_unit::transition"
22  void Load_Store_pointer_unit::transition (void)
23  {
24    log_printf(FUNC,Load_Store_pointer_unit,FUNCTION,"Begin");
25
26    if (PORT_READ(in_NRESET) == 0)
27      {
28        for (uint32_t i=0; i<_param->_nb_load_store_queue; i++)
29          {
30            reg_STORE_QUEUE_PTR_WRITE [i] = 0;
31            reg_STORE_QUEUE_NB_USE    [i] = 0;
32            reg_LOAD_QUEUE_PTR_WRITE  [i] = 0;
33           
34            for (uint32_t j=0; j<_param->_size_store_queue[i]; j++)
35              reg_STORE_QUEUE_USE [i][j] = false;
36            for (uint32_t j=0; j<_param->_size_load_queue[i]; j++)
37              reg_LOAD_QUEUE_USE  [i][j] = false;
38          }
39      }
40    else
41      {
42        // =====================================================
43        // =====[ INSERT ]======================================
44        // =====================================================
45       
46        for (uint32_t i=0; i<_param->_nb_inst_insert; i++)
47          if (PORT_READ(in_INSERT_VAL [i]) and internal_INSERT_ACK [i])
48            {
49//            log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"INSERT [%d]",i);
50             
51              switch (internal_INSERT_OPERATION_USE [i])
52                {
53                case OPERATION_USE_STORE_QUEUE :
54                  {
55//                  log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * use STORE_QUEUE");
56
57                    uint32_t   lsq = internal_INSERT_LSQ [i];
58                    Tlsq_ptr_t ptr = internal_INSERT_PTR [i];
59
60//                  log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * lsq : %d",lsq);
61//                  log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * ptr : %d",ptr);
62
63                    reg_STORE_QUEUE_PTR_WRITE [lsq]      = (ptr+1)%_param->_size_store_queue[lsq];
64                    reg_STORE_QUEUE_NB_USE    [lsq]      ++;
65                    reg_STORE_QUEUE_USE       [lsq][ptr] = true;
66
67                    break;
68                  }
69                case OPERATION_USE_LOAD_QUEUE :
70                  {
71//                  log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * use LOAD_QUEUE");
72
73                    uint32_t   lsq = internal_INSERT_LSQ [i];
74                    Tlsq_ptr_t ptr = internal_INSERT_PTR [i];
75                   
76//                  log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * lsq : %d",lsq);
77//                  log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * ptr : %d",ptr);
78
79                    reg_LOAD_QUEUE_PTR_WRITE [lsq]      = (ptr+1)%_param->_size_load_queue[lsq];
80                    reg_LOAD_QUEUE_USE       [lsq][ptr] = true;
81
82                    break;
83                  }
84                default :
85                  {
86                    break;
87                  }
88                }
89            }
90               
91        // =====================================================
92        // =====[ RETIRE ]======================================
93        // =====================================================
94        for (uint32_t i=0; i<_param->_nb_inst_retire; i++)
95          if (PORT_READ(in_RETIRE_VAL [i]) and internal_RETIRE_ACK [i])
96            {
97//            log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"RETIRE [%d]",i);
98
99              switch (internal_RETIRE_OPERATION_USE [i])
100                {
101                case OPERATION_USE_STORE_QUEUE :
102                  {
103//                  log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * use STORE_QUEUE");
104
105                    uint32_t   lsq = internal_RETIRE_LSQ [i];
106                    Tlsq_ptr_t ptr = internal_RETIRE_PTR [i];
107
108//                  log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * lsq : %d",lsq);
109//                  log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * ptr : %d",ptr);
110                   
111//                  reg_STORE_QUEUE_PTR_WRITE [lsq]      = ((ptr==0)?_param->_size_store_queue[lsq]:ptr)-1;
112                    reg_STORE_QUEUE_NB_USE    [lsq]      --;
113                    reg_STORE_QUEUE_USE       [lsq][ptr] = false;
114
115                    break;
116                  }
117                case OPERATION_USE_LOAD_QUEUE :
118                  {
119//                  log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * use LOAD_QUEUE");
120
121                    uint32_t   lsq = internal_RETIRE_LSQ [i];
122                    Tlsq_ptr_t ptr = internal_RETIRE_PTR [i];
123                   
124//                  log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * lsq : %d",lsq);
125//                  log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * ptr : %d",ptr);
126                   
127//                  reg_LOAD_QUEUE_PTR_WRITE [lsq]      = ((ptr==0)?_param->_size_load_queue[lsq]:ptr)-1;
128                    reg_LOAD_QUEUE_USE       [lsq][ptr] = false;
129                   
130                    break;
131                  }
132                default :
133                  {
134                    break;
135                  }
136                }       
137            }
138      }
139
140
141//     for (uint32_t i=0; i<_param->_nb_load_store_queue; i++)
142//       {
143//      std::string str;
144
145//      log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"LOAD_STORE_QUEUE [%d]",i);
146
147//      log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * STORE_QUEUE_PTR_WRITE : %d",reg_STORE_QUEUE_PTR_WRITE [i]);
148//      log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * STORE_QUEUE_NB_USE    : %d",reg_STORE_QUEUE_NB_USE    [i]);
149
150//      str = "";
151//      for (uint32_t j=0; j<_param->_size_store_queue[i]; j++)
152//        str += toString(reg_STORE_QUEUE_USE [i][j]) + " ";
153//      log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * %s",str.c_str());
154       
155//      log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * LOAD_QUEUE_PTR_WRITE  : %d",reg_LOAD_QUEUE_PTR_WRITE [i]);
156
157//      str = "";
158//      for (uint32_t j=0; j<_param->_size_load_queue[i]; j++)
159//        str += toString(reg_LOAD_QUEUE_USE [i][j]) + " ";
160//      log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * %s",str.c_str());
161//       }
162
163#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
164    end_cycle ();
165#endif
166
167    log_printf(FUNC,Load_Store_pointer_unit,FUNCTION,"End");
168  };
169
170}; // end namespace load_store_pointer_unit
171}; // end namespace rename_unit
172}; // end namespace ooo_engine
173}; // end namespace multi_ooo_engine
174}; // end namespace core
175
176}; // end namespace behavioural
177}; // end namespace morpheo             
178#endif
Note: See TracBrowser for help on using the repository browser.