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_genMealy_predict.cpp @ 128

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

1) Correct bug in link two signal
2) Fix error detected with valgrind
3) modif distexe script

  • Property svn:keywords set to Id
File size: 4.9 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Branch_Target_Buffer_Glue_genMealy_predict.cpp 128 2009-06-26 08:43:23Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Glue/include/Branch_Target_Buffer_Glue.h"
10
11namespace morpheo {
12namespace behavioural {
13namespace core {
14namespace multi_front_end {
15namespace front_end {
16namespace prediction_unit {
17namespace branch_target_buffer {
18namespace branch_target_buffer_glue {
19
20#undef  FUNCTION
21#define FUNCTION "Branch_Target_Buffer_Glue::genMealy_predict"
22  void Branch_Target_Buffer_Glue::genMealy_predict (void)
23  {
24    log_begin(Branch_Target_Buffer_Glue,FUNCTION);
25    log_function(Branch_Target_Buffer_Glue,FUNCTION,_name.c_str());
26
27    if (PORT_READ(in_NRESET))
28      {
29    for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
30      {
31        log_printf(TRACE,Branch_Target_Buffer_Glue,FUNCTION,"  * PREDICT [%d]",i);
32
33        Tcontrol_t val          = PORT_READ(in_PREDICT_VAL          [i]);
34        Tcontrol_t register_ack = PORT_READ(in_PREDICT_REGISTER_ACK [i]);
35        Tcontrol_t sort_val     = (_param->_have_port_victim)?PORT_READ(in_PREDICT_SORT_VAL   [i]):true;
36        Tcontrol_t victim_ack   = (_param->_have_port_victim)?PORT_READ(in_PREDICT_VICTIM_ACK [i]):true;
37
38        log_printf(TRACE,Branch_Target_Buffer_Glue,FUNCTION,"    * val          : %d",val         );
39        log_printf(TRACE,Branch_Target_Buffer_Glue,FUNCTION,"    * register_ack : %d",register_ack);
40        log_printf(TRACE,Branch_Target_Buffer_Glue,FUNCTION,"    * port_victim  : %d",_param->_have_port_victim);
41        log_printf(TRACE,Branch_Target_Buffer_Glue,FUNCTION,"    * sort_val     : %d",sort_val    );
42        log_printf(TRACE,Branch_Target_Buffer_Glue,FUNCTION,"    * victim_ack   : %d",victim_ack  );
43       
44        Tptr_t          index       = (_param->_have_port_victim)?PORT_READ(in_PREDICT_SORT_INDEX [i]):0;
45        Tcontrol_t      hit         = // (_param->_have_port_victim)?sort_val:
46                                      PORT_READ(in_PREDICT_REGISTER_HIT [i][index]);
47        Tgeneral_data_t address_src = PORT_READ(in_PREDICT_REGISTER_ADDRESS_SRC [i][index]);
48
49        log_printf(TRACE,Branch_Target_Buffer_Glue,FUNCTION,"    * index        : %d"  ,index      );
50        log_printf(TRACE,Branch_Target_Buffer_Glue,FUNCTION,"    * hit          : %d"  ,hit        );
51        log_printf(TRACE,Branch_Target_Buffer_Glue,FUNCTION,"    * address_src  : %.8x",address_src);
52
53        // Multiplexor
54
55        PORT_WRITE(out_PREDICT_HIT          [i],hit);
56        PORT_WRITE(out_PREDICT_ADDRESS_SRC  [i],address_src);
57        PORT_WRITE(out_PREDICT_ADDRESS_DEST [i],PORT_READ(in_PREDICT_REGISTER_ADDRESS_DEST  [i][index]));
58        PORT_WRITE(out_PREDICT_CONDITION    [i],PORT_READ(in_PREDICT_REGISTER_CONDITION     [i][index]));
59        PORT_WRITE(out_PREDICT_LAST_TAKE    [i],PORT_READ(in_PREDICT_REGISTER_LAST_TAKE     [i][index]));
60        PORT_WRITE(out_PREDICT_IS_ACCURATE  [i],PORT_READ(in_PREDICT_REGISTER_IS_ACCURATE   [i][index]));
61
62        PORT_WRITE(out_PREDICT_ACK            [i], (
63//                                                  val          and
64                                                    register_ack and
65//                                                  sort_val     and
66                                                    victim_ack
67                                                    ));
68
69        PORT_WRITE(out_PREDICT_REGISTER_VAL   [i], (
70                                                    val          and
71//                                                  register_ack and
72//                                                  sort_val     and
73                                                    victim_ack
74                                                    ));
75
76        if (_param->_have_port_victim)
77          {
78        PORT_WRITE(out_PREDICT_VICTIM_VAL     [i], (
79                                                    val          and
80                                                    register_ack // and
81//                                                  sort_val     and
82//                                                  victim_ack
83                                                    ));
84        PORT_WRITE(out_PREDICT_VICTIM_HIT     [i], hit);
85        if (not _param->_is_full_associative)
86        PORT_WRITE(out_PREDICT_VICTIM_ADDRESS [i], (address_src >> _param->_shift_bank)&_param->_mask_bank);
87        PORT_WRITE(out_PREDICT_VICTIM_INDEX   [i], index);
88          }
89
90      }
91      }
92    else
93      {
94        for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
95          {
96            PORT_WRITE(out_PREDICT_ACK            [i], 0);
97            PORT_WRITE(out_PREDICT_REGISTER_VAL   [i], 0);
98            if (_param->_have_port_victim)
99            PORT_WRITE(out_PREDICT_VICTIM_VAL     [i], 0);
100          }
101      }
102
103    log_end(Branch_Target_Buffer_Glue,FUNCTION);
104  };
105
106}; // end namespace branch_target_buffer_glue
107}; // end namespace branch_target_buffer
108}; // end namespace prediction_unit
109}; // end namespace front_end
110}; // end namespace multi_front_end
111}; // end namespace core
112}; // end namespace behavioural
113}; // end namespace morpheo             
114#endif
Note: See TracBrowser for help on using the repository browser.