source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Stage_1_Ifetch/Predictor/Meta_Predictor/Two_Level_Branch_Predictor/Branch_History_Table/src/Branch_History_Table_allocation.cpp @ 42

Last change on this file since 42 was 42, checked in by rosiere, 17 years ago

Modification des classes d'encapsulation des interfaces :

  • gère les signaux à écrire dans le vhdl
  • les traces pour le testbench
  • la génération des vhdl structurelles

-> test sur la Pattern History Table

File size: 8.0 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id$
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Stage_1_Ifetch/Predictor/Meta_Predictor/Two_Level_Branch_Predictor/Branch_History_Table/include/Branch_History_Table.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace stage_1_ifetch {
14namespace predictor {
15namespace meta_predictor {
16namespace two_level_branch_predictor {
17namespace branch_history_table {
18
19
20  void Branch_History_Table::allocation (void)
21  {
22    _component   = new Component ();
23
24    Entity * entity = _component->set_entity (_name                 
25                                             ,"Branch_History_Table"
26#ifdef POSITION
27                                             ,MIXTE               
28#endif
29                                              );
30   
31    _interfaces = entity->set_interfaces();
32
33    // ~~~~~[ Interface : "" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
34    {
35      Interface * interface = _interfaces->set_interface(""
36#ifdef POSITION
37                                                         , IN 
38                                                         , SOUTH
39                                                         , "Generalist interface"
40#endif
41                                                         );
42     
43      in_CLOCK              = interface->set_signal_clk              ("clock" ,1);
44      in_NRESET             = interface->set_signal_in  <Tcontrol_t> ("nreset",1,RESET_VHDL_YES);
45    }
46
47    // ~~~~~[ Interface : "predict" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
48     in_PREDICT_VAL     = new SC_IN (Tcontrol_t) * [_param._nb_prediction];
49    out_PREDICT_ACK     = new SC_OUT(Tcontrol_t) * [_param._nb_prediction];
50     in_PREDICT_ADDRESS = new SC_IN (Taddress_t) * [_param._nb_prediction];
51    out_PREDICT_HISTORY = new SC_OUT(Thistory_t) * [_param._nb_prediction];
52
53    for (uint32_t i=0; i<_param._nb_prediction; i++)
54      {
55        Interface_fifo * interface = _interfaces->set_interface("predict_"+toString(i)
56#ifdef POSITION
57                                                                , IN 
58                                                                , WEST
59                                                                , "Interface Predict"
60#endif
61                                                           );
62
63         in_PREDICT_VAL     [i] = interface->set_signal_valack_in        ("val"    , VAL);
64        out_PREDICT_ACK     [i] = interface->set_signal_valack_out       ("ack"    , ACK);
65         in_PREDICT_ADDRESS [i] = interface->set_signal_in  <Taddress_t> ("address", static_cast<uint32_t>(ceil(log2(_param._nb_shifter))));
66        out_PREDICT_HISTORY [i] = interface->set_signal_out <Thistory_t> ("history", _param._size_shifter);
67      }
68
69    // ~~~~~[ Interface : "branch_complete" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
70
71        in_BRANCH_COMPLETE_VAL       = new SC_IN     (Tcontrol_t) * [_param._nb_branch_complete];
72       out_BRANCH_COMPLETE_ACK       = new SC_OUT    (Tcontrol_t) * [_param._nb_branch_complete];
73        in_BRANCH_COMPLETE_ADDRESS   = new SC_IN     (Taddress_t) * [_param._nb_branch_complete];
74        in_BRANCH_COMPLETE_HISTORY   = new SC_IN     (Thistory_t) * [_param._nb_branch_complete];
75        in_BRANCH_COMPLETE_DIRECTION = new SC_IN     (Tcontrol_t) * [_param._nb_branch_complete];
76
77    for (uint32_t i=0; i<_param._nb_branch_complete; i++)
78      {
79        Interface_fifo * interface = _interfaces->set_interface("branch_complete_"+toString(i)
80#ifdef POSITION
81                                                                , IN 
82                                                                , EAST
83                                                                , "Interface branch complete"
84#endif
85                                                                );
86
87         in_BRANCH_COMPLETE_VAL        [i] = interface->set_signal_valack_in        ("val"      , VAL);
88        out_BRANCH_COMPLETE_ACK        [i] = interface->set_signal_valack_out       ("ack"      , ACK);
89         in_BRANCH_COMPLETE_ADDRESS    [i] = interface->set_signal_in  <Taddress_t> ("address"  , static_cast<uint32_t>(ceil(log2(_param._nb_shifter))));
90         in_BRANCH_COMPLETE_HISTORY    [i] = interface->set_signal_in  <Thistory_t> ("history"  , _param._size_shifter);
91         in_BRANCH_COMPLETE_DIRECTION  [i] = interface->set_signal_in  <Tcontrol_t> ("direction", 1);
92      }
93   
94    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
95    string name_component;
96
97    // =====[ component_Shifter ]=========================================   
98   
99    name_component = _name+"_Shifter";
100
101    component_Shifter = new morpheo::behavioural::generic::shifter::Shifter (name_component.c_str()
102#ifdef STATISTICS
103                                                                             ,_param_statistics
104#endif
105                                                                             ,*(_param._param_shifter));
106
107    _component->set_component (component_Shifter->_component
108#ifdef POSITION
109                               , 25
110                               , 25
111                               , 10
112                               , 10
113#endif
114                               );
115
116     // =====[ component_RegisterFile ]====================================   
117   
118    name_component = _name+"_RegisterFile";
119   
120    component_RegisterFile = new morpheo::behavioural::generic::registerfile::registerfile_monolithic::RegisterFile_Monolithic(name_component.c_str(),
121#ifdef STATISTICS
122                                                                                                                               _param_statistics            ,
123#endif
124                                                                                                                               *(_param._param_registerfile));
125
126    _component->set_component (component_RegisterFile->_component
127#ifdef POSITION
128                               , 75
129                               , 75
130                               , 10
131                               , 10
132#endif
133                               );
134     
135    // ~~~~~[ Component - Instanciation ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
136
137     // =====[ component_RegisterFile - Instanciation ]====================   
138
139#ifdef POSITION
140    _component->interface_map (_name+"_RegisterFile","",
141                               _name                ,"");
142#endif
143
144    _component->port_map(_name+"_RegisterFile", "in_CLOCK" , _name,"in_CLOCK" );
145    _component->port_map(_name+"_RegisterFile", "in_NRESET", _name,"in_NRESET");
146   
147    for (uint32_t i=0; i<_param._nb_prediction; i++)
148      {
149#ifdef POSITION
150        _component->interface_map (_name+"_RegisterFile","read_"   +toString(i),
151                                   _name                ,"predict_"+toString(i));
152#endif
153
154        _component->port_map(_name+"_RegisterFile", "in_READ_"+toString(i)+"_VAL"    , _name, "in_PREDICT_"+toString(i)+"_VAL"    );
155        _component->port_map(_name+"_RegisterFile","out_READ_"+toString(i)+"_ACK"    , _name,"out_PREDICT_"+toString(i)+"_ACK"    );
156        _component->port_map(_name+"_RegisterFile", "in_READ_"+toString(i)+"_ADDRESS", _name, "in_PREDICT_"+toString(i)+"_ADDRESS");
157        _component->port_map(_name+"_RegisterFile","out_READ_"+toString(i)+"_DATA"   , _name,"out_PREDICT_"+toString(i)+"_HISTORY");
158      }
159   
160    for (uint32_t i=0; i<_param._nb_branch_complete; i++)
161      {
162#ifdef POSITION
163        _component->interface_map (_name+"_RegisterFile","write_"  +toString(i),
164                                   _name+"_Shifter"     ,"shifter_"+toString(i));
165#endif
166
167        _component->port_map(_name+"_RegisterFile", "in_WRITE_"+toString(i)+"_VAL"    , _name           , "in_BRANCH_COMPLETE_"+toString(i)+"_VAL"    );
168        _component->port_map(_name+"_RegisterFile","out_WRITE_"+toString(i)+"_ACK"    , _name           ,"out_BRANCH_COMPLETE_"+toString(i)+"_ACK"    );
169        _component->port_map(_name+"_RegisterFile", "in_WRITE_"+toString(i)+"_ADDRESS", _name           , "in_BRANCH_COMPLETE_"+toString(i)+"_ADDRESS");
170        _component->port_map(_name+"_RegisterFile", "in_WRITE_"+toString(i)+"_DATA"   , _name+"_Shifter","out_SHIFTER_"        +toString(i)+"_DATA");
171      }
172
173    // =====[ component_Shifter - Instanciation ]=========================   
174
175#if (defined(STATISTICS) || defined (VHDL_TESTBENCH))
176
177#ifdef POSITION
178    _component->interface_map (_name+"_Shifter","",
179                               _name           ,"");
180#endif
181
182    _component->port_map(_name+"_Shifter", "in_CLOCK" , _name,"in_CLOCK" );
183    _component->port_map(_name+"_Shifter", "in_NRESET", _name,"in_NRESET");
184
185#endif
186
187    for (uint32_t i=0; i<_param._nb_branch_complete; i++)
188      {
189#ifdef POSITION
190        _component->interface_map (_name+"_Shifter","shifter_"+toString(i),
191                                   _name           ,"branch_complete_"+toString(i));
192
193#endif
194
195        _component->port_map(_name+"_Shifter", "in_SHIFTER_" +toString(i)+"_DATA"    , _name                , "in_BRANCH_COMPLETE_"+toString(i)+"_HISTORY");
196        _component->port_map(_name+"_Shifter", "in_SHIFTER_" +toString(i)+"_CARRY_IN", _name                , "in_BRANCH_COMPLETE_"+toString(i)+"_DIRECTION");
197        _component->port_map(_name+"_Shifter", "out_SHIFTER_"+toString(i)+"_DATA"    , _name+"_RegisterFile", "in_WRITE_"+toString(i)+"_DATA");
198      }
199
200#ifdef POSITION
201    _component->generate_file();
202#endif
203  };
204
205}; // end namespace branch_history_table
206}; // end namespace two_level_branch_predictor
207}; // end namespace meta_predictor
208}; // end namespace predictor
209}; // end namespace stage_1_ifetch
210}; // end namespace behavioural
211}; // end namespace morpheo             
212#endif
Note: See TracBrowser for help on using the repository browser.