source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Decod_unit/Decod_queue/src/Decod_queue_function_multi_fifo_genMealy_decod_out.cpp @ 115

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

1) Write queue with mealy
2) Network : fix bug
3) leak memory

  • Property svn:keywords set to Id
File size: 4.9 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Decod_queue_function_multi_fifo_genMealy_decod_out.cpp 115 2009-04-20 21:29:17Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Front_end/Front_end/Decod_unit/Decod_queue/include/Decod_queue.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_front_end {
15namespace front_end {
16namespace decod_unit {
17namespace decod_queue {
18
19
20#undef  FUNCTION
21#define FUNCTION "Decod_queue::function_multi_fifo_genMealy_decod_out"
22  void Decod_queue::function_multi_fifo_genMealy_decod_out (void)
23  {
24    log_begin(Decod_queue,FUNCTION);
25    log_function(Decod_queue,FUNCTION,_name.c_str());
26   
27    Tcontrol_t val [_param->_nb_inst_decod];
28    for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
29      {
30        val                    [i] = 0;
31        internal_DECOD_OUT_VAL [i] = 0;
32        internal_DECOD_OUT_ACK [i] = 0;
33      }
34   
35    uint32_t num_bank = reg_NUM_BANK_HEAD%_param->_nb_bank;
36   
37    for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
38      {
39        log_printf(TRACE,Decod_queue,FUNCTION,_("  * num_bank : %d"),num_bank);
40
41        if (not reg_QUEUE[num_bank].empty())
42          {
43            log_printf(TRACE,Decod_queue,FUNCTION,_("  * Queue is not empty, slot [%d] is valid."),i);
44           
45            Tcontext_t context         = reg_QUEUE[num_bank].front()->_context_id    [0];
46            Tdepth_t   depth           = reg_QUEUE[num_bank].front()->_depth         [0];
47            Tdepth_t   depth_min       = (_param->_have_port_depth)?PORT_READ(in_DEPTH_MIN [context]):0;
48            Tdepth_t   depth_max       = (_param->_have_port_depth)?PORT_READ(in_DEPTH_MAX [context]):0;
49            Tcontrol_t depth_full      = PORT_READ(in_DEPTH_FULL[context]);
50
51            // is a valid instruction ?
52            // If DEPTH_CURRENT :
53            // equal at     DEPTH_MIN            -> not speculative
54            // not include ]DEPTH_MIN:DEPTH_MAX] -> previous branch miss
55            //     include ]DEPTH_MIN:DEPTH_MAX] -> speculative
56           
57            // All case
58            // ....... min ...X... max ....... OK
59            // ....... min ....... max ...X... KO
60            // ...X... min ....... max ....... KO
61            // ....... max ....... min ...X... OK
62            // ...X... max ....... min ....... OK
63            // ....... max ...X... min ....... KO
64           
65            Tcontrol_t is_valid = true;
66
67//             Tcontrol_t   is_valid      = ((depth == depth_min) or
68//                                           depth_full or
69//                                           ((depth_min <= depth_max)?
70//                                            ((depth >= depth_min) and (depth <=depth_max)):
71//                                            ((depth >= depth_min) or  (depth <=depth_max))));
72            //Tcontrol_t is_valid        = ((depth == depth_min) or
73            //                              ((depth_min < depth_max)?
74            //                               (depth<=depth_max):
75            //                               ((depth > depth_min) or (depth <= depth_max))));
76            //Tcontrol_t is_valid        = depth <= depth_max;
77           
78            log_printf(TRACE,Decod_queue,FUNCTION,"    * is_valid : %d",is_valid);
79            log_printf(TRACE,Decod_queue,FUNCTION,"      * context      : %d",context);
80            log_printf(TRACE,Decod_queue,FUNCTION,"      * depth        : %d",depth);
81            log_printf(TRACE,Decod_queue,FUNCTION,"      * depth_min    : %d",depth_min);
82            log_printf(TRACE,Decod_queue,FUNCTION,"      * depth_max    : %d",depth_max);
83            log_printf(TRACE,Decod_queue,FUNCTION,"      * depth_full   : %d",depth_full);
84#ifdef DEBUG
85            log_printf(TRACE,Decod_queue,FUNCTION,"      * address      : 0x%x (0x%x)",reg_QUEUE[num_bank].front()->_address     [0],reg_QUEUE[num_bank].front()->_address     [0]<<2);
86#endif
87            log_printf(TRACE,Decod_queue,FUNCTION,"      * address_next : 0x%x (0x%x)",reg_QUEUE[num_bank].front()->_address_next[0],reg_QUEUE[num_bank].front()->_address_next[0]<<2);
88
89            internal_DECOD_OUT_VAL [i] = 1; // in all case, val is set (entry is not empty, and instruction is valid)
90            if (is_valid)
91              {
92                val                    [i] = 1;
93                internal_DECOD_OUT_ACK [i] = PORT_READ(in_DECOD_OUT_ACK [i]);
94              }
95            else
96              {
97                // Consume the instruction (to erase)
98                internal_DECOD_OUT_ACK [i] = 1;
99              }
100          }
101        num_bank = (num_bank+1)%_param->_nb_bank;
102      }
103   
104    for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
105      {
106        log_printf(TRACE,Decod_queue,FUNCTION,"  * DECOD_OUT_VAL : %d",val [i]);
107       
108        PORT_WRITE(out_DECOD_OUT_VAL [i],val [i]);
109      }
110
111    log_end(Decod_queue,FUNCTION);
112  };
113
114}; // end namespace decod_queue
115}; // end namespace decod_unit
116}; // end namespace front_end
117}; // end namespace multi_front_end
118}; // end namespace core
119
120}; // end namespace behavioural
121}; // end namespace morpheo             
122#endif
Note: See TracBrowser for help on using the repository browser.