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

Last change on this file since 77 was 77, checked in by rosiere, 16 years ago
  • Add two component :
    • network between read unit and execute unit
    • network between execute unit and write unit
  • remove parameters "nb_operation" and "nb_type"
  • in write_queue add the special case : load_speculative
File size: 3.2 KB
Line 
1#ifdef SYSTEMC
2//#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
3/*
4 * $Id$
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
22#undef  FUNCTION
23#define FUNCTION "Write_queue::transition"
24  void Write_queue::transition (void)
25  {
26    log_printf(FUNC,Write_queue,FUNCTION,"Begin");
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_packet_id    )?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_WRITE_RD     ),
57               PORT_READ(in_WRITE_QUEUE_IN_NUM_REG_RD   ),
58               PORT_READ(in_WRITE_QUEUE_IN_DATA_RD      ),
59               PORT_READ(in_WRITE_QUEUE_IN_WRITE_RE     ),
60               PORT_READ(in_WRITE_QUEUE_IN_NUM_REG_RE   ),
61               PORT_READ(in_WRITE_QUEUE_IN_DATA_RE      ),
62               PORT_READ(in_WRITE_QUEUE_IN_EXCEPTION    ),
63               PORT_READ(in_WRITE_QUEUE_IN_NO_SEQUENCE  ),
64               PORT_READ(in_WRITE_QUEUE_IN_ADDRESS      ));
65           
66            _queue->push_back(entry);
67          }
68
69        // Test if pop :
70        //  * transaction on write_queue_out interface
71        //  * have a speculative load and all register is write in registerfile
72        if ( (internal_WRITE_QUEUE_OUT_VAL and PORT_READ(in_WRITE_QUEUE_OUT_ACK)) or
73             ((_queue->empty() == false)                                         and
74              (_queue->front()->_type      == TYPE_MEMORY)                       and
75              (_queue->front()->_exception == EXCEPTION_MEMORY_LOAD_SPECULATIVE) and
76              (_queue->front()->_write_rd  == 0)                                 and
77              (_queue->front()->_write_re  == 0)))
78          {
79            delete _queue->front();
80            _queue->pop_front();
81          }
82      }
83
84#ifdef STATISTICS
85    *(_stat_use_queue) += _queue->size();
86#endif
87
88#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
89    end_cycle ();
90#endif
91
92    log_printf(FUNC,Write_queue,FUNCTION,"End");
93  };
94
95}; // end namespace write_queue
96}; // end namespace write_unit
97}; // end namespace multi_write_unit
98}; // end namespace execute_loop
99}; // end namespace multi_execute_loop
100}; // end namespace core
101
102}; // end namespace behavioural
103}; // end namespace morpheo             
104#endif
105//#endif
Note: See TracBrowser for help on using the repository browser.