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

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

1) Add new algo in ifetch queue
2) Add Cancel bit
3) new config

  • Property svn:keywords set to Id
File size: 9.1 KB
RevLine 
[111]1#ifdef SYSTEMC
2/*
3 * $Id: Issue_queue_function_in_order_genMealy_issue_out.cpp 136 2009-10-20 18:52:15Z 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_in_order_genMealy_issue_out"
21  void Issue_queue::function_in_order_genMealy_issue_out (void)
22  {
23    log_begin(Issue_queue,FUNCTION);
24    log_function(Issue_queue,FUNCTION,_name.c_str());
25
[123]26    if (PORT_READ(in_NRESET))
[111]27    // ===================================================================
28    // =====[ ISSUE_OUT ]=================================================
29    // ===================================================================
[123]30      {
[111]31      Tcontrol_t val [_param->_nb_inst_issue];
32
[117]33      uint32_t index=0;
[111]34      for (uint32_t i=0; i<_param->_nb_inst_issue; i++)
35        val [i] = 0;
36
[117]37      //--------------------------------------
[111]38      // From Reexecute_queue
[117]39      //--------------------------------------
[111]40
[117]41      // scan all reexecute_queue slot ...
[111]42//       uint32_t num_reexecute_entry = 0;
43      for (std::list<entry_t*>::iterator it=_reexecute_queue.begin();
44           it!=_reexecute_queue.end();
45           ++it)
46        {
47          entry_t* entry = (*it);
48
[117]49          val [index] = 1;
50             
51          if (_param->_have_port_context_id)
52          PORT_WRITE(out_ISSUE_OUT_CONTEXT_ID            [index], entry->_context_id           );
53          if (_param->_have_port_front_end_id)
54          PORT_WRITE(out_ISSUE_OUT_FRONT_END_ID          [index], entry->_front_end_id         );
55          if (_param->_have_port_rob_ptr  )
56          PORT_WRITE(out_ISSUE_OUT_PACKET_ID             [index], entry->_packet_id            );
57          PORT_WRITE(out_ISSUE_OUT_OPERATION             [index], entry->_operation            );
58          PORT_WRITE(out_ISSUE_OUT_TYPE                  [index], entry->_type                 );
[136]59          PORT_WRITE(out_ISSUE_OUT_CANCEL                [index], 0                            );
[117]60          PORT_WRITE(out_ISSUE_OUT_STORE_QUEUE_PTR_WRITE [index], entry->_store_queue_ptr_write);
[122]61          PORT_WRITE(out_ISSUE_OUT_STORE_QUEUE_PTR_READ  [index], entry->_store_queue_ptr_read );
62          PORT_WRITE(out_ISSUE_OUT_STORE_QUEUE_EMPTY     [index], entry->_store_queue_empty    );
[117]63          if (_param->_have_port_load_queue_ptr)
64          PORT_WRITE(out_ISSUE_OUT_LOAD_QUEUE_PTR_WRITE  [index], entry->_load_queue_ptr_write );
65          PORT_WRITE(out_ISSUE_OUT_HAS_IMMEDIAT          [index], entry->_has_immediat         );
66          PORT_WRITE(out_ISSUE_OUT_IMMEDIAT              [index], entry->_immediat             );
67          PORT_WRITE(out_ISSUE_OUT_READ_RA               [index], entry->_read_ra              );
68          PORT_WRITE(out_ISSUE_OUT_NUM_REG_RA            [index], entry->_num_reg_ra           );
69          PORT_WRITE(out_ISSUE_OUT_READ_RB               [index], entry->_read_rb              );
70          PORT_WRITE(out_ISSUE_OUT_NUM_REG_RB            [index], entry->_num_reg_rb           );
71          PORT_WRITE(out_ISSUE_OUT_READ_RC               [index], entry->_read_rc              );
72          PORT_WRITE(out_ISSUE_OUT_NUM_REG_RC            [index], entry->_num_reg_rc           );
73          PORT_WRITE(out_ISSUE_OUT_WRITE_RD              [index], entry->_write_rd             );
74          PORT_WRITE(out_ISSUE_OUT_NUM_REG_RD            [index], entry->_num_reg_rd           );
75          PORT_WRITE(out_ISSUE_OUT_WRITE_RE              [index], entry->_write_re             );
76          PORT_WRITE(out_ISSUE_OUT_NUM_REG_RE            [index], entry->_num_reg_re           );
[111]77
[117]78          internal_ISSUE_OUT_FROM_REEXECUTE [index] = true;
79//        internal_ISSUE_OUT_NUM_BANK       [index] = num_reexecute_entry;
80          internal_ISSUE_OUT_ENTRY          [index] = entry;
[111]81
[117]82          index ++; // next slot
[111]83        }
[117]84     
85      //--------------------------------------
86      // From Issue_queue
87      //--------------------------------------
88      index = _param->_nb_inst_reexecute;
[111]89
[117]90      log_printf(TRACE,Issue_queue,FUNCTION,"  * From Issue_queue");
91
92      // for all instruction in issue_queue head ...
[111]93      for (uint32_t i=0; i<_param->_nb_bank; ++i)
94        {
95          uint32_t num_bank=(reg_NUM_BANK_HEAD+i)%_param->_nb_bank;
96         
97          log_printf(TRACE,Issue_queue,FUNCTION,"    * Bank [%d]",num_bank);
98         
[117]99//           bool find = false;
[111]100         
[117]101          // ... test if have an instruction
[111]102          if (not _issue_queue [num_bank].empty())
103            {
104              log_printf(TRACE,Issue_queue,FUNCTION,"      * Not Empty !!!");
105
[117]106              // read instruction
[111]107              entry_t* entry = _issue_queue [num_bank].front();
108             
[117]109//               Tcontrol_t issue_ack = PORT_READ(in_ISSUE_OUT_ACK [index]);
110             
111              log_printf(TRACE,Issue_queue,FUNCTION,"      * Issue [%d]",index);
112//               log_printf(TRACE,Issue_queue,FUNCTION,"        * issue_ack            : %d",issue_ack);
113//            log_printf(TRACE,Issue_queue,FUNCTION,"        * previous transaction : %d",val[index]);
114//            log_printf(TRACE,Issue_queue,FUNCTION,"        * can issue type       : %d",_param->_table_issue_type [index][entry->_type]);
[111]115
[117]116              // in_order : test if find a valid read_unit
117//               if (issue_ack)
118//                 {
119//                log_printf(TRACE,Issue_queue,FUNCTION,"        * find !!!");
120                 
121//                   find = true;
122//                 }
[115]123
[117]124              // find a issue port
125              val [index] = true; // instruction is valid
126             
127              if (_param->_have_port_context_id)
128              PORT_WRITE(out_ISSUE_OUT_CONTEXT_ID            [index], entry->_context_id           );
129              if (_param->_have_port_front_end_id)
130              PORT_WRITE(out_ISSUE_OUT_FRONT_END_ID          [index], entry->_front_end_id         );
131              if (_param->_have_port_rob_ptr  )
132              PORT_WRITE(out_ISSUE_OUT_PACKET_ID             [index], entry->_packet_id            );
133              PORT_WRITE(out_ISSUE_OUT_OPERATION             [index], entry->_operation            );
134              PORT_WRITE(out_ISSUE_OUT_TYPE                  [index], entry->_type                 );
[136]135              PORT_WRITE(out_ISSUE_OUT_CANCEL                [index], 0                            );
[117]136              PORT_WRITE(out_ISSUE_OUT_STORE_QUEUE_PTR_WRITE [index], entry->_store_queue_ptr_write);
[122]137              PORT_WRITE(out_ISSUE_OUT_STORE_QUEUE_PTR_READ  [index], entry->_store_queue_ptr_read );
138              PORT_WRITE(out_ISSUE_OUT_STORE_QUEUE_EMPTY     [index], entry->_store_queue_empty    );
[117]139              if (_param->_have_port_load_queue_ptr)
140              PORT_WRITE(out_ISSUE_OUT_LOAD_QUEUE_PTR_WRITE  [index], entry->_load_queue_ptr_write );
141              PORT_WRITE(out_ISSUE_OUT_HAS_IMMEDIAT          [index], entry->_has_immediat         );
142              PORT_WRITE(out_ISSUE_OUT_IMMEDIAT              [index], entry->_immediat             );
143              PORT_WRITE(out_ISSUE_OUT_READ_RA               [index], entry->_read_ra              );
144              PORT_WRITE(out_ISSUE_OUT_NUM_REG_RA            [index], entry->_num_reg_ra           );
145              PORT_WRITE(out_ISSUE_OUT_READ_RB               [index], entry->_read_rb              );
146              PORT_WRITE(out_ISSUE_OUT_NUM_REG_RB            [index], entry->_num_reg_rb           );
147              PORT_WRITE(out_ISSUE_OUT_READ_RC               [index], entry->_read_rc              );
148              PORT_WRITE(out_ISSUE_OUT_NUM_REG_RC            [index], entry->_num_reg_rc           );
149              PORT_WRITE(out_ISSUE_OUT_WRITE_RD              [index], entry->_write_rd             );
150              PORT_WRITE(out_ISSUE_OUT_NUM_REG_RD            [index], entry->_num_reg_rd           );
151              PORT_WRITE(out_ISSUE_OUT_WRITE_RE              [index], entry->_write_re             );
152              PORT_WRITE(out_ISSUE_OUT_NUM_REG_RE            [index], entry->_num_reg_re           );
153             
154              internal_ISSUE_OUT_FROM_REEXECUTE [index] = false;
155              internal_ISSUE_OUT_NUM_BANK       [index] = num_bank;
156              internal_ISSUE_OUT_ENTRY          [index] = entry;
157
158              index ++; // next slot
[111]159            }
160
[117]161//           if (not find)
162//             {
163//            log_printf(TRACE,Issue_queue,FUNCTION,"      * Not find. Stop Scan (in order)");
164             
165//               break; // stop scan (in order)
166//             }
[111]167        }
[117]168     
169      // Output
[111]170      for (uint32_t i=0; i<_param->_nb_inst_issue; i++)
171        {
172          internal_ISSUE_OUT_VAL [i] = val [i];
173          PORT_WRITE(out_ISSUE_OUT_VAL [i], internal_ISSUE_OUT_VAL [i]);
[117]174
175//           // Type invalid to the Core_Glue network
176//           if (not val [i]) // == empty
177//             PORT_WRITE(out_ISSUE_OUT_TYPE [i], TYPE_INVALID);
[111]178        }
179    }
[123]180    else
181      {
182      for (uint32_t i=0; i<_param->_nb_inst_issue; i++)
183        internal_ISSUE_OUT_VAL [i] = 0;
184      }
[111]185
[123]186    for (uint32_t i=0; i<_param->_nb_inst_issue; i++)
187      PORT_WRITE(out_ISSUE_OUT_VAL [i], internal_ISSUE_OUT_VAL [i]);
188
[111]189    log_end(Issue_queue,FUNCTION);
190  };
191
192}; // end namespace issue_queue
193}; // end namespace ooo_engine
194}; // end namespace multi_ooo_engine
195}; // end namespace core
196
197}; // end namespace behavioural
198}; // end namespace morpheo             
199#endif
Note: See TracBrowser for help on using the repository browser.