source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Reexecute_unit/src/Reexecute_unit_transition.cpp @ 88

Last change on this file since 88 was 88, checked in by rosiere, 16 years ago

Almost complete design
with Test and test platform

  • Property svn:keywords set to Id
File size: 5.0 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Reexecute_unit_transition.cpp 88 2008-12-10 18:31:39Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Reexecute_unit/include/Reexecute_unit.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_ooo_engine {
15namespace ooo_engine {
16namespace reexecute_unit {
17
18
19#undef  FUNCTION
20#define FUNCTION "Reexecute_unit::transition"
21  void Reexecute_unit::transition (void)
22  {
23    log_begin(Reexecute_unit,FUNCTION);
24
25    if (PORT_READ(in_NRESET) == 0)
26      {
27        _priority_execute_loop->reset();
28        _priority_queue_in    ->reset();
29
30        for (uint32_t i=0; i<_param->_nb_bank; i++)
31          _reexecute_queue [i].clear();
32      }
33    else
34      {
35        _priority_execute_loop->transition();
36        _priority_queue_in    ->transition();
37
38        // ===================================================================
39        // =====[ EXECUTE_LOOP / COMMIT ]=====================================
40        // ===================================================================
41        for (uint32_t i=0; i<_param->_nb_bank; ++i)
42          if (internal_QUEUE_PUSH [i])
43            {
44              entry_t * entry = new entry_t;
45              _reexecute_queue [i].push_back(entry);
46
47              uint32_t x = internal_QUEUE_NUM_EXECUTE_LOOP [i];
48              uint32_t y = internal_QUEUE_NUM_INST_EXECUTE [i];
49              uint32_t z = internal_QUEUE_NUM_INST_COMMIT  [i];
50             
51              entry->state        = STATE_SPR_ACCESS;
52              entry->context_id   = (_param->_have_port_context_id  )?PORT_READ(in_EXECUTE_LOOP_CONTEXT_ID   [x][y]):0;
53              entry->front_end_id = (_param->_have_port_front_end_id)?PORT_READ(in_EXECUTE_LOOP_FRONT_END_ID [x][y]):0;
54              entry->packet_id    = (_param->_have_port_rob_ptr     )?PORT_READ(in_EXECUTE_LOOP_PACKET_ID    [x][y]):0;
55              entry->address      = PORT_READ(in_EXECUTE_LOOP_ADDRESS [x][y]);
56              entry->data         = PORT_READ(in_EXECUTE_LOOP_DATA    [x][y]);
57              entry->num_reg_rd   = PORT_READ(in_COMMIT_NUM_REG_RD    [z]);
58              entry->spr_wen      = internal_QUEUE_INFO [i].spr_wen  ;
59              entry->reexecute    = internal_QUEUE_INFO [i].reexecute;
60              entry->type         = internal_QUEUE_INFO [i].type     ;
61              entry->operation    = internal_QUEUE_INFO [i].operation;
62              entry->write_rd     = internal_QUEUE_INFO [i].write_rd ;
63            }
64
65#ifdef STATISTICS
66        if (usage_is_set(_usage,USE_STATISTICS))
67          for (uint32_t i=0; i<_param->_nb_inst_commit; i++)
68            if (internal_COMMIT_VAL [i] and PORT_READ(in_COMMIT_ACK[i]))
69              (*_stat_nb_inst_commit) ++;
70#endif
71
72        // ===================================================================
73        // =====[ SPR ]=======================================================
74        // ===================================================================
75        for (uint32_t i=0; i<_param->_nb_inst_reexecute; i++)
76          if (internal_SPR_VAL [i] and PORT_READ(in_SPR_ACK [i]))
77            {
78#ifdef STATISTICS
79              if (usage_is_set(_usage,USE_STATISTICS))
80                (*_stat_nb_spr_access) ++;
81#endif
82              entry_t * entry = _reexecute_queue [i].front();
83
84              if (not entry->spr_wen)
85                {
86                  entry->data     =     PORT_READ(in_SPR_RDATA   [i]);
87                  entry->write_rd = not PORT_READ(in_SPR_INVALID [i]);
88                }
89
90              if (entry->reexecute)
91                entry->state = STATE_REEXECUTE;
92              else
93                entry->state = STATE_EMPTY;
94            }
95
96        // ===================================================================
97        // =====[ REEXECUTE ]=================================================
98        // ===================================================================
99        for (uint32_t i=0; i<_param->_nb_inst_reexecute; i++)
100          if (internal_REEXECUTE_VAL [i] and PORT_READ(in_REEXECUTE_ACK [i]))
101            // test source
102            if (not internal_REEXECUTE_ROB_ACK [i])
103              {
104#ifdef STATISTICS
105                if (usage_is_set(_usage,USE_STATISTICS))
106                  (*_stat_nb_inst_reexecute) ++;
107#endif
108
109                // invalid entry
110                _reexecute_queue [i].front()->state = STATE_EMPTY;             
111              }
112#ifdef DEBUG_TEST
113            else
114              {
115                if (not PORT_READ(in_REEXECUTE_ROB_VAL [i]))
116                  throw ERRORMORPHEO(FUNCTION,toString(_("in_REEXECUTE_ROB_VAL [%d] must be = 1.\n"),i));
117              }
118#endif
119       
120        // ===================================================================
121        // =====[ End cycle ]=================================================
122        // ===================================================================
123        for (uint32_t i=0; i<_param->_nb_bank; i++)
124          if (not _reexecute_queue [i].empty() and (_reexecute_queue [i].front()->state == STATE_EMPTY))
125            {
126              entry_t * entry = _reexecute_queue [i].front();
127              _reexecute_queue [i].pop_front();
128              delete entry;
129
130#ifdef STATISTICS
131              if (usage_is_set(_usage,USE_STATISTICS))
132                (*(_stat_bank_nb_inst [i])) += _reexecute_queue [i].size();
133#endif
134            }
135      }
136
137#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
138    end_cycle ();
139#endif
140
141    log_end(Reexecute_unit,FUNCTION);
142  };
143
144}; // end namespace reexecute_unit
145}; // end namespace ooo_engine
146}; // end namespace multi_ooo_engine
147}; // end namespace core
148
149}; // end namespace behavioural
150}; // end namespace morpheo             
151#endif
Note: See TracBrowser for help on using the repository browser.