source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Issue_queue/src/Issue_queue_function_out_of_order_genMoore.cpp @ 123

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

1) Fix performance
2) add auto generation to SPECINT2000
3) add reset in genMoore and genMealy

  • Property svn:keywords set to Id
File size: 11.4 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Issue_queue_function_out_of_order_genMoore.cpp 123 2009-06-08 20:43:30Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Issue_queue/include/Issue_queue.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_ooo_engine {
15namespace ooo_engine {
16namespace issue_queue {
17
18
19#undef  FUNCTION
20#define FUNCTION "Issue_queue::function_out_of_order_genMoore"
21  void Issue_queue::function_out_of_order_genMoore (void)
22  {
23    log_begin(Issue_queue,FUNCTION);
24    log_function(Issue_queue,FUNCTION,_name.c_str());
25
26    if (PORT_READ(in_NRESET))
27      {
28    // ===================================================================
29    // =====[ REEXECUTE_UNIT ]============================================
30    // ===================================================================
31    // Same implementation in in-order and out-of-order
32
33    // ===================================================================
34    // =====[ ISSUE_IN ]==================================================
35    // ===================================================================
36    {
37      Tcontrol_t ack [_param->_nb_rename_unit][_param->_max_nb_inst_rename];
38
39      // Initialisation
40      for (uint32_t i=0; i<_param->_nb_bank; i++)
41        internal_BANK_IN_ACK  [i] = false;
42   
43      for (uint32_t i=0; i<_param->_nb_rename_unit; i++)
44        for (uint32_t j=0; j<_param->_nb_inst_rename[i]; j++)
45          ack [i][j] = false;
46   
47      std::list<generic::priority::select_t> * select_reg = _priority_reg->select(); // same select for all issue
48     
49      // issue_in interface
50      std::list<generic::priority::select_t> * select_in = _priority_in ->select(); // same select for all issue
51      for (std::list<generic::priority::select_t>::iterator it=select_in ->begin();
52           it!=select_in ->end();
53           it++)
54        {
55          // Get num interface
56          uint32_t num_rename_unit = it->grp;
57          uint32_t num_inst_rename = it->elt;
58
59          log_printf(TRACE,Issue_queue,FUNCTION,"  * ISSUE_IN [%d][%d]",num_rename_unit,num_inst_rename);
60         
61          // scan all bank
62          for (std::list<generic::priority::select_t>::iterator it=select_reg->begin();
63               it!=select_reg->end();
64               it++)
65            {
66              uint32_t num_bank  = it->grp;
67
68              log_printf(TRACE,Issue_queue,FUNCTION,"    * BANK [%d]",num_bank);
69         
70              // test if bank is not busy (full or previous access)
71              if (not internal_BANK_IN_ACK [num_bank] and (_issue_queue[num_bank].size() < _param->_size_bank))
72                {
73                  log_printf(TRACE,Issue_queue,FUNCTION,"    * find");
74
75                  // find
76                  ack [num_rename_unit][num_inst_rename] = true;
77                  internal_BANK_IN_ACK             [num_bank] = true;
78                  internal_BANK_IN_NUM_RENAME_UNIT [num_bank] = num_rename_unit;
79                  internal_BANK_IN_NUM_INST        [num_bank] = num_inst_rename;
80                 
81                  break; // Stop scan
82                }
83              else
84                log_printf(TRACE,Issue_queue,FUNCTION,"    * not find");
85            }
86        }
87   
88      for (uint32_t i=0; i<_param->_nb_rename_unit; i++)
89        for (uint32_t j=0; j<_param->_nb_inst_rename[i]; j++)
90          PORT_WRITE(out_ISSUE_IN_ACK [i][j],ack [i][j]);
91    }
92
93    // ===================================================================
94    // =====[ ISSUE_OUT ]=================================================
95    // ===================================================================
96    {
97      Tcontrol_t val [_param->_nb_inst_issue];
98
99      for (uint32_t i=0; i<_param->_nb_inst_issue; i++)
100        val [i] = 0;
101
102      // From Reexecute_queue
103
104//       uint32_t num_reexecute_entry = 0;
105      for (std::list<entry_t*>::iterator it=_reexecute_queue.begin();
106           it!=_reexecute_queue.end();
107           ++it)
108        {
109          entry_t* entry = (*it);
110
111          for (uint32_t i=0; i<_param->_nb_inst_issue; i++)
112            // test if no previous transaction and can accept this type
113            if ((val[i] == 0)
114//                 and _param->_table_issue_type [i][entry->_type]
115                )
116              {
117                // find a issue port
118                val [i] = 1;
119           
120                if (_param->_have_port_context_id)
121                PORT_WRITE(out_ISSUE_OUT_CONTEXT_ID            [i], entry->_context_id           );
122                if (_param->_have_port_front_end_id)
123                PORT_WRITE(out_ISSUE_OUT_FRONT_END_ID          [i], entry->_front_end_id         );
124                if (_param->_have_port_rob_ptr  )
125                PORT_WRITE(out_ISSUE_OUT_PACKET_ID             [i], entry->_packet_id            );
126                PORT_WRITE(out_ISSUE_OUT_OPERATION             [i], entry->_operation            );
127                PORT_WRITE(out_ISSUE_OUT_TYPE                  [i], entry->_type                 );
128                PORT_WRITE(out_ISSUE_OUT_STORE_QUEUE_PTR_WRITE [i], entry->_store_queue_ptr_write);
129                PORT_WRITE(out_ISSUE_OUT_STORE_QUEUE_PTR_READ  [i], entry->_store_queue_ptr_read );
130                PORT_WRITE(out_ISSUE_OUT_STORE_QUEUE_EMPTY     [i], entry->_store_queue_empty    );
131                if (_param->_have_port_load_queue_ptr)
132                PORT_WRITE(out_ISSUE_OUT_LOAD_QUEUE_PTR_WRITE  [i], entry->_load_queue_ptr_write );
133                PORT_WRITE(out_ISSUE_OUT_HAS_IMMEDIAT          [i], entry->_has_immediat         );
134                PORT_WRITE(out_ISSUE_OUT_IMMEDIAT              [i], entry->_immediat             );
135                PORT_WRITE(out_ISSUE_OUT_READ_RA               [i], entry->_read_ra              );
136                PORT_WRITE(out_ISSUE_OUT_NUM_REG_RA            [i], entry->_num_reg_ra           );
137                PORT_WRITE(out_ISSUE_OUT_READ_RB               [i], entry->_read_rb              );
138                PORT_WRITE(out_ISSUE_OUT_NUM_REG_RB            [i], entry->_num_reg_rb           );
139                PORT_WRITE(out_ISSUE_OUT_READ_RC               [i], entry->_read_rc              );
140                PORT_WRITE(out_ISSUE_OUT_NUM_REG_RC            [i], entry->_num_reg_rc           );
141                PORT_WRITE(out_ISSUE_OUT_WRITE_RD              [i], entry->_write_rd             );
142                PORT_WRITE(out_ISSUE_OUT_NUM_REG_RD            [i], entry->_num_reg_rd           );
143                PORT_WRITE(out_ISSUE_OUT_WRITE_RE              [i], entry->_write_re             );
144                PORT_WRITE(out_ISSUE_OUT_NUM_REG_RE            [i], entry->_num_reg_re           );
145
146                internal_ISSUE_OUT_FROM_REEXECUTE [i] = true;
147//              internal_ISSUE_OUT_NUM_BANK       [i] = num_reexecute_entry;
148                internal_ISSUE_OUT_ENTRY          [i] = entry;
149
150                break; // stop scan
151              }
152//           num_reexecute_entry ++;
153        }
154
155      // From Issue_queue
156
157      std::list<generic::priority::select_t> * select = _priority_out->select(); // same select for all issue
158
159      for (std::list<generic::priority::select_t>::iterator it=select->begin();
160           it!=select->end();
161           it++)
162        {
163          uint32_t num_bank=it->grp;
164
165//        log_printf(TRACE,Issue_queue,Issue_queue,FUNCTION,"    * Bank [%d]",num_bank);
166
167          // Have instruction ?
168          if (not _issue_queue [num_bank].empty())
169            {
170//            log_printf(TRACE,Issue_queue,Issue_queue,FUNCTION,"      * Not Empty !!!");
171
172              entry_t* entry = _issue_queue [num_bank].front();
173             
174              for (uint32_t i=0; i<_param->_nb_inst_issue; i++)
175                // test if no previous transaction and can accept this type
176                if ((val[i] == 0)
177//                     and _param->_table_issue_type [i][entry->_type]
178                    )
179                  {
180                    // find a issue port
181                    val [i] = 1;
182
183                    if (_param->_have_port_context_id)
184                    PORT_WRITE(out_ISSUE_OUT_CONTEXT_ID            [i], entry->_context_id           );
185                    if (_param->_have_port_front_end_id)
186                    PORT_WRITE(out_ISSUE_OUT_FRONT_END_ID          [i], entry->_front_end_id         );
187                    if (_param->_have_port_rob_ptr  )
188                    PORT_WRITE(out_ISSUE_OUT_PACKET_ID             [i], entry->_packet_id            );
189                    PORT_WRITE(out_ISSUE_OUT_OPERATION             [i], entry->_operation            );
190                    PORT_WRITE(out_ISSUE_OUT_TYPE                  [i], entry->_type                 );
191                    PORT_WRITE(out_ISSUE_OUT_STORE_QUEUE_PTR_WRITE [i], entry->_store_queue_ptr_write);
192                    PORT_WRITE(out_ISSUE_OUT_STORE_QUEUE_PTR_READ  [i], entry->_store_queue_ptr_read );
193                    PORT_WRITE(out_ISSUE_OUT_STORE_QUEUE_EMPTY     [i], entry->_store_queue_empty    );
194                    if (_param->_have_port_load_queue_ptr)
195                    PORT_WRITE(out_ISSUE_OUT_LOAD_QUEUE_PTR_WRITE  [i], entry->_load_queue_ptr_write );
196                    PORT_WRITE(out_ISSUE_OUT_HAS_IMMEDIAT          [i], entry->_has_immediat         );
197                    PORT_WRITE(out_ISSUE_OUT_IMMEDIAT              [i], entry->_immediat             );
198                    PORT_WRITE(out_ISSUE_OUT_READ_RA               [i], entry->_read_ra              );
199                    PORT_WRITE(out_ISSUE_OUT_NUM_REG_RA            [i], entry->_num_reg_ra           );
200                    PORT_WRITE(out_ISSUE_OUT_READ_RB               [i], entry->_read_rb              );
201                    PORT_WRITE(out_ISSUE_OUT_NUM_REG_RB            [i], entry->_num_reg_rb           );
202                    PORT_WRITE(out_ISSUE_OUT_READ_RC               [i], entry->_read_rc              );
203                    PORT_WRITE(out_ISSUE_OUT_NUM_REG_RC            [i], entry->_num_reg_rc           );
204                    PORT_WRITE(out_ISSUE_OUT_WRITE_RD              [i], entry->_write_rd             );
205                    PORT_WRITE(out_ISSUE_OUT_NUM_REG_RD            [i], entry->_num_reg_rd           );
206                    PORT_WRITE(out_ISSUE_OUT_WRITE_RE              [i], entry->_write_re             );
207                    PORT_WRITE(out_ISSUE_OUT_NUM_REG_RE            [i], entry->_num_reg_re           );
208                   
209                    internal_ISSUE_OUT_FROM_REEXECUTE [i] = false;
210                    internal_ISSUE_OUT_NUM_BANK       [i] = num_bank;
211                    internal_ISSUE_OUT_ENTRY          [i] = entry;
212
213                    break; // stop scan
214                  }
215            }
216        }
217
218      for (uint32_t i=0; i<_param->_nb_inst_issue; i++)
219        {
220          internal_ISSUE_OUT_VAL [i] = val [i];
221        }
222    }
223      }
224    else
225      {
226        // Reset
227        for (uint32_t i=0; i<_param->_nb_bank; i++)
228          {
229            internal_BANK_IN_ACK  [i] = 0;
230//             internal_BANK_IN_NUM_RENAME_UNIT [num_bank] = num_rename_unit;
231//             internal_BANK_IN_NUM_INST        [num_bank] = num_inst_rename;
232          }
233        for (uint32_t i=0; i<_param->_nb_rename_unit; i++)
234          for (uint32_t j=0; j<_param->_nb_inst_rename[i]; j++)
235            PORT_WRITE(out_ISSUE_IN_ACK [i][j],0);
236
237          for (uint32_t i=0; i<_param->_nb_inst_issue; i++)
238            {
239              internal_ISSUE_OUT_VAL [i] = 0;
240//            internal_ISSUE_OUT_FROM_REEXECUTE [i] = true;
241//            internal_ISSUE_OUT_NUM_BANK       [i] = num_bank;
242//            internal_ISSUE_OUT_ENTRY          [i] = entry;
243            }
244      }
245
246    // Write output
247      for (uint32_t i=0; i<_param->_nb_inst_issue; i++)
248        {
249          PORT_WRITE(out_ISSUE_OUT_VAL [i], internal_ISSUE_OUT_VAL [i]);
250        }
251
252    log_end(Issue_queue,FUNCTION);
253  };
254
255}; // end namespace issue_queue
256}; // end namespace ooo_engine
257}; // end namespace multi_ooo_engine
258}; // end namespace core
259
260}; // end namespace behavioural
261}; // end namespace morpheo             
262#endif
Note: See TracBrowser for help on using the repository browser.