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 @ 110

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

1) OOO_egine : add stat to depiste low perf source
2) Commit : add stat
3) LSU_Pointer : retire - always ack (else combinatory loop). insert - max nb_inst_memory
4) TopLevel? : add debug_idle_time to stop combinatory loop.
5) Issue_queue : add reexecute_queue, new implementation (routage after issue_queue)
6) Decod / Predictor : add "can_continue"

  • Property svn:keywords set to Id
File size: 6.1 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Load_Store_pointer_unit_transition.cpp 110 2009-02-19 16:31:47Z rosiere $
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_begin(Load_Store_pointer_unit,FUNCTION);
25    log_function(Load_Store_pointer_unit,FUNCTION,_name.c_str());
26
27    if (PORT_READ(in_NRESET) == 0)
28      {
29        for (uint32_t i=0; i<_param->_nb_load_store_queue; i++)
30          {
31            reg_STORE_QUEUE_PTR_WRITE [i] = 0;
32            reg_STORE_QUEUE_NB_USE    [i] = 0;
33            reg_LOAD_QUEUE_PTR_WRITE  [i] = 0;
34           
35            for (uint32_t j=0; j<_param->_size_store_queue[i]; j++)
36              reg_STORE_QUEUE_USE [i][j] = false;
37            for (uint32_t j=0; j<_param->_size_load_queue[i]; j++)
38              reg_LOAD_QUEUE_USE  [i][j] = false;
39          }
40      }
41    else
42      {
43        // =====================================================
44        // =====[ INSERT ]======================================
45        // =====================================================
46       
47        for (uint32_t i=0; i<_param->_nb_inst_insert; i++)
48          if (PORT_READ(in_INSERT_VAL [i]) and internal_INSERT_ACK [i])
49            {
50              log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * INSERT [%d]",i);
51             
52              switch (internal_INSERT_OPERATION_USE [i])
53                {
54                case OPERATION_USE_STORE_QUEUE :
55                  {
56                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * use STORE_QUEUE");
57
58                    uint32_t   lsq = internal_INSERT_LSQ [i];
59                    Tlsq_ptr_t ptr = internal_INSERT_PTR [i];
60
61                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * lsq : %d",lsq);
62                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * ptr : %d",ptr);
63
64                    reg_STORE_QUEUE_PTR_WRITE [lsq]      = (ptr+1)%_param->_size_store_queue[lsq];
65                    reg_STORE_QUEUE_NB_USE    [lsq]      ++;
66                    reg_STORE_QUEUE_USE       [lsq][ptr] = true;
67
68                    break;
69                  }
70                case OPERATION_USE_LOAD_QUEUE :
71                  {
72                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * use LOAD_QUEUE");
73
74                    uint32_t   lsq = internal_INSERT_LSQ [i];
75                    Tlsq_ptr_t ptr = internal_INSERT_PTR [i];
76                   
77                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * lsq : %d",lsq);
78                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * ptr : %d",ptr);
79
80                    reg_LOAD_QUEUE_PTR_WRITE [lsq]      = (ptr+1)%_param->_size_load_queue[lsq];
81                    reg_LOAD_QUEUE_USE       [lsq][ptr] = true;
82
83                    break;
84                  }
85                default :
86                  {
87                    break;
88                  }
89                }
90            }
91               
92        // =====================================================
93        // =====[ RETIRE ]======================================
94        // =====================================================
95        for (uint32_t i=0; i<_param->_nb_inst_retire; i++)
96          if (PORT_READ(in_RETIRE_VAL [i]) and internal_RETIRE_ACK [i])
97            {
98              log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * RETIRE [%d]",i);
99
100              switch (internal_RETIRE_OPERATION_USE [i])
101                {
102                case OPERATION_USE_STORE_QUEUE :
103                  {
104                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * use STORE_QUEUE");
105
106                    uint32_t   lsq = internal_RETIRE_LSQ [i];
107                    Tlsq_ptr_t ptr = internal_RETIRE_PTR [i];
108
109                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * lsq : %d",lsq);
110                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * ptr : %d",ptr);
111                   
112//                  reg_STORE_QUEUE_PTR_WRITE [lsq]      = ((ptr==0)?_param->_size_store_queue[lsq]:ptr)-1;
113                    reg_STORE_QUEUE_NB_USE    [lsq]      --;
114                    reg_STORE_QUEUE_USE       [lsq][ptr] = false;
115
116                    break;
117                  }
118                case OPERATION_USE_LOAD_QUEUE :
119                  {
120                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * use LOAD_QUEUE");
121
122                    uint32_t   lsq = internal_RETIRE_LSQ [i];
123                    Tlsq_ptr_t ptr = internal_RETIRE_PTR [i];
124                   
125                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * lsq : %d",lsq);
126                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * ptr : %d",ptr);
127                   
128//                  reg_LOAD_QUEUE_PTR_WRITE [lsq]      = ((ptr==0)?_param->_size_load_queue[lsq]:ptr)-1;
129                    reg_LOAD_QUEUE_USE       [lsq][ptr] = false;
130                   
131                    break;
132                  }
133                default :
134                  {
135                    break;
136                  }
137                }       
138            }
139      }
140
141    // ===================================================================
142    // =====[ OTHER ]=====================================================
143    // ===================================================================
144
145#if (DEBUG >= DEBUG_TRACE) and (DEBUG_Commit_unit == true)
146    {
147      log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * Dump Load_Store_pointer Unit");
148     
149      for (uint32_t i=0; i<_param->_nb_load_store_queue; ++i)
150        {
151          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * Load_Store_unit [%d]",i);
152          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"      * reg_STORE_QUEUE_NB_USE    : %d", reg_STORE_QUEUE_NB_USE   [i]);
153          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"      * reg_STORE_QUEUE_PTR_WRITE : %d", reg_STORE_QUEUE_PTR_WRITE[i]);
154          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"      * reg_STORE_QUEUE_USE       :");
155          for (uint32_t j=0; j<_param->_size_store_queue [i]; ++j)
156          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"        [%d] %d",j,reg_STORE_QUEUE_USE [i][j]);
157          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"      * reg_LOAD_QUEUE_PTR_WRITE  : %d", reg_LOAD_QUEUE_PTR_WRITE [i]);
158          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"      * reg_LOAD_QUEUE_USE        :");
159          for (uint32_t j=0; j<_param->_size_load_queue [i]; ++j)
160          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"        [%d] %d",j,reg_LOAD_QUEUE_USE [i][j]);
161        }
162    }
163#endif
164
165#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
166    end_cycle ();
167#endif
168
169    log_end(Load_Store_pointer_unit,FUNCTION);
170  };
171
172}; // end namespace load_store_pointer_unit
173}; // end namespace rename_unit
174}; // end namespace ooo_engine
175}; // end namespace multi_ooo_engine
176}; // end namespace core
177
178}; // end namespace behavioural
179}; // end namespace morpheo             
180#endif
Note: See TracBrowser for help on using the repository browser.