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 @ 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: 10.1 KB
Line 
1/*
2 * $Id: Branch_Target_Buffer_Glue.cpp 123 2009-06-08 20:43:30Z 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
95        for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
96          {
97            sensitive << (*(in_PREDICT_VAL                   [i]))
98                      << (*(in_PREDICT_REGISTER_ACK          [i]));
99            if (_param->_have_port_victim)
100              sensitive << (*(in_PREDICT_SORT_VAL              [i]))
101                        << (*(in_PREDICT_SORT_INDEX            [i]))
102                        << (*(in_PREDICT_VICTIM_ACK            [i]));
103            for (uint32_t j=0; j<_param->_associativity; j++)
104              sensitive << (*(in_PREDICT_REGISTER_HIT          [i][j]))
105                        << (*(in_PREDICT_REGISTER_ADDRESS_SRC  [i][j]))
106                        << (*(in_PREDICT_REGISTER_ADDRESS_DEST [i][j]))
107                        << (*(in_PREDICT_REGISTER_CONDITION    [i][j]))
108                        << (*(in_PREDICT_REGISTER_LAST_TAKE    [i][j]))
109                        << (*(in_PREDICT_REGISTER_IS_ACCURATE  [i][j]));
110          }
111       
112// # ifdef SYSTEMCASS_SPECIFIC
113//      // List dependency information
114
115//      for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
116//        {
117//          for (uint32_t j=0; j<_param->_associativity; j++)
118//          (*(out_PREDICT_HIT            [i])) (*(in_PREDICT_REGISTER_HIT          [i][j]));
119//          if (_param->_have_port_victim)
120//          (*(out_PREDICT_HIT            [i])) (*(in_PREDICT_SORT_INDEX            [i]));
121
122//          for (uint32_t j=0; j<_param->_associativity; j++)
123//          (*(out_PREDICT_ADDRESS_SRC    [i])) (*(in_PREDICT_REGISTER_ADDRESS_SRC  [i][j]));
124//          if (_param->_have_port_victim)
125//          (*(out_PREDICT_ADDRESS_SRC    [i])) (*(in_PREDICT_SORT_INDEX            [i]));
126
127//          for (uint32_t j=0; j<_param->_associativity; j++)
128//          (*(out_PREDICT_ADDRESS_DEST   [i])) (*(in_PREDICT_REGISTER_ADDRESS_DEST [i][j]));
129//          if (_param->_have_port_victim)
130//          (*(out_PREDICT_ADDRESS_DEST   [i])) (*(in_PREDICT_SORT_INDEX            [i]));
131
132//          for (uint32_t j=0; j<_param->_associativity; j++)
133//          (*(out_PREDICT_CONDITION      [i])) (*(in_PREDICT_REGISTER_CONDITION    [i][j]));
134//          if (_param->_have_port_victim)
135//          (*(out_PREDICT_CONDITION      [i])) (*(in_PREDICT_SORT_INDEX            [i]));
136
137//          for (uint32_t j=0; j<_param->_associativity; j++)
138//          (*(out_PREDICT_LAST_TAKE      [i])) (*(in_PREDICT_REGISTER_LAST_TAKE    [i][j]));
139//          if (_param->_have_port_victim)
140//          (*(out_PREDICT_LAST_TAKE      [i])) (*(in_PREDICT_SORT_INDEX            [i]));
141
142//          for (uint32_t j=0; j<_param->_associativity; j++)
143//          (*(out_PREDICT_IS_ACCURATE    [i])) (*(in_PREDICT_REGISTER_IS_ACCURATE  [i][j]));
144//          if (_param->_have_port_victim)
145//          (*(out_PREDICT_IS_ACCURATE    [i])) (*(in_PREDICT_SORT_INDEX            [i]));
146
147
148//          (*(out_PREDICT_ACK            [i])) (*(in_PREDICT_REGISTER_ACK          [i]));
149//          if (_param->_have_port_victim)
150//            {
151//          (*(out_PREDICT_ACK            [i])) (*(in_PREDICT_SORT_VAL              [i]));
152//          (*(out_PREDICT_ACK            [i])) (*(in_PREDICT_VICTIM_ACK            [i]));
153//            }
154
155//          (*(out_PREDICT_REGISTER_VAL   [i])) (*(in_PREDICT_VAL                   [i]));
156//          if (_param->_have_port_victim)
157//            {
158//          (*(out_PREDICT_REGISTER_VAL   [i])) (*(in_PREDICT_SORT_VAL              [i]));
159//          (*(out_PREDICT_REGISTER_VAL   [i])) (*(in_PREDICT_VICTIM_ACK            [i]));
160//            }
161
162//          if (_param->_have_port_victim)
163//            {
164//          (*(out_PREDICT_VICTIM_VAL     [i])) (*(in_PREDICT_VAL                   [i]));
165//          (*(out_PREDICT_VICTIM_VAL     [i])) (*(in_PREDICT_REGISTER_ACK          [i]));
166//          (*(out_PREDICT_VICTIM_VAL     [i])) (*(in_PREDICT_SORT_VAL              [i]));
167
168//          for (uint32_t j=0; j<_param->_associativity; j++)
169//          (*(out_PREDICT_VICTIM_HIT     [i])) (*(in_PREDICT_REGISTER_HIT          [i][j]));
170//          (*(out_PREDICT_VICTIM_HIT     [i])) (*(in_PREDICT_SORT_INDEX            [i]));
171
172//          if (not _param->_is_full_associative)
173//            {
174//          for (uint32_t j=0; j<_param->_associativity; j++)
175//          (*(out_PREDICT_VICTIM_ADDRESS [i])) (*(in_PREDICT_REGISTER_ADDRESS_SRC  [i][j]));
176//          (*(out_PREDICT_VICTIM_ADDRESS [i])) (*(in_PREDICT_SORT_INDEX            [i]));
177//            }
178//          (*(out_PREDICT_VICTIM_INDEX   [i])) (*(in_PREDICT_SORT_INDEX            [i]));
179//            }
180//        }
181// # endif
182
183        log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,"Method - genMealy_decod");
184
185        SC_METHOD (genMealy_decod);
186        dont_initialize ();
187//      sensitive << (*(in_CLOCK)).neg(); // don't use internal register
188
189        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
190          {
191            sensitive << (*(in_DECOD_VAL                   [i]))
192                      << (*(in_DECOD_REGISTER_ACK          [i]));
193            if (_param->_have_port_victim)
194              {
195                if (not _param->_is_full_associative)
196                  sensitive << (*(in_DECOD_ADDRESS_SRC           [i]));
197                sensitive << (*(in_DECOD_VICTIM_ACK            [i]));
198              }
199          }
200       
201# ifdef SYSTEMCASS_SPECIFIC
202        // List dependency information
203
204        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
205          {
206            (*(out_DECOD_ACK            [i])) (*(in_DECOD_REGISTER_ACK          [i]));
207            if (_param->_have_port_victim)
208            (*(out_DECOD_ACK            [i])) (*(in_DECOD_VICTIM_ACK            [i]));
209
210            (*(out_DECOD_REGISTER_VAL   [i])) (*(in_DECOD_VAL                   [i]));
211            if (_param->_have_port_victim)
212            (*(out_DECOD_REGISTER_VAL   [i])) (*(in_DECOD_VICTIM_ACK            [i]));
213
214            if (_param->_have_port_victim)
215              {
216            (*(out_DECOD_VICTIM_VAL     [i])) (*(in_DECOD_VAL                   [i]));
217            (*(out_DECOD_VICTIM_VAL     [i])) (*(in_DECOD_REGISTER_ACK          [i]));
218
219            if (not _param->_is_full_associative)
220            (*(out_DECOD_VICTIM_ADDRESS [i])) (*(in_DECOD_ADDRESS_SRC           [i]));
221              }
222          }
223# endif
224
225        log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,"Method - genMealy_update");
226
227        SC_METHOD (genMealy_update);
228        dont_initialize ();
229//      sensitive << (*(in_CLOCK)).neg(); // don't use internal register
230
231        for (uint32_t i=0; i<_param->_nb_inst_update; i++)
232          {
233            sensitive << (*(in_UPDATE_VAL                   [i]))
234                      << (*(in_UPDATE_REGISTER_ACK          [i]));
235            if (_param->_have_port_victim)
236              {
237                if (not _param->_is_full_associative)
238                  sensitive << (*(in_UPDATE_ADDRESS_SRC           [i]));
239                sensitive << (*(in_UPDATE_VICTIM_ACK            [i]));
240              }
241          }
242       
243# ifdef SYSTEMCASS_SPECIFIC
244        // List dependency information
245
246        for (uint32_t i=0; i<_param->_nb_inst_update; i++)
247          {
248            (*(out_UPDATE_ACK            [i])) (*(in_UPDATE_REGISTER_ACK          [i]));
249            if (_param->_have_port_victim)
250            (*(out_UPDATE_ACK            [i])) (*(in_UPDATE_VICTIM_ACK            [i]));
251
252            (*(out_UPDATE_REGISTER_VAL   [i])) (*(in_UPDATE_VAL                   [i]));
253            if (_param->_have_port_victim)
254            (*(out_UPDATE_REGISTER_VAL   [i])) (*(in_UPDATE_VICTIM_ACK            [i]));
255
256            if (_param->_have_port_victim)
257              {
258            (*(out_UPDATE_VICTIM_VAL     [i])) (*(in_UPDATE_VAL                   [i]));
259            (*(out_UPDATE_VICTIM_VAL     [i])) (*(in_UPDATE_REGISTER_ACK          [i]));
260
261            if (not _param->_is_full_associative)
262            (*(out_UPDATE_VICTIM_ADDRESS [i])) (*(in_UPDATE_ADDRESS_SRC           [i]));
263              }
264          }
265# endif
266
267#endif
268      }
269    log_printf(FUNC,Branch_Target_Buffer_Glue,FUNCTION,"End");
270  };
271   
272#undef  FUNCTION
273#define FUNCTION "Branch_Target_Buffer_Glue::~Branch_Target_Buffer_Glue"
274  Branch_Target_Buffer_Glue::~Branch_Target_Buffer_Glue (void)
275  {
276    log_printf(FUNC,Branch_Target_Buffer_Glue,FUNCTION,"Begin");
277
278#ifdef STATISTICS
279    if (usage_is_set(_usage,USE_STATISTICS))
280      {
281        statistics_deallocation();
282      }
283#endif
284
285    log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,"Deallocation");
286    deallocation ();
287
288    log_printf(FUNC,Branch_Target_Buffer_Glue,FUNCTION,"End");
289  };
290
291}; // end namespace branch_target_buffer_glue
292}; // end namespace branch_target_buffer
293}; // end namespace prediction_unit
294}; // end namespace front_end
295}; // end namespace multi_front_end
296}; // end namespace core
297
298}; // end namespace behavioural
299}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.