source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Load_Store_pointer_unit/src/Load_Store_pointer_unit_genMealy_insert.cpp @ 145

Last change on this file since 145 was 145, checked in by rosiere, 14 years ago

1) add test with SPECINT2K
2) new config of Selftest
3) modif RAT to support multiple depth_save ... but not finish (need fix Update Prediction Table)
4) add Function_pointer but need fix

  • Property svn:keywords set to Id
File size: 7.0 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Load_Store_pointer_unit_genMealy_insert.cpp 145 2010-10-13 18:15:51Z 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::genMealy_insert"
22  void Load_Store_pointer_unit::genMealy_insert (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))
28      {
29    // Limit at nb_inst_memory access per load_store_queue
30    // uint32_t   nb_use_lsq            [_param->_nb_load_store_queue];
31    Tlsq_ptr_t STORE_QUEUE_PTR_WRITE [_param->_nb_load_store_queue];
32    bool       STORE_QUEUE_USE       [_param->_nb_load_store_queue][_param->_max_size_store_queue];
33    Tlsq_ptr_t STORE_QUEUE_NB_USE    [_param->_nb_load_store_queue];
34    Tlsq_ptr_t LOAD_QUEUE_PTR_WRITE  [_param->_nb_load_store_queue];
35    bool       LOAD_QUEUE_USE        [_param->_nb_load_store_queue][_param->_max_size_load_queue];
36   
37    for (uint32_t i=0; i<_param->_nb_load_store_queue; i++)
38      {
39        // nb_use_lsq            [i] = _param->_nb_inst_memory[i];
40
41        STORE_QUEUE_PTR_WRITE [i] = reg_STORE_QUEUE_PTR_WRITE [i];
42        STORE_QUEUE_NB_USE    [i] = reg_STORE_QUEUE_NB_USE    [i];
43        LOAD_QUEUE_PTR_WRITE  [i] = reg_LOAD_QUEUE_PTR_WRITE  [i];
44       
45        for (uint32_t j=0; j<_param->_size_store_queue[i]; j++)
46          STORE_QUEUE_USE [i][j] = reg_STORE_QUEUE_USE [i][j];
47        for (uint32_t j=0; j<_param->_size_load_queue[i]; j++)
48          LOAD_QUEUE_USE  [i][j] = reg_LOAD_QUEUE_USE  [i][j];
49      }
50
51    for (uint32_t i=0; i<_param->_nb_inst_insert; i++)
52      {
53        log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * INSERT [%d]",i);
54
55        Tcontrol_t ack  = false;
56        bool       find = false;
57
58        if (PORT_READ(in_INSERT_VAL [i]) == true)
59          {
60            Tcontext_t front_end_id = (_param->_have_port_front_end_id)?PORT_READ(in_INSERT_FRONT_END_ID [i]):0;
61            Tcontext_t context_id   = (_param->_have_port_context_id  )?PORT_READ(in_INSERT_CONTEXT_ID   [i]):0; 
62            uint32_t   lsq          = _param->_link_load_store_unit_with_thread[front_end_id][context_id];
63           
64            log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * front_end_id : %d",front_end_id);
65            log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * context_id   : %d",context_id  );
66            log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * lsq          : %d",lsq         );
67           
68            PORT_WRITE(out_INSERT_STORE_QUEUE_PTR_WRITE [i], STORE_QUEUE_PTR_WRITE [lsq]);
69//          PORT_WRITE(out_INSERT_STORE_QUEUE_PTR_READ  [i], ((reg_STORE_QUEUE_PTR_READ  [front_end_id][context_id]+1)%_param->_size_load_queue[lsq]));
70            PORT_WRITE(out_INSERT_STORE_QUEUE_PTR_READ  [i], reg_STORE_QUEUE_PTR_READ  [front_end_id][context_id]);
71            PORT_WRITE(out_INSERT_STORE_QUEUE_EMPTY     [i], reg_STORE_QUEUE_EMPTY     [front_end_id][context_id]);
72            if (_param->_have_port_load_queue_ptr)
73            PORT_WRITE(out_INSERT_LOAD_QUEUE_PTR_WRITE  [i], LOAD_QUEUE_PTR_WRITE  [lsq]);
74
75            if (PORT_READ(in_INSERT_TYPE [i]) == TYPE_MEMORY)
76              {
77                log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * type is memory");
78               
79                find = true;
80               
81                // Test if a previous instruction use the same lsq
82                // Authorize once memory access by load store unit
83                // if (nb_use_lsq [lsq] > 0)
84                  {
85                    // nb_use_lsq [lsq] --;
86                   
87                    uint32_t   ptr;
88                   
89                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * sq_ptr_write : %d",STORE_QUEUE_PTR_WRITE [lsq]);
90                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * lq_ptr_write : %d",LOAD_QUEUE_PTR_WRITE [lsq]);
91                   
92                    // operation became of decod_stage. Also operation is != store_head_ok and store_head_ko
93                    if (is_operation_memory_store(PORT_READ(in_INSERT_OPERATION [i])))
94                      {
95                        log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * USE_STORE_QUEUE");
96                       
97                        internal_INSERT_OPERATION_USE [i] = OPERATION_USE_STORE_QUEUE;
98                       
99                        ptr = STORE_QUEUE_PTR_WRITE [lsq];
100                        ack = not STORE_QUEUE_USE [lsq][ptr] and (static_cast<uint32_t>(STORE_QUEUE_NB_USE [lsq]+1) < _param->_size_store_queue[lsq]);
101                       
102                        if (ack)
103                          {
104                            STORE_QUEUE_PTR_WRITE [lsq]      = (ptr+1)%_param->_size_store_queue[lsq];
105                            STORE_QUEUE_NB_USE    [lsq]      ++;
106                            STORE_QUEUE_USE       [lsq][ptr] = true;
107                          }
108                      }
109                    else
110                      {
111                        log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * USE_LOAD_QUEUE");
112                       
113                        internal_INSERT_OPERATION_USE [i] = OPERATION_USE_LOAD_QUEUE;
114                       
115                        ptr = LOAD_QUEUE_PTR_WRITE [lsq];
116                        ack = (not LOAD_QUEUE_USE [lsq][ptr]);
117                       
118                        if (ack)
119                          {
120                            LOAD_QUEUE_PTR_WRITE [lsq]      = (ptr+1)%_param->_size_load_queue[lsq];
121                            LOAD_QUEUE_USE       [lsq][ptr] = true;
122                          }
123                      }
124                   
125                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * ptr          : %d",ptr         );
126                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * ack          : %d",ack         );
127                   
128                    internal_INSERT_LSQ [i] = lsq;
129                    internal_INSERT_PTR [i] = ptr;
130                  }
131              }
132          }
133
134        if (not find)
135          {
136            ack = true;
137           
138            internal_INSERT_OPERATION_USE [i] = OPERATION_USE_NONE;
139          }
140
141
142        // Write output
143        internal_INSERT_ACK [i] = ack;
144      }
145      }
146    else
147      {
148        for (uint32_t i=0; i<_param->_nb_inst_insert; i++)
149          internal_INSERT_ACK [i] = 0;
150      }
151   
152    for (uint32_t i=0; i<_param->_nb_inst_insert; i++)
153      PORT_WRITE(out_INSERT_ACK [i], internal_INSERT_ACK [i]);
154
155    log_end(Load_Store_pointer_unit,FUNCTION);
156  };
157
158}; // end namespace load_store_pointer_unit
159}; // end namespace rename_unit
160}; // end namespace ooo_engine
161}; // end namespace multi_ooo_engine
162}; // end namespace core
163
164}; // end namespace behavioural
165}; // end namespace morpheo             
166#endif
Note: See TracBrowser for help on using the repository browser.