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 @ 88

Last change on this file since 88 was 88, checked in by rosiere, 16 years ago

Almost complete design
with Test and test platform

  • Property svn:keywords set to Id
File size: 10.1 KB
Line 
1/*
2 * $Id: Branch_Target_Buffer_Glue.cpp 88 2008-12-10 18:31:39Z 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.