source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Issue_queue/src/Issue_queue_allocation.cpp @ 136

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

1) Add new algo in ifetch queue
2) Add Cancel bit
3) new config

  • Property svn:keywords set to Id
File size: 14.4 KB
Line 
1/*
2 * $Id: Issue_queue_allocation.cpp 136 2009-10-20 18:52:15Z rosiere $
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Issue_queue/include/Issue_queue.h"
9#include "Behavioural/include/Allocation.h"
10#include "Common/include/Max.h"
11
12namespace morpheo                    {
13namespace behavioural {
14namespace core {
15namespace multi_ooo_engine {
16namespace ooo_engine {
17namespace issue_queue {
18
19
20
21#undef  FUNCTION
22#define FUNCTION "Issue_queue::allocation"
23  void Issue_queue::allocation (
24#ifdef STATISTICS
25                               morpheo::behavioural::Parameters_Statistics * param_statistics
26#else
27                               void
28#endif
29                               )
30  {
31    log_begin(Issue_queue,FUNCTION);
32
33    _component   = new Component (_usage);
34
35    Entity * entity = _component->set_entity (_name       
36                                              ,"Issue_queue"
37#ifdef POSITION
38                                              ,COMBINATORY
39#endif
40                                              );
41
42    _interfaces = entity->set_interfaces();
43
44    // ~~~~~[ Interface : "" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
45    {
46      Interface * interface = _interfaces->set_interface(""
47#ifdef POSITION
48                                                         ,IN
49                                                         ,SOUTH,
50                                                         _("Generalist interface")
51#endif
52                                                         );
53     
54      in_CLOCK        = interface->set_signal_clk              ("clock" ,1, CLOCK_VHDL_YES);
55      in_NRESET       = interface->set_signal_in  <Tcontrol_t> ("nreset",1, RESET_VHDL_YES);
56    }
57
58
59    // ~~~~~[ Interface : "issue_in" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
60    {
61      ALLOC2_INTERFACE_BEGIN("issue_in", IN, WEST, _("Rename_out / Insert Rob interface"),_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
62   
63      _ALLOC2_VALACK_IN ( in_ISSUE_IN_VAL                  ,VAL,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
64      _ALLOC2_VALACK_OUT(out_ISSUE_IN_ACK                  ,ACK,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
65      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_CONTEXT_ID           ,"context_id"           ,Tcontext_t        ,_param->_size_context_id      ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
66      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_FRONT_END_ID         ,"front_end_id"         ,Tcontext_t        ,_param->_size_front_end_id    ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
67      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_PACKET_ID            ,"packet_id"            ,Tpacket_t         ,_param->_size_rob_ptr         ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
68      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_OPERATION            ,"operation"            ,Toperation_t      ,_param->_size_operation       ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
69      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_TYPE                 ,"type"                 ,Ttype_t           ,_param->_size_type            ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
70      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_STORE_QUEUE_PTR_WRITE,"store_queue_ptr_write",Tlsq_ptr_t        ,_param->_size_store_queue_ptr ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
71      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_STORE_QUEUE_PTR_READ ,"store_queue_ptr_read" ,Tlsq_ptr_t        ,_param->_size_store_queue_ptr ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
72      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_STORE_QUEUE_EMPTY    ,"store_queue_empty"    ,Tcontrol_t        ,1                             ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
73      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_LOAD_QUEUE_PTR_WRITE ,"load_queue_ptr_write" ,Tlsq_ptr_t        ,_param->_size_load_queue_ptr  ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
74      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_HAS_IMMEDIAT         ,"has_immediat"         ,Tcontrol_t        ,1                             ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
75      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_IMMEDIAT             ,"immediat"             ,Tgeneral_data_t   ,_param->_size_general_data    ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
76      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_READ_RA              ,"read_ra"              ,Tcontrol_t        ,1                             ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
77      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_NUM_REG_RA           ,"num_reg_ra"           ,Tgeneral_address_t,_param->_size_general_register,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
78      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_READ_RB              ,"read_rb"              ,Tcontrol_t        ,1                             ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
79      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_NUM_REG_RB           ,"num_reg_rb"           ,Tgeneral_address_t,_param->_size_general_register,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
80      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_READ_RC              ,"read_rc"              ,Tcontrol_t        ,1                             ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
81      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_NUM_REG_RC           ,"num_reg_rc"           ,Tspecial_address_t,_param->_size_special_register,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
82      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_WRITE_RD             ,"write_rd"             ,Tcontrol_t        ,1                             ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
83      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_NUM_REG_RD           ,"num_reg_rd"           ,Tgeneral_address_t,_param->_size_general_register,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
84      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_WRITE_RE             ,"write_re"             ,Tcontrol_t        ,1                             ,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
85      _ALLOC2_SIGNAL_IN ( in_ISSUE_IN_NUM_REG_RE           ,"num_reg_re"           ,Tspecial_address_t,_param->_size_special_register,_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
86
87      ALLOC2_INTERFACE_END(_param->_nb_rename_unit, _param->_nb_inst_rename[it1]);
88    }
89
90    // ~~~~~[ Interface : "reexecute" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
91    {
92      ALLOC1_INTERFACE_BEGIN("reexecute", IN, NORTH, _("Instruction reexecute (store head/ spr access)"),_param->_nb_inst_reexecute);
93     
94      ALLOC1_VALACK_IN ( in_REEXECUTE_VAL                  ,VAL);
95      ALLOC1_VALACK_OUT(out_REEXECUTE_ACK                  ,ACK);
96      ALLOC1_SIGNAL_IN ( in_REEXECUTE_CONTEXT_ID           ,"context_id"           ,Tcontext_t        ,_param->_size_context_id      );
97      ALLOC1_SIGNAL_IN ( in_REEXECUTE_FRONT_END_ID         ,"front_end_id"         ,Tcontext_t        ,_param->_size_front_end_id    );
98      ALLOC1_SIGNAL_IN ( in_REEXECUTE_PACKET_ID            ,"packet_id"            ,Tpacket_t         ,_param->_size_rob_ptr         );
99      ALLOC1_SIGNAL_IN ( in_REEXECUTE_OPERATION            ,"operation"            ,Toperation_t      ,_param->_size_operation       );
100      ALLOC1_SIGNAL_IN ( in_REEXECUTE_TYPE                 ,"type"                 ,Ttype_t           ,_param->_size_type            );
101      ALLOC1_SIGNAL_IN ( in_REEXECUTE_STORE_QUEUE_PTR_WRITE,"store_queue_ptr_write",Tlsq_ptr_t        ,_param->_size_store_queue_ptr );
102      ALLOC1_SIGNAL_IN ( in_REEXECUTE_STORE_QUEUE_PTR_READ ,"store_queue_ptr_read" ,Tlsq_ptr_t        ,_param->_size_store_queue_ptr );
103      ALLOC1_SIGNAL_IN ( in_REEXECUTE_STORE_QUEUE_EMPTY    ,"store_queue_empty"    ,Tcontrol_t        ,1);
104      ALLOC1_SIGNAL_IN ( in_REEXECUTE_LOAD_QUEUE_PTR_WRITE ,"load_queue_ptr_write" ,Tlsq_ptr_t        ,_param->_size_load_queue_ptr  );
105      ALLOC1_SIGNAL_IN ( in_REEXECUTE_HAS_IMMEDIAT         ,"has_immediat"         ,Tcontrol_t        ,1                             );
106      ALLOC1_SIGNAL_IN ( in_REEXECUTE_IMMEDIAT             ,"immediat"             ,Tgeneral_data_t   ,_param->_size_general_data    );
107      ALLOC1_SIGNAL_IN ( in_REEXECUTE_READ_RA              ,"read_ra"              ,Tcontrol_t        ,1                             );
108      ALLOC1_SIGNAL_IN ( in_REEXECUTE_NUM_REG_RA           ,"num_reg_ra"           ,Tgeneral_address_t,_param->_size_general_register);
109      ALLOC1_SIGNAL_IN ( in_REEXECUTE_READ_RB              ,"read_rb"              ,Tcontrol_t        ,1                             );
110      ALLOC1_SIGNAL_IN ( in_REEXECUTE_NUM_REG_RB           ,"num_reg_rb"           ,Tgeneral_address_t,_param->_size_general_register);
111      ALLOC1_SIGNAL_IN ( in_REEXECUTE_READ_RC              ,"read_rc"              ,Tcontrol_t        ,1                             );
112      ALLOC1_SIGNAL_IN ( in_REEXECUTE_NUM_REG_RC           ,"num_reg_rc"           ,Tspecial_address_t,_param->_size_special_register);
113      ALLOC1_SIGNAL_IN ( in_REEXECUTE_WRITE_RD             ,"write_rd"             ,Tcontrol_t        ,1                             );
114      ALLOC1_SIGNAL_IN ( in_REEXECUTE_NUM_REG_RD           ,"num_reg_rd"           ,Tgeneral_address_t,_param->_size_general_register);
115      ALLOC1_SIGNAL_IN ( in_REEXECUTE_WRITE_RE             ,"write_re"             ,Tcontrol_t        ,1                             );
116      ALLOC1_SIGNAL_IN ( in_REEXECUTE_NUM_REG_RE           ,"num_reg_re"           ,Tspecial_address_t,_param->_size_special_register);
117
118      ALLOC1_INTERFACE_END(_param->_nb_inst_reexecute);
119    }
120
121    // ~~~~~[ Interface : "issue_out" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
122    {
123      ALLOC1_INTERFACE_BEGIN("issue_out",OUT, EAST, _("Go to issue network"),_param->_nb_inst_issue);
124     
125      ALLOC1_VALACK_OUT(out_ISSUE_OUT_VAL                  ,VAL);
126      ALLOC1_VALACK_IN ( in_ISSUE_OUT_ACK                  ,ACK);
127      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_CONTEXT_ID           ,"context_id"           ,Tcontext_t        ,_param->_size_context_id      );
128      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_FRONT_END_ID         ,"front_end_id"         ,Tcontext_t        ,_param->_size_front_end_id    );
129      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_PACKET_ID            ,"packet_id"            ,Tpacket_t         ,_param->_size_rob_ptr         );
130      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_OPERATION            ,"operation"            ,Toperation_t      ,_param->_size_operation       );
131      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_TYPE                 ,"type"                 ,Ttype_t           ,_param->_size_type            );
132      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_CANCEL               ,"cancel"               ,Tcontrol_t        ,1);
133      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_STORE_QUEUE_PTR_WRITE,"store_queue_ptr_write",Tlsq_ptr_t        ,_param->_size_store_queue_ptr );
134      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_STORE_QUEUE_PTR_READ ,"store_queue_ptr_read" ,Tlsq_ptr_t        ,_param->_size_store_queue_ptr );
135      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_STORE_QUEUE_EMPTY    ,"store_queue_empty"    ,Tcontrol_t        ,1);
136      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_LOAD_QUEUE_PTR_WRITE ,"load_queue_ptr_write" ,Tlsq_ptr_t        ,_param->_size_load_queue_ptr  );
137      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_HAS_IMMEDIAT         ,"has_immediat"         ,Tcontrol_t        ,1                             );
138      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_IMMEDIAT             ,"immediat"             ,Tgeneral_data_t   ,_param->_size_general_data    );
139      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_READ_RA              ,"read_ra"              ,Tcontrol_t        ,1                             );
140      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_NUM_REG_RA           ,"num_reg_ra"           ,Tgeneral_address_t,_param->_size_general_register);
141      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_READ_RB              ,"read_rb"              ,Tcontrol_t        ,1                             );
142      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_NUM_REG_RB           ,"num_reg_rb"           ,Tgeneral_address_t,_param->_size_general_register);
143      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_READ_RC              ,"read_rc"              ,Tcontrol_t        ,1                             );
144      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_NUM_REG_RC           ,"num_reg_rc"           ,Tspecial_address_t,_param->_size_special_register);
145      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_WRITE_RD             ,"write_rd"             ,Tcontrol_t        ,1                             );
146      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_NUM_REG_RD           ,"num_reg_rd"           ,Tgeneral_address_t,_param->_size_general_register);
147      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_WRITE_RE             ,"write_re"             ,Tcontrol_t        ,1                             );
148      ALLOC1_SIGNAL_OUT(out_ISSUE_OUT_NUM_REG_RE           ,"num_reg_re"           ,Tspecial_address_t,_param->_size_special_register);
149
150      ALLOC1_INTERFACE_END(_param->_nb_inst_issue);
151    }
152
153    if (usage_is_set(_usage,USE_SYSTEMC))
154      {
155    // ~~~~~[ Registers ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
156    ALLOC1(_issue_queue                     ,std::list<entry_t*>,_param->_nb_bank);
157
158    // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
159    ALLOC1(internal_ISSUE_OUT_VAL           ,Tcontrol_t,_param->_nb_inst_issue);
160    ALLOC1(internal_ISSUE_OUT_FROM_REEXECUTE,Tcontrol_t,_param->_nb_inst_issue);
161    ALLOC1(internal_ISSUE_OUT_NUM_BANK      ,uint32_t  ,_param->_nb_inst_issue);
162    ALLOC1(internal_ISSUE_OUT_ENTRY         ,entry_t * ,_param->_nb_inst_issue);
163
164    ALLOC1(internal_REEXECUTE_ACK           ,Tcontrol_t,_param->_nb_inst_reexecute);
165
166    if (_param->_queue_scheme == ISSUE_QUEUE_SCHEME_OUT_OF_ORDER)
167      {
168    ALLOC1(internal_BANK_IN_ACK             ,Tcontrol_t,_param->_nb_bank);
169    ALLOC1(internal_BANK_IN_NUM_RENAME_UNIT ,uint32_t  ,_param->_nb_bank);
170    ALLOC1(internal_BANK_IN_NUM_INST        ,uint32_t  ,_param->_nb_bank);
171      }
172    if (_param->_queue_scheme == ISSUE_QUEUE_SCHEME_IN_ORDER)
173      {
174    ALLOC2(internal_ISSUE_IN_ACK            ,Tcontrol_t,_param->_nb_rename_unit,_param->_nb_inst_rename[it1]);
175      }
176      }
177
178    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
179    _priority_in  = new generic::priority::Priority (_name+"_priority_in"   ,
180                                                     _param->_priority      ,
181                                                     _param->_load_balancing,
182                                                     _param->_nb_rename_unit,
183                                                     _param->_nb_inst_rename,
184                                                     _param->_nb_rename_unit_select);
185
186    if (_param->_queue_scheme == ISSUE_QUEUE_SCHEME_OUT_OF_ORDER)
187      {
188    _priority_out = new generic::priority::Priority (_name+"_priority_out"  ,
189                                                     _param->_priority      ,
190                                                     _param->_nb_bank,
191                                                     _param->_nb_bank);
192
193    _priority_reg = new generic::priority::Priority (_name+"_priority_reg"  ,
194                                                     _param->_priority      ,
195                                                     _param->_nb_bank,
196                                                     _param->_nb_bank);
197      }
198
199#ifdef POSITION
200    if (usage_is_set(_usage,USE_POSITION))
201      _component->generate_file();
202#endif
203
204    log_end(Issue_queue,FUNCTION);
205  };
206
207}; // end namespace issue_queue
208}; // end namespace ooo_engine
209}; // end namespace multi_ooo_engine
210}; // end namespace core
211
212}; // end namespace behavioural
213}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.