source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_transition.cpp @ 100

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

1) Bug fix (Operation, Instruction)
2) Modif Return Address Stack
3) Add Soft Test
4) Add Soc Test

  • Property svn:keywords set to Id
File size: 10.9 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Functionnal_unit_transition.cpp 100 2009-01-08 13:06:27Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_execute_loop {
15namespace execute_loop {
16namespace multi_execute_unit {
17namespace execute_unit {
18namespace functionnal_unit {
19
20
21#undef  FUNCTION
22#define FUNCTION "Functionnal_unit::transition"
23  void Functionnal_unit::transition (void)
24  {
25    log_begin(Functionnal_unit,FUNCTION);
26    log_function(Functionnal_unit,FUNCTION,_name.c_str());
27
28    if (PORT_READ(in_NRESET) == 0)
29      {
30        reg_BUSY_IN  = false;
31        reg_BUSY_OUT = false;
32       
33        for (uint32_t i=0; i<_param->_nb_context; i++)
34          for (uint32_t j=0; j<_param->_nb_front_end; j++)
35            for (uint32_t k=0; k<_param->_nb_ooo_engine; k++)
36              {
37//              uint32_t num_thread = get_num_thread(i,_param->_size_context_id,
38//                                                   j,_param->_size_front_end_id,
39//                                                   k,_param->_size_ooo_engine_id);
40               
41                for (uint32_t x=GROUP_CUSTOM_1; x<GROUP_CUSTOM_8; x++)
42                  {
43                    function_execute_end_cycle_t * fct = (_param->_get_custom_information()._get_custom_execute_reset(x));
44                   
45                    if (fct != NULL)
46                      (* fct) (_execute_register[i][j][k], _execute_param);
47                  }
48              }
49      }
50    else
51      {
52        // Test if pop
53        if (internal_EXECUTE_OUT_VAL and PORT_READ(in_EXECUTE_OUT_ACK))
54          {
55            log_printf(TRACE,Functionnal_unit,FUNCTION,"  * EXECUTE_OUT : Transaction Accepted");
56            // transaction
57            reg_BUSY_OUT = false;
58          }
59       
60        // Test if push
61        execute_register_t * execute_register = NULL;
62
63        if (PORT_READ(in_EXECUTE_IN_VAL) and internal_EXECUTE_IN_ACK)
64          {
65            log_printf(TRACE,Functionnal_unit,FUNCTION,"  * EXECUTE_IN : Transaction Accepted");
66
67            reg_BUSY_IN = true;
68
69            Tcontext_t   context_id    = (_param->_have_port_context_id   )?PORT_READ(in_EXECUTE_IN_CONTEXT_ID   ):0;
70            Tcontext_t   front_end_id  = (_param->_have_port_front_end_id )?PORT_READ(in_EXECUTE_IN_FRONT_END_ID ):0;
71            Tcontext_t   ooo_engine_id = (_param->_have_port_ooo_engine_id)?PORT_READ(in_EXECUTE_IN_OOO_ENGINE_ID):0;
72            Tcontext_t   packet_id     = (_param->_have_port_rob_ptr      )?PORT_READ(in_EXECUTE_IN_PACKET_ID    ):0;
73            Toperation_t operation     = PORT_READ(in_EXECUTE_IN_OPERATION);
74            Ttype_t      type          = PORT_READ(in_EXECUTE_IN_TYPE);
75           
76            _execute_operation_in->_context_id    = context_id   ;
77            _execute_operation_in->_front_end_id  = front_end_id ;
78            _execute_operation_in->_ooo_engine_id = ooo_engine_id;
79            _execute_operation_in->_packet_id     = packet_id    ;
80            _execute_operation_in->_operation     = operation    ;
81            _execute_operation_in->_type          = type         ;
82            _execute_operation_in->_has_immediat  = PORT_READ(in_EXECUTE_IN_HAS_IMMEDIAT);
83            _execute_operation_in->_immediat      = PORT_READ(in_EXECUTE_IN_IMMEDIAT    );
84            _execute_operation_in->_data_ra       = PORT_READ(in_EXECUTE_IN_DATA_RA     );
85            _execute_operation_in->_data_rb       = PORT_READ(in_EXECUTE_IN_DATA_RB     );
86            _execute_operation_in->_data_rc       = PORT_READ(in_EXECUTE_IN_DATA_RC     );
87            _execute_operation_in->_write_rd      = PORT_READ(in_EXECUTE_IN_WRITE_RD    );
88            _execute_operation_in->_num_reg_rd    = PORT_READ(in_EXECUTE_IN_NUM_REG_RD  );
89            _execute_operation_in->_data_rd       = 0; // no necessaray
90            _execute_operation_in->_write_re      = PORT_READ(in_EXECUTE_IN_WRITE_RE    );
91            _execute_operation_in->_num_reg_re    = PORT_READ(in_EXECUTE_IN_NUM_REG_RE  );
92            _execute_operation_in->_data_re       = 0; // no necessaray
93
94            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * context_id    : %d",_execute_operation_in->_context_id   );
95            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * front_end_id  : %d",_execute_operation_in->_front_end_id );
96            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * ooo_engine_id : %d",_execute_operation_in->_ooo_engine_id);
97            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * packet_id     : %d",_execute_operation_in->_packet_id    );
98            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * operation     : %d",_execute_operation_in->_operation    );
99            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * type          : %s",toString(_execute_operation_in->_type).c_str());
100            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * has_immediat  : %d",_execute_operation_in->_has_immediat );
101            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * immediat      : %.8x",_execute_operation_in->_immediat     );
102            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * data_ra       : %.8x",_execute_operation_in->_data_ra      );
103            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * data_rb       : %.8x",_execute_operation_in->_data_rb      );
104            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * data_rc       : %.8x",_execute_operation_in->_data_rc      );
105            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * write_rd      : %d"  ,_execute_operation_in->_write_rd     );
106            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * num_reg_rd    : %d"  ,_execute_operation_in->_num_reg_rd   );
107            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * write_re      : %d"  ,_execute_operation_in->_write_re     );
108            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * num_reg_re    : %d"  ,_execute_operation_in->_num_reg_re   );
109           
110#ifdef DEBUG_TEST
111            if (type >= _param->_nb_type)
112              throw ERRORMORPHEO(FUNCTION,"Invalid type : '"+toString(type)+"' is higher that _nb_type");
113            if (operation >= _param->_nb_operation)
114              throw ERRORMORPHEO(FUNCTION,"Invalid operation : '"+toString(operation)+"' is higher that _nb_operation");
115#endif
116
117            // execute the operation
118            execute_register = _execute_register[context_id][front_end_id][ooo_engine_id];
119
120            // Test if operation is a custom
121            if (type == TYPE_CUSTOM)
122              {
123//              uint32_t num_thread = get_num_thread(context_id   ,_param->_size_context_id,
124//                                                   front_end_id ,_param->_size_front_end_id,
125//                                                   ooo_engine_id,_param->_size_ooo_engine_id);
126
127                (*(_param->_get_custom_information()._get_custom_execute_genMoore(operation))) (_execute_operation_in, execute_register, _execute_param);
128              }
129            else
130              (*(_function_execute[type][operation])) (_execute_operation_in, execute_register, _execute_param);
131
132
133            log_printf(TRACE,Functionnal_unit,FUNCTION,"    -----------------");
134            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * latence       : %.8x",_execute_operation_in->_timing._latence);
135            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * delay         : %.8x",_execute_operation_in->_timing._delay);
136            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * data_rd       : %.8x",_execute_operation_in->_data_rd    );
137            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * data_re       : %.8x",_execute_operation_in->_data_re    );
138            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * exception     : %d"  ,_execute_operation_in->_exception  );
139            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * no_sequence   : %d"  ,_execute_operation_in->_no_sequence);
140            log_printf(TRACE,Functionnal_unit,FUNCTION,"    * address       : %.8x (%.8x)",_execute_operation_in->_address,_execute_operation_in->_address<<2);
141
142#ifdef STATISTICS
143            if (usage_is_set(_usage,USE_STATISTICS))
144              {
145                (*_stat_use_functionnal_unit) ++;
146                (*_stat_sum_delay)   += _execute_operation_in->_timing._delay;
147                (*_stat_sum_latence) += _execute_operation_in->_timing._latence;
148              }
149#endif
150          }
151       
152        // End cycle
153        {
154          for (uint32_t i=0; i<_param->_nb_context; i++)
155            for (uint32_t j=0; j<_param->_nb_front_end; j++)
156              for (uint32_t k=0; k<_param->_nb_ooo_engine; k++)
157                {
158//                uint32_t num_thread = get_num_thread(i,_param->_size_context_id,
159//                                                     j,_param->_size_front_end_id,
160//                                                     k,_param->_size_ooo_engine_id);
161
162                  for (uint32_t x=GROUP_CUSTOM_1; x<GROUP_CUSTOM_8; x++)
163                    {
164                      function_execute_end_cycle_t * fct = (_param->_get_custom_information()._get_custom_execute_transition(x));
165                     
166                      if (fct != NULL)
167                        (* fct) (_execute_register[i][j][k], _execute_param);
168                    }
169                }
170
171          // Update status
172          if (execute_register != NULL)
173            {
174              // They have an access
175              execute_register->_i_write_spr = false;
176              execute_register->_i_read_spr  = false;
177            }
178        }
179
180        if (reg_BUSY_IN and not reg_BUSY_OUT)
181          {
182            reg_BUSY_OUT = reg_BUSY_IN;
183            reg_BUSY_IN  = false;
184
185            _execute_operation_out->_timing        = _execute_operation_in->_timing       ;
186            _execute_operation_out->_context_id    = _execute_operation_in->_context_id   ;
187            _execute_operation_out->_front_end_id  = _execute_operation_in->_front_end_id ;
188            _execute_operation_out->_ooo_engine_id = _execute_operation_in->_ooo_engine_id;
189            _execute_operation_out->_packet_id     = _execute_operation_in->_packet_id    ;
190            _execute_operation_out->_operation     = _execute_operation_in->_operation    ;
191            _execute_operation_out->_type          = _execute_operation_in->_type         ;
192            _execute_operation_out->_has_immediat  = _execute_operation_in->_has_immediat ;
193            _execute_operation_out->_immediat      = _execute_operation_in->_immediat     ;
194            _execute_operation_out->_data_ra       = _execute_operation_in->_data_ra      ;
195            _execute_operation_out->_data_rb       = _execute_operation_in->_data_rb      ;
196            _execute_operation_out->_data_rc       = _execute_operation_in->_data_rc      ;
197            _execute_operation_out->_data_rd       = _execute_operation_in->_data_rd      ;
198            _execute_operation_out->_data_re       = _execute_operation_in->_data_re      ;
199            _execute_operation_out->_write_rd      = _execute_operation_in->_write_rd     ;
200            _execute_operation_out->_num_reg_rd    = _execute_operation_in->_num_reg_rd   ;
201            _execute_operation_out->_write_re      = _execute_operation_in->_write_re     ;
202            _execute_operation_out->_num_reg_re    = _execute_operation_in->_num_reg_re   ;
203            _execute_operation_out->_exception     = _execute_operation_in->_exception    ;
204            _execute_operation_out->_no_sequence   = _execute_operation_in->_no_sequence  ;
205            _execute_operation_out->_address       = _execute_operation_in->_address      ;
206          }
207       
208        // each cycle : decrease the latence
209        if (reg_BUSY_OUT and (_execute_operation_out->_timing._latence > 0))
210          _execute_operation_out->_timing._latence --;
211      }
212
213#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
214    end_cycle ();
215#endif
216
217    log_end(Functionnal_unit,FUNCTION);
218  };
219
220}; // end namespace functionnal_unit
221}; // end namespace execute_unit
222}; // end namespace multi_execute_unit
223}; // end namespace execute_loop
224}; // end namespace multi_execute_loop
225}; // end namespace core
226
227}; // end namespace behavioural
228}; // end namespace morpheo             
229#endif
Note: See TracBrowser for help on using the repository browser.