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

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

Modif for performance :
1) Load Store Unit : store send request to valid exeception
2) Commit_unit : retire can bypass store
3) Commit_unit : add stat to manage store instruction
4) Load Store Unit and Load Store Pointer Manager : add store_queue_ptr_read
5) Fix lot of bug

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