source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Write_unit/Write_unit/Write_queue/src/Write_queue_transition.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: 5.9 KB
Line 
1#ifdef SYSTEMC
2//#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
3/*
4 * $Id: Write_queue_transition.cpp 136 2009-10-20 18:52:15Z rosiere $
5 *
6 * [ Description ]
7 *
8 */
9
10#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Write_unit/Write_unit/Write_queue/include/Write_queue.h"
11
12namespace morpheo                    {
13namespace behavioural {
14namespace core {
15namespace multi_execute_loop {
16namespace execute_loop {
17namespace multi_write_unit {
18namespace write_unit {
19namespace write_queue {
20
21#undef  FUNCTION
22#define FUNCTION "Write_queue::transition"
23  void Write_queue::transition (void)
24  {
25    log_begin(Write_queue,FUNCTION);
26    log_function(Write_queue,FUNCTION,_name.c_str());
27
28    if (PORT_READ(in_NRESET) == 0)
29      {
30        // Flush queue
31        // FIXME "queue reset"
32        // > 1) flush one slot by cycle
33        // > 2) flush all slot in one cycle
34
35        while (_queue->empty() == false)
36          _queue->pop_front();
37      }
38    else
39      {
40        // Test access at gpr and spr
41        if (internal_GPR_WRITE_VAL and PORT_READ(in_GPR_WRITE_ACK[0]))
42          _queue->front()->_write_rd = 0;
43        if (internal_SPR_WRITE_VAL and PORT_READ(in_SPR_WRITE_ACK[0]))
44          _queue->front()->_write_re = 0;
45
46        // Test if push
47        if (PORT_READ(in_WRITE_QUEUE_IN_VAL) and internal_WRITE_QUEUE_IN_ACK)
48          {
49            write_queue_entry_t * entry = new write_queue_entry_t
50              ((_param->_have_port_context_id   )?PORT_READ(in_WRITE_QUEUE_IN_CONTEXT_ID   ):0,
51               (_param->_have_port_front_end_id )?PORT_READ(in_WRITE_QUEUE_IN_FRONT_END_ID ):0,
52               (_param->_have_port_ooo_engine_id)?PORT_READ(in_WRITE_QUEUE_IN_OOO_ENGINE_ID):0,
53               (_param->_have_port_rob_ptr      )?PORT_READ(in_WRITE_QUEUE_IN_PACKET_ID    ):0,
54             //PORT_READ(in_WRITE_QUEUE_IN_OPERATION    ),
55             //PORT_READ(in_WRITE_QUEUE_IN_TYPE         ),
56               PORT_READ(in_WRITE_QUEUE_IN_CANCEL       ),
57               PORT_READ(in_WRITE_QUEUE_IN_WRITE_RD     ),
58               PORT_READ(in_WRITE_QUEUE_IN_NUM_REG_RD   ),
59               PORT_READ(in_WRITE_QUEUE_IN_DATA_RD      ),
60               PORT_READ(in_WRITE_QUEUE_IN_WRITE_RE     ),
61               PORT_READ(in_WRITE_QUEUE_IN_NUM_REG_RE   ),
62               PORT_READ(in_WRITE_QUEUE_IN_DATA_RE      ),
63               PORT_READ(in_WRITE_QUEUE_IN_EXCEPTION    ),
64               PORT_READ(in_WRITE_QUEUE_IN_NO_SEQUENCE  ),
65               PORT_READ(in_WRITE_QUEUE_IN_ADDRESS      ));
66           
67            _queue->push_back(entry);
68          }
69
70        // Test if pop :
71        //  * transaction on write_queue_out interface
72        //  * have a speculative load and all register is write in registerfile
73        if ( (internal_WRITE_QUEUE_OUT_VAL and PORT_READ(in_WRITE_QUEUE_OUT_ACK)) or
74             ((_queue->empty() == false)                                         and
75//            (_queue->front()->_type      == TYPE_MEMORY)                       and
76              (_queue->front()->_exception == EXCEPTION_MEMORY_LOAD_SPECULATIVE) and // this exception code must be uniq
77              (_queue->front()->_write_rd  == 0)                                 and
78              (_queue->front()->_write_re  == 0)))
79          {
80            delete _queue->front();
81            _queue->pop_front();
82          }
83      }
84
85#ifdef STATISTICS
86    if (usage_is_set(_usage,USE_STATISTICS))
87      *(_stat_use_queue) += _queue->size();
88#endif
89
90#if DEBUG_Write_queue and (DEBUG >= DEBUG_TRACE)
91    log_printf(TRACE,Write_queue,FUNCTION,"  * Dump Write_queue");
92    {
93      uint32_t i=0;
94     
95      for (std::list<write_queue_entry_t *>::iterator it=_queue->begin();
96           it!=_queue->end();
97           ++it)
98        {
99          log_printf(TRACE,Write_queue,FUNCTION,"  [%d] %.2d %.2d %.2d, %.4d, %.1d, %.1d %.4d %.8x, %.1d %.4d %.1d, %.2d %.1d, %.8x",
100                     i,
101                     (*it)->_context_id   ,
102                     (*it)->_front_end_id ,
103                     (*it)->_ooo_engine_id,
104                     (*it)->_packet_id    ,
105                   //(*it)->_operation    ,
106                   //(*it)->_type         ,
107                     (*it)->_cancel       ,
108                     (*it)->_write_rd     ,
109                     (*it)->_num_reg_rd   ,
110                     (*it)->_data_rd      ,
111                     (*it)->_write_re     ,
112                     (*it)->_num_reg_re   ,
113                     (*it)->_data_re      ,
114                     (*it)->_exception    ,
115                     (*it)->_no_sequence  ,
116                     (*it)->_address      );
117
118//           log_printf(TRACE,Write_queue,FUNCTION,"    * context_id   : %d",  (*it)->_context_id   );
119//           log_printf(TRACE,Write_queue,FUNCTION,"    * front_end_id : %d",  (*it)->_front_end_id );
120//           log_printf(TRACE,Write_queue,FUNCTION,"    * ooo_engine_id: %d",  (*it)->_ooo_engine_id);
121//           log_printf(TRACE,Write_queue,FUNCTION,"    * packet_id    : %d",  (*it)->_packet_id    );
122//           log_printf(TRACE,Write_queue,FUNCTION,"    * write_rd     : %d",  (*it)->_write_rd     );
123//           log_printf(TRACE,Write_queue,FUNCTION,"    * num_reg_rd   : %d",  (*it)->_num_reg_rd   );
124//           log_printf(TRACE,Write_queue,FUNCTION,"    * data_rd      : %d",  (*it)->_data_rd      );
125//           log_printf(TRACE,Write_queue,FUNCTION,"    * write_re     : %d",  (*it)->_write_re     );
126//           log_printf(TRACE,Write_queue,FUNCTION,"    * num_reg_re   : %d",  (*it)->_num_reg_re   );
127//           log_printf(TRACE,Write_queue,FUNCTION,"    * data_re      : %d",  (*it)->_data_re      );
128//           log_printf(TRACE,Write_queue,FUNCTION,"    * exception    : %d",  (*it)->_exception    );
129//           log_printf(TRACE,Write_queue,FUNCTION,"    * no_sequence  : %d",  (*it)->_no_sequence  );
130//           log_printf(TRACE,Write_queue,FUNCTION,"    * address      : %d",  (*it)->_address      );
131
132          i++;
133        }
134    }
135#endif
136
137#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
138    end_cycle ();
139#endif
140
141    log_end(Write_queue,FUNCTION);
142  };
143
144}; // end namespace write_queue
145}; // end namespace write_unit
146}; // end namespace multi_write_unit
147}; // end namespace execute_loop
148}; // end namespace multi_execute_loop
149}; // end namespace core
150
151}; // end namespace behavioural
152}; // end namespace morpheo             
153#endif
154//#endif
Note: See TracBrowser for help on using the repository browser.