source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Front_end_Glue/src/Front_end_Glue_genMealy_event.cpp @ 123

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

1) Fix performance
2) add auto generation to SPECINT2000
3) add reset in genMoore and genMealy

  • Property svn:keywords set to Id
File size: 6.8 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Front_end_Glue_genMealy_event.cpp 123 2009-06-08 20:43:30Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Front_end/Front_end/Front_end_Glue/include/Front_end_Glue.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_front_end {
15namespace front_end {
16namespace front_end_glue {
17
18#undef  FUNCTION
19#define FUNCTION "Front_end_Glue::genMealy_event"
20  void Front_end_Glue::genMealy_event (void)
21  {
22    log_begin(Front_end_Glue,FUNCTION);
23    log_function(Front_end_Glue,FUNCTION,_name.c_str());
24
25    if (PORT_READ(in_NRESET))
26      {
27    for (uint32_t i=0; i<_param->_nb_context; ++i)
28      {
29        Taddress_t    address = PORT_READ(in_EVENT_CONTEXT_STATE_ADDRESS [i]);
30        PORT_WRITE(out_EVENT_ADDRESS             [i],address);
31        PORT_WRITE(out_EVENT_IFETCH_UNIT_ADDRESS [i],address);
32
33        Taddress_t    address_next = PORT_READ(in_EVENT_CONTEXT_STATE_ADDRESS_NEXT [i]);
34        PORT_WRITE(out_EVENT_ADDRESS_NEXT             [i],address_next);
35        PORT_WRITE(out_EVENT_IFETCH_UNIT_ADDRESS_NEXT [i],address_next);
36
37        Tcontrol_t    address_next_val = PORT_READ(in_EVENT_CONTEXT_STATE_ADDRESS_NEXT_VAL [i]);
38        PORT_WRITE(out_EVENT_ADDRESS_NEXT_VAL             [i],address_next_val);
39        PORT_WRITE(out_EVENT_IFETCH_UNIT_ADDRESS_NEXT_VAL [i],address_next_val);
40
41        Tcontrol_t    is_ds_take = PORT_READ(in_EVENT_CONTEXT_STATE_IS_DS_TAKE [i]);
42        PORT_WRITE(out_EVENT_IS_DS_TAKE             [i],is_ds_take);
43        PORT_WRITE(out_EVENT_IFETCH_UNIT_IS_DS_TAKE [i],is_ds_take);
44
45        Tevent_type_t event_type = PORT_READ(in_EVENT_CONTEXT_STATE_TYPE [i]);
46        PORT_WRITE(out_EVENT_PREDICTION_UNIT_TYPE [i],event_type);
47       
48        if (_param->_have_port_depth)
49          {
50        Tdepth_t      depth = PORT_READ(in_EVENT_CONTEXT_STATE_DEPTH [i]);
51        PORT_WRITE(out_EVENT_PREDICTION_UNIT_DEPTH [i],depth);
52          }
53        Tcontrol_t    flush_only = PORT_READ(in_EVENT_CONTEXT_STATE_FLUSH_ONLY [i]);
54       
55
56        Tcontrol_t ack                 = PORT_READ(in_EVENT_ACK                 [i]);
57        Tcontrol_t ifetch_unit_ack     = PORT_READ(in_EVENT_IFETCH_UNIT_ACK     [i]);
58        Tcontrol_t prediction_unit_ack = PORT_READ(in_EVENT_PREDICTION_UNIT_ACK [i]);
59        Tcontrol_t context_state_val   = PORT_READ(in_EVENT_CONTEXT_STATE_VAL   [i]);
60
61        Tcontrol_t val                 = (  not flush_only      and
62                                          //ack                 and
63                                            ifetch_unit_ack     and
64                                            prediction_unit_ack and
65                                            context_state_val
66                                         
67                                          );
68//         Tcontrol_t ifetch_unit_val     = (  ack                 and
69//                                           //ifetch_unit_ack     and
70//                                             prediction_unit_ack and
71//                                             context_state_val   
72//                                             );
73        Tcontrol_t ifetch_unit_val     = (  (
74                                             flush_only or
75                                             ack              ) and
76                                          //ifetch_unit_ack     and
77                                            prediction_unit_ack and
78                                            context_state_val
79                                            );
80
81//         Tcontrol_t prediction_unit_val = (  ack                 and
82//                                             ifetch_unit_ack     and
83//                                           //prediction_unit_ack and
84//                                             context_state_val   
85//                                             );
86
87        Tcontrol_t prediction_unit_val = (  (
88                                             flush_only or
89                                             ack              ) and
90                                            ifetch_unit_ack     and
91                                          //prediction_unit_ack and
92                                            context_state_val
93                                            );
94
95
96        Tcontrol_t context_state_ack   = (  ack                 and
97                                            ifetch_unit_ack     and
98                                            prediction_unit_ack // and
99                                          //context_state_val   
100                                            );
101
102        log_printf(TRACE,Front_end_Glue,FUNCTION,"  * val                 %d, ack                 %d",val                ,ack                );
103        log_printf(TRACE,Front_end_Glue,FUNCTION,"  * ifetch_unit_val     %d, ifetch_unit_ack     %d",ifetch_unit_val    ,ifetch_unit_ack    );
104        log_printf(TRACE,Front_end_Glue,FUNCTION,"  * prediction_unit_val %d, prediction_unit_ack %d",prediction_unit_val,prediction_unit_ack);
105        log_printf(TRACE,Front_end_Glue,FUNCTION,"  * context_state_val   %d, context_state_ack   %d",context_state_val  ,context_state_ack  );
106
107
108        PORT_WRITE(out_EVENT_VAL                 [i], val                );
109        PORT_WRITE(out_EVENT_IFETCH_UNIT_VAL     [i], ifetch_unit_val    );
110        PORT_WRITE(out_EVENT_PREDICTION_UNIT_VAL [i], prediction_unit_val);
111        PORT_WRITE(out_EVENT_CONTEXT_STATE_ACK   [i], context_state_ack  );
112
113#ifdef DEBUG
114        log_printf(TRACE,Front_end_Glue,FUNCTION,"  * EVENT Context [%d]",i);
115        if (val and ack)
116          {
117            log_printf(TRACE,Front_end_Glue,FUNCTION,"    * have event");
118            log_printf(TRACE,Front_end_Glue,FUNCTION,"    * address          : %.8x (%.8x)",address     ,address     <<2);
119            log_printf(TRACE,Front_end_Glue,FUNCTION,"    * address_next     : %.8x (%.8x)",address_next,address_next<<2);
120            log_printf(TRACE,Front_end_Glue,FUNCTION,"    * address_next_val : %d",address_next_val);
121            log_printf(TRACE,Front_end_Glue,FUNCTION,"    * is_ds_take       : %d",is_ds_take      );
122            log_printf(TRACE,Front_end_Glue,FUNCTION,"    * flush_only       : %d",flush_only      );
123          }
124        else
125          log_printf(TRACE,Front_end_Glue,FUNCTION,"    * have not event");
126#endif
127      }
128      }
129    else
130      {
131        // Reset
132        for (uint32_t i=0; i<_param->_nb_context; ++i)
133          {
134            PORT_WRITE(out_EVENT_VAL                 [i], 0);
135            PORT_WRITE(out_EVENT_IFETCH_UNIT_VAL     [i], 0);
136            PORT_WRITE(out_EVENT_PREDICTION_UNIT_VAL [i], 0);
137            PORT_WRITE(out_EVENT_CONTEXT_STATE_ACK   [i], 0);
138          }
139      }
140
141    log_end(Front_end_Glue,FUNCTION);
142  };
143
144}; // end namespace front_end_glue
145}; // end namespace front_end
146}; // end namespace multi_front_end
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.