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

Last change on this file since 136 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.