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 @ 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: 4.8 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Branch_Target_Buffer_Glue_genMealy_predict.cpp 123 2009-06-08 20:43:30Z 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,"    * sort_val     : %d",sort_val    );
41        log_printf(TRACE,Branch_Target_Buffer_Glue,FUNCTION,"    * victim_ack   : %d",victim_ack  );
42       
43        Tptr_t          index       = (_param->_have_port_victim)?PORT_READ(in_PREDICT_SORT_INDEX [i]):0;
44        Tcontrol_t      hit         = // (_param->_have_port_victim)?sort_val:
45                                      PORT_READ(in_PREDICT_REGISTER_HIT [i][index]);
46        Tgeneral_data_t address_src = PORT_READ(in_PREDICT_REGISTER_ADDRESS_SRC [i][index]);
47
48        log_printf(TRACE,Branch_Target_Buffer_Glue,FUNCTION,"    * index        : %d"  ,index      );
49        log_printf(TRACE,Branch_Target_Buffer_Glue,FUNCTION,"    * hit          : %d"  ,hit        );
50        log_printf(TRACE,Branch_Target_Buffer_Glue,FUNCTION,"    * address_src  : %.8x",address_src);
51
52        // Multiplexor
53        PORT_WRITE(out_PREDICT_HIT          [i],hit);
54        PORT_WRITE(out_PREDICT_ADDRESS_SRC  [i],address_src);
55        PORT_WRITE(out_PREDICT_ADDRESS_DEST [i],PORT_READ(in_PREDICT_REGISTER_ADDRESS_DEST  [i][index]));
56        PORT_WRITE(out_PREDICT_CONDITION    [i],PORT_READ(in_PREDICT_REGISTER_CONDITION     [i][index]));
57        PORT_WRITE(out_PREDICT_LAST_TAKE    [i],PORT_READ(in_PREDICT_REGISTER_LAST_TAKE     [i][index]));
58        PORT_WRITE(out_PREDICT_IS_ACCURATE  [i],PORT_READ(in_PREDICT_REGISTER_IS_ACCURATE   [i][index]));
59
60        PORT_WRITE(out_PREDICT_ACK            [i], (
61//                                                  val          and
62                                                    register_ack and
63//                                                  sort_val     and
64                                                    victim_ack
65                                                    ));
66        PORT_WRITE(out_PREDICT_REGISTER_VAL   [i], (
67                                                    val          and
68//                                                  register_ack and
69//                                                  sort_val     and
70                                                    victim_ack
71                                                    ));
72
73        if (_param->_have_port_victim)
74          {
75        PORT_WRITE(out_PREDICT_VICTIM_VAL     [i], (
76                                                    val          and
77                                                    register_ack // and
78//                                                  sort_val     and
79//                                                  victim_ack
80                                                    ));
81        PORT_WRITE(out_PREDICT_VICTIM_HIT     [i], hit);
82        if (not _param->_is_full_associative)
83        PORT_WRITE(out_PREDICT_VICTIM_ADDRESS [i], (address_src >> _param->_shift_bank)&_param->_mask_bank);
84        PORT_WRITE(out_PREDICT_VICTIM_INDEX   [i], index);
85          }
86      }
87      }
88    else
89      {
90        for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
91          {
92            PORT_WRITE(out_PREDICT_ACK            [i], 0);
93            PORT_WRITE(out_PREDICT_REGISTER_VAL   [i], 0);
94            if (_param->_have_port_victim)
95            PORT_WRITE(out_PREDICT_VICTIM_VAL     [i], 0);
96          }
97      }
98
99    log_end(Branch_Target_Buffer_Glue,FUNCTION);
100  };
101
102}; // end namespace branch_target_buffer_glue
103}; // end namespace branch_target_buffer
104}; // end namespace prediction_unit
105}; // end namespace front_end
106}; // end namespace multi_front_end
107}; // end namespace core
108}; // end namespace behavioural
109}; // end namespace morpheo             
110#endif
Note: See TracBrowser for help on using the repository browser.