source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Glue/src/Branch_Target_Buffer_Glue.cpp @ 144

Last change on this file since 144 was 144, checked in by rosiere, 14 years ago

1) compatible gcc 4.4.3
2) Translation file in MORPHEO_PREFIX directory

  • Property svn:keywords set to Id
File size: 10.2 KB
Line 
1/*
2 * $Id: Branch_Target_Buffer_Glue.cpp 144 2010-09-28 11:19:10Z rosiere $
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Glue/include/Branch_Target_Buffer_Glue.h"
9
10namespace morpheo                    {
11namespace behavioural {
12namespace core {
13namespace multi_front_end {
14namespace front_end {
15namespace prediction_unit {
16namespace branch_target_buffer {
17namespace branch_target_buffer_glue {
18
19
20#undef  FUNCTION
21#define FUNCTION "Branch_Target_Buffer_Glue::Branch_Target_Buffer_Glue"
22  Branch_Target_Buffer_Glue::Branch_Target_Buffer_Glue
23  (
24#ifdef SYSTEMC
25   sc_module_name name,
26#else
27   string name,
28#endif
29#ifdef STATISTICS
30   morpheo::behavioural::Parameters_Statistics * param_statistics,
31#endif
32   morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::branch_target_buffer::branch_target_buffer_glue::Parameters * param,
33   morpheo::behavioural::Tusage_t usage
34   ):
35    _name              (name)
36    ,_param            (param)
37    ,_usage            (usage)
38  {
39    log_printf(FUNC,Branch_Target_Buffer_Glue,FUNCTION,"Begin");
40
41// #if DEBUG_Branch_Target_Buffer_Glue == true
42//     log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,_("<%s> Parameters"),_name.c_str());
43
44//     std::cout << *param << std::endl;
45// #endif   
46
47    log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,"Allocation");
48
49    allocation (
50#ifdef STATISTICS
51                param_statistics
52#endif
53                );
54
55#ifdef STATISTICS
56    if (usage_is_set(_usage,USE_STATISTICS))
57      { 
58        log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,"Allocation of statistics");
59
60        statistics_allocation(param_statistics);
61      }
62#endif
63
64#ifdef VHDL
65    if (usage_is_set(_usage,USE_VHDL))
66      {
67        // generate the vhdl
68        log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,"Generate the vhdl");
69       
70        vhdl();
71      }
72#endif
73
74#ifdef SYSTEMC
75    if (usage_is_set(_usage,USE_SYSTEMC))
76      {
77# if defined(STATISTICS) or defined(VHDL_TESTBENCH)
78        log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,"Method - transition");
79
80        SC_METHOD (transition);
81        dont_initialize ();
82        sensitive << (*(in_CLOCK)).pos();
83
84#  ifdef SYSTEMCASS_SPECIFIC
85        // List dependency information
86#  endif
87# endif
88
89        log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,"Method - genMealy_predict");
90
91        SC_METHOD (genMealy_predict);
92        dont_initialize ();
93//      sensitive << (*(in_CLOCK)).neg(); // don't use internal register
94        sensitive << (*(in_NRESET));
95
96        for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
97          {
98            sensitive << (*(in_PREDICT_VAL                   [i]))
99                      << (*(in_PREDICT_REGISTER_ACK          [i]));
100            if (_param->_have_port_victim)
101              sensitive //<< (*(in_PREDICT_SORT_VAL              [i]))
102                        << (*(in_PREDICT_SORT_INDEX            [i]))
103                        << (*(in_PREDICT_VICTIM_ACK            [i]));
104            for (uint32_t j=0; j<_param->_associativity; j++)
105              sensitive << (*(in_PREDICT_REGISTER_HIT          [i][j]))
106                        << (*(in_PREDICT_REGISTER_ADDRESS_SRC  [i][j]))
107                        << (*(in_PREDICT_REGISTER_ADDRESS_DEST [i][j]))
108                        << (*(in_PREDICT_REGISTER_CONDITION    [i][j]))
109                        << (*(in_PREDICT_REGISTER_LAST_TAKE    [i][j]))
110                        << (*(in_PREDICT_REGISTER_IS_ACCURATE  [i][j]));
111          }
112       
113// # ifdef SYSTEMCASS_SPECIFIC
114//      // List dependency information
115
116//      for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
117//        {
118//          for (uint32_t j=0; j<_param->_associativity; j++)
119//          (*(out_PREDICT_HIT            [i])) (*(in_PREDICT_REGISTER_HIT          [i][j]));
120//          if (_param->_have_port_victim)
121//          (*(out_PREDICT_HIT            [i])) (*(in_PREDICT_SORT_INDEX            [i]));
122
123//          for (uint32_t j=0; j<_param->_associativity; j++)
124//          (*(out_PREDICT_ADDRESS_SRC    [i])) (*(in_PREDICT_REGISTER_ADDRESS_SRC  [i][j]));
125//          if (_param->_have_port_victim)
126//          (*(out_PREDICT_ADDRESS_SRC    [i])) (*(in_PREDICT_SORT_INDEX            [i]));
127
128//          for (uint32_t j=0; j<_param->_associativity; j++)
129//          (*(out_PREDICT_ADDRESS_DEST   [i])) (*(in_PREDICT_REGISTER_ADDRESS_DEST [i][j]));
130//          if (_param->_have_port_victim)
131//          (*(out_PREDICT_ADDRESS_DEST   [i])) (*(in_PREDICT_SORT_INDEX            [i]));
132
133//          for (uint32_t j=0; j<_param->_associativity; j++)
134//          (*(out_PREDICT_CONDITION      [i])) (*(in_PREDICT_REGISTER_CONDITION    [i][j]));
135//          if (_param->_have_port_victim)
136//          (*(out_PREDICT_CONDITION      [i])) (*(in_PREDICT_SORT_INDEX            [i]));
137
138//          for (uint32_t j=0; j<_param->_associativity; j++)
139//          (*(out_PREDICT_LAST_TAKE      [i])) (*(in_PREDICT_REGISTER_LAST_TAKE    [i][j]));
140//          if (_param->_have_port_victim)
141//          (*(out_PREDICT_LAST_TAKE      [i])) (*(in_PREDICT_SORT_INDEX            [i]));
142
143//          for (uint32_t j=0; j<_param->_associativity; j++)
144//          (*(out_PREDICT_IS_ACCURATE    [i])) (*(in_PREDICT_REGISTER_IS_ACCURATE  [i][j]));
145//          if (_param->_have_port_victim)
146//          (*(out_PREDICT_IS_ACCURATE    [i])) (*(in_PREDICT_SORT_INDEX            [i]));
147
148
149//          (*(out_PREDICT_ACK            [i])) (*(in_PREDICT_REGISTER_ACK          [i]));
150//          if (_param->_have_port_victim)
151//            {
152//          (*(out_PREDICT_ACK            [i])) (*(in_PREDICT_SORT_VAL              [i]));
153//          (*(out_PREDICT_ACK            [i])) (*(in_PREDICT_VICTIM_ACK            [i]));
154//            }
155
156//          (*(out_PREDICT_REGISTER_VAL   [i])) (*(in_PREDICT_VAL                   [i]));
157//          if (_param->_have_port_victim)
158//            {
159//          (*(out_PREDICT_REGISTER_VAL   [i])) (*(in_PREDICT_SORT_VAL              [i]));
160//          (*(out_PREDICT_REGISTER_VAL   [i])) (*(in_PREDICT_VICTIM_ACK            [i]));
161//            }
162
163//          if (_param->_have_port_victim)
164//            {
165//          (*(out_PREDICT_VICTIM_VAL     [i])) (*(in_PREDICT_VAL                   [i]));
166//          (*(out_PREDICT_VICTIM_VAL     [i])) (*(in_PREDICT_REGISTER_ACK          [i]));
167//          (*(out_PREDICT_VICTIM_VAL     [i])) (*(in_PREDICT_SORT_VAL              [i]));
168
169//          for (uint32_t j=0; j<_param->_associativity; j++)
170//          (*(out_PREDICT_VICTIM_HIT     [i])) (*(in_PREDICT_REGISTER_HIT          [i][j]));
171//          (*(out_PREDICT_VICTIM_HIT     [i])) (*(in_PREDICT_SORT_INDEX            [i]));
172
173//          if (not _param->_is_full_associative)
174//            {
175//          for (uint32_t j=0; j<_param->_associativity; j++)
176//          (*(out_PREDICT_VICTIM_ADDRESS [i])) (*(in_PREDICT_REGISTER_ADDRESS_SRC  [i][j]));
177//          (*(out_PREDICT_VICTIM_ADDRESS [i])) (*(in_PREDICT_SORT_INDEX            [i]));
178//            }
179//          (*(out_PREDICT_VICTIM_INDEX   [i])) (*(in_PREDICT_SORT_INDEX            [i]));
180//            }
181//        }
182// # endif
183
184        log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,"Method - genMealy_decod");
185
186        SC_METHOD (genMealy_decod);
187        dont_initialize ();
188//      sensitive << (*(in_CLOCK)).neg(); // don't use internal register
189        sensitive << (*(in_NRESET));
190                 
191        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
192          {
193            sensitive << (*(in_DECOD_VAL                   [i]))
194                      << (*(in_DECOD_REGISTER_ACK          [i]));
195            if (_param->_have_port_victim)
196              {
197                if (not _param->_is_full_associative)
198                  sensitive << (*(in_DECOD_ADDRESS_SRC           [i]));
199                sensitive << (*(in_DECOD_VICTIM_ACK            [i]));
200              }
201          }
202       
203# ifdef SYSTEMCASS_SPECIFIC
204        // List dependency information
205
206        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
207          {
208            (*(out_DECOD_ACK            [i])) (*(in_DECOD_REGISTER_ACK          [i]));
209            if (_param->_have_port_victim)
210            (*(out_DECOD_ACK            [i])) (*(in_DECOD_VICTIM_ACK            [i]));
211
212            (*(out_DECOD_REGISTER_VAL   [i])) (*(in_DECOD_VAL                   [i]));
213            if (_param->_have_port_victim)
214            (*(out_DECOD_REGISTER_VAL   [i])) (*(in_DECOD_VICTIM_ACK            [i]));
215
216            if (_param->_have_port_victim)
217              {
218            (*(out_DECOD_VICTIM_VAL     [i])) (*(in_DECOD_VAL                   [i]));
219            (*(out_DECOD_VICTIM_VAL     [i])) (*(in_DECOD_REGISTER_ACK          [i]));
220
221            if (not _param->_is_full_associative)
222            (*(out_DECOD_VICTIM_ADDRESS [i])) (*(in_DECOD_ADDRESS_SRC           [i]));
223              }
224          }
225# endif
226
227        log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,"Method - genMealy_update");
228
229        SC_METHOD (genMealy_update);
230        dont_initialize ();
231//      sensitive << (*(in_CLOCK)).neg(); // don't use internal register
232        sensitive << (*(in_NRESET));
233
234        for (uint32_t i=0; i<_param->_nb_inst_update; i++)
235          {
236            sensitive << (*(in_UPDATE_VAL                   [i]))
237                      << (*(in_UPDATE_REGISTER_ACK          [i]));
238            if (_param->_have_port_victim)
239              {
240                if (not _param->_is_full_associative)
241                  sensitive << (*(in_UPDATE_ADDRESS_SRC           [i]));
242                sensitive << (*(in_UPDATE_VICTIM_ACK            [i]));
243              }
244          }
245       
246# ifdef SYSTEMCASS_SPECIFIC
247        // List dependency information
248
249        for (uint32_t i=0; i<_param->_nb_inst_update; i++)
250          {
251            (*(out_UPDATE_ACK            [i])) (*(in_UPDATE_REGISTER_ACK          [i]));
252            if (_param->_have_port_victim)
253            (*(out_UPDATE_ACK            [i])) (*(in_UPDATE_VICTIM_ACK            [i]));
254
255            (*(out_UPDATE_REGISTER_VAL   [i])) (*(in_UPDATE_VAL                   [i]));
256            if (_param->_have_port_victim)
257            (*(out_UPDATE_REGISTER_VAL   [i])) (*(in_UPDATE_VICTIM_ACK            [i]));
258
259            if (_param->_have_port_victim)
260              {
261            (*(out_UPDATE_VICTIM_VAL     [i])) (*(in_UPDATE_VAL                   [i]));
262            (*(out_UPDATE_VICTIM_VAL     [i])) (*(in_UPDATE_REGISTER_ACK          [i]));
263
264            if (not _param->_is_full_associative)
265            (*(out_UPDATE_VICTIM_ADDRESS [i])) (*(in_UPDATE_ADDRESS_SRC           [i]));
266              }
267          }
268# endif
269
270#endif
271      }
272    log_printf(FUNC,Branch_Target_Buffer_Glue,FUNCTION,"End");
273  };
274   
275#undef  FUNCTION
276#define FUNCTION "Branch_Target_Buffer_Glue::~Branch_Target_Buffer_Glue"
277  Branch_Target_Buffer_Glue::~Branch_Target_Buffer_Glue (void)
278  {
279    log_printf(FUNC,Branch_Target_Buffer_Glue,FUNCTION,"Begin");
280
281#ifdef STATISTICS
282    if (usage_is_set(_usage,USE_STATISTICS))
283      {
284        statistics_deallocation();
285      }
286#endif
287
288    log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,"Deallocation");
289    deallocation ();
290
291    log_printf(FUNC,Branch_Target_Buffer_Glue,FUNCTION,"End");
292  };
293
294}; // end namespace branch_target_buffer_glue
295}; // end namespace branch_target_buffer
296}; // end namespace prediction_unit
297}; // end namespace front_end
298}; // end namespace multi_front_end
299}; // end namespace core
300
301}; // end namespace behavioural
302}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.