source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Ifetch_unit/Ifetch_queue/src/Ifetch_queue_transition.cpp @ 81

Last change on this file since 81 was 81, checked in by rosiere, 16 years ago
  • Finish Environment (and test)
  • Continue predictor_unit
  • Add external tools
  • svn keyword "Id" set
  • Property svn:keywords set to Id
File size: 6.5 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Ifetch_queue_transition.cpp 81 2008-04-15 18:40:01Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Front_end/Front_end/Ifetch_unit/Ifetch_queue/include/Ifetch_queue.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_front_end {
15namespace front_end {
16namespace ifetch_unit {
17namespace ifetch_queue {
18
19
20#undef  FUNCTION
21#define FUNCTION "Ifetch_queue::transition"
22  void Ifetch_queue::transition (void)
23  {
24    log_printf(FUNC,Ifetch_queue,FUNCTION,"Begin");
25
26    if (PORT_READ(in_NRESET) == 0)
27      {
28        reg_PTR_READ  = 0;
29        reg_PTR_WRITE = 0;
30
31        for (uint32_t i=0; i<_param->_size_queue; i++)
32          _queue [i]->_state = IFETCH_QUEUE_STATE_EMPTY;
33      }
34    else
35      {
36        // ==========================================================
37        // =====[ ADDRESS ]==========================================
38        // ==========================================================
39        if (PORT_READ(in_ADDRESS_VAL) and internal_ADDRESS_ACK)
40          {
41            // New slot in ifetch_queue is allocated
42           
43            _queue[reg_PTR_WRITE]->_state                       = IFETCH_QUEUE_STATE_WAIT_RSP;
44             
45#ifdef STATISTICS
46            (*_sum_transaction_address) ++;
47#endif
48
49            for (uint32_t i=0; i<_param->_nb_instruction; i++)
50              {
51                Tcontrol_t enable = PORT_READ(in_ADDRESS_INSTRUCTION_ENABLE [i]);
52#ifdef STATISTICS
53                (*_sum_inst_enable) += enable;
54#endif
55                _queue[reg_PTR_WRITE]->_instruction_enable [i]      = enable;
56              }
57            _queue[reg_PTR_WRITE]->_address                     = PORT_READ(in_ADDRESS_INSTRUCTION_ADDRESS        );
58            _queue[reg_PTR_WRITE]->_inst_ifetch_ptr             = (_param->_have_port_instruction_ptr)?PORT_READ(in_ADDRESS_INST_IFETCH_PTR            ):0;
59            _queue[reg_PTR_WRITE]->_branch_state                = PORT_READ(in_ADDRESS_BRANCH_STATE               );
60            _queue[reg_PTR_WRITE]->_branch_update_prediction_id = (_param->_have_port_branch_update_prediction_id)?PORT_READ(in_ADDRESS_BRANCH_UPDATE_PREDICTION_ID):0;
61           
62            reg_PTR_WRITE = (reg_PTR_WRITE+1)%_param->_size_queue;
63          }
64
65        // ==========================================================
66        // =====[ DECOD ]============================================
67        // ==========================================================
68        bool have_instruction_decod  = false;
69        bool have_instruction_enable = false;
70        for (uint32_t i=0; i<_param->_nb_instruction; i++)
71          {
72            if (internal_DECOD_VAL [i] and PORT_READ(in_DECOD_ACK[i]))
73              {
74                have_instruction_decod = true;
75                _queue[reg_PTR_READ]->_instruction_enable [i] = false;
76              }
77            have_instruction_enable |= _queue[reg_PTR_READ]->_instruction_enable [i];
78          }
79
80        // Test if all is decoded
81        if (have_instruction_decod and not have_instruction_enable)
82          {
83            // all is decod
84            _queue[reg_PTR_READ]->_state = IFETCH_QUEUE_STATE_EMPTY;
85            reg_PTR_READ = (reg_PTR_READ+1)%_param->_size_queue;
86          }
87         
88        // ==========================================================
89        // =====[ ICACHE_RSP ]=======================================
90        // ==========================================================
91        if (PORT_READ(in_ICACHE_RSP_VAL) and internal_ICACHE_RSP_ACK)
92          {
93            Tpacket_t ptr = (_param->_have_port_queue_ptr)?PORT_READ(in_ICACHE_RSP_PACKET_ID):0;
94           
95            for (uint32_t i=0; i<_param->_nb_instruction; i++)
96              _queue[ptr]->_instruction [i]      = PORT_READ(in_ICACHE_RSP_INSTRUCTION [i]);
97           
98            switch (PORT_READ(in_ICACHE_RSP_ERROR))
99              {
100              case ICACHE_ERROR_NONE      : _queue[ptr]->_exception = EXCEPTION_IFETCH_NONE     ; break;
101              case ICACHE_ERROR_BUS_ERROR : _queue[ptr]->_exception = EXCEPTION_IFETCH_BUS_ERROR; break;
102              default : ERRORMORPHEO(FUNCTION,"icache_rsp_error : unknow value.");
103              }
104
105            switch (_queue[ptr]->_state)
106              {
107              case IFETCH_QUEUE_STATE_WAIT_RSP       : _queue[ptr]->_state = IFETCH_QUEUE_STATE_HAVE_RSP; break;
108              case IFETCH_QUEUE_STATE_ERROR_WAIT_RSP : _queue[ptr]->_state = IFETCH_QUEUE_STATE_EMPTY   ; break;
109              default : ERRORMORPHEO(FUNCTION,"icache_rsp : invalid ifetch_queue state.");
110              }
111          }
112
113        // ==========================================================
114        // =====[ EVENT_RESET ]======================================
115        // ==========================================================
116        if (PORT_READ(in_EVENT_RESET_VAL) and internal_EVENT_RESET_ACK)
117          {
118            // Scan all entry of queue and test the status
119            for (uint32_t i=0; i<_param->_size_queue; i++)
120              switch (_queue[i]->_state)
121              {
122              case IFETCH_QUEUE_STATE_ERROR_WAIT_RSP :                                                        break;
123              case IFETCH_QUEUE_STATE_WAIT_RSP       : _queue[i]->_state = IFETCH_QUEUE_STATE_ERROR_WAIT_RSP; break;
124              default                                : _queue[i]->_state = IFETCH_QUEUE_STATE_EMPTY         ; break;
125              }
126
127            // all entry is empty (or wait respons to flush)
128            // reset ptr
129            //   1) reg_PTR_READ = reg_PTR_WRITE =  = 0
130            //   2) reg_PTR_READ = reg_PTR_WRITE
131            // In method 1), the probalitie than the entry pointed by reg_PTR_WRITE is a slot with state "error_wait_rsp" is more importate that the method 2)
132            reg_PTR_READ = reg_PTR_WRITE;
133          }
134
135//      log_printf(TRACE,Ifetch_queue,FUNCTION,"reg_PTR_WRITE : %d",reg_PTR_WRITE);
136//      log_printf(TRACE,Ifetch_queue,FUNCTION,"reg_PTR_READ  : %d",reg_PTR_READ );
137//      for (uint32_t i=0; i<_param->_size_queue; i++)
138//        {
139//          log_printf(TRACE,Ifetch_queue,FUNCTION,"[%d] %d %.8x %d - %d %d %d", i, _queue [i]->_state, _queue [i]->_address,_queue [i]->_inst_ifetch_ptr,_queue [i]->_branch_state,_queue [i]->_branch_update_prediction_id,_queue [i]->_exception);
140
141//          for (uint32_t j=0; j<_param->_nb_instruction; j++)
142//            log_printf(TRACE,Ifetch_queue,FUNCTION,"  * %d %.8x", _queue [i]->_instruction_enable[i], _queue [i]->_instruction[i]);
143//        }
144
145#ifdef STATISTICS
146        for (uint32_t i=0; i<_param->_size_queue; i++)
147          switch (_queue[i]->_state)
148            {
149            case IFETCH_QUEUE_STATE_EMPTY          : break;
150            case IFETCH_QUEUE_STATE_WAIT_RSP       : (*_sum_use_queue_wait_rsp      ) ++; break;
151            case IFETCH_QUEUE_STATE_HAVE_RSP       : (*_sum_use_queue_have_rsp      ) ++; break;
152            case IFETCH_QUEUE_STATE_ERROR_WAIT_RSP : (*_sum_use_queue_error_wait_rsp) ++; break;
153            default : break;
154            }
155#endif
156      }
157
158#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
159    end_cycle ();
160#endif
161
162    log_printf(FUNC,Ifetch_queue,FUNCTION,"End");
163  };
164
165}; // end namespace ifetch_queue
166}; // end namespace ifetch_unit
167}; // end namespace front_end
168}; // end namespace multi_front_end
169}; // end namespace core
170
171}; // end namespace behavioural
172}; // end namespace morpheo             
173#endif
Note: See TracBrowser for help on using the repository browser.