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

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

1) Platforms : add new organization for test
2) Load_Store_Unit : add array to count nb_check in store_queue
3) Issue_queue and Core_Glue : rewrite the issue network
4) Special_Register_Unit : add reset value to register CID
5) Softwares : add multicontext test
6) Softwares : add SPECINT
7) Softwares : add MiBench?
7) Read_queue : inhib access for r0
8) Change Core_Glue (network) - dont yet support priority and load balancing scheme

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