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
Line 
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
26    if (PORT_READ(in_NRESET))
27    // ===================================================================
28    // =====[ ISSUE_OUT ]=================================================
29    // ===================================================================
30      {
31      Tcontrol_t val [_param->_nb_inst_issue];
32
33      uint32_t index=0;
34      for (uint32_t i=0; i<_param->_nb_inst_issue; i++)
35        val [i] = 0;
36
37      //--------------------------------------
38      // From Reexecute_queue
39      //--------------------------------------
40
41      // scan all reexecute_queue slot ...
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
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                 );
59          PORT_WRITE(out_ISSUE_OUT_CANCEL                [index], 0                            );
60          PORT_WRITE(out_ISSUE_OUT_STORE_QUEUE_PTR_WRITE [index], entry->_store_queue_ptr_write);
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    );
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           );
77
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;
81
82          index ++; // next slot
83        }
84     
85      //--------------------------------------
86      // From Issue_queue
87      //--------------------------------------
88      index = _param->_nb_inst_reexecute;
89
90      log_printf(TRACE,Issue_queue,FUNCTION,"  * From Issue_queue");
91
92      // for all instruction in issue_queue head ...
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         
99//           bool find = false;
100         
101          // ... test if have an instruction
102          if (not _issue_queue [num_bank].empty())
103            {
104              log_printf(TRACE,Issue_queue,FUNCTION,"      * Not Empty !!!");
105
106              // read instruction
107              entry_t* entry = _issue_queue [num_bank].front();
108             
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]);
115
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//                 }
123
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                 );
135              PORT_WRITE(out_ISSUE_OUT_CANCEL                [index], 0                            );
136              PORT_WRITE(out_ISSUE_OUT_STORE_QUEUE_PTR_WRITE [index], entry->_store_queue_ptr_write);
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    );
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
159            }
160
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//             }
167        }
168     
169      // Output
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]);
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);
178        }
179    }
180    else
181      {
182      for (uint32_t i=0; i<_param->_nb_inst_issue; i++)
183        internal_ISSUE_OUT_VAL [i] = 0;
184      }
185
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
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.