source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Reexecute_unit/src/Reexecute_unit_allocation.cpp

Last change on this file 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: 13.4 KB
Line 
1/*
2 * $Id: Reexecute_unit_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/Reexecute_unit/include/Reexecute_unit.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 reexecute_unit {
18
19
20
21#undef  FUNCTION
22#define FUNCTION "Reexecute_unit::allocation"
23  void Reexecute_unit::allocation (
24#ifdef STATISTICS
25                               morpheo::behavioural::Parameters_Statistics * param_statistics
26#else
27                               void
28#endif
29                               )
30  {
31    log_begin(Reexecute_unit,FUNCTION);
32
33    _component   = new Component (_usage);
34
35    Entity * entity = _component->set_entity (_name       
36                                              ,"Reexecute_unit"
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    // ~~~~~[ Interface "execute_loop" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
59    {
60      ALLOC2_INTERFACE_BEGIN("execute_loop", IN, EAST, _("Instruction executed from execute_loop"),_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
61
62      _ALLOC2_VALACK_IN ( in_EXECUTE_LOOP_VAL                     ,VAL,_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
63      _ALLOC2_VALACK_OUT(out_EXECUTE_LOOP_ACK                     ,ACK,_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
64      _ALLOC2_SIGNAL_IN ( in_EXECUTE_LOOP_CONTEXT_ID              ,"context_id"  ,Tcontext_t         ,_param->_size_context_id  ,_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
65      _ALLOC2_SIGNAL_IN ( in_EXECUTE_LOOP_FRONT_END_ID            ,"front_end_id",Tcontext_t         ,_param->_size_front_end_id,_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
66      _ALLOC2_SIGNAL_IN ( in_EXECUTE_LOOP_PACKET_ID               ,"packet_id"   ,Tpacket_t          ,_param->_size_rob_ptr     ,_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
67//    _ALLOC2_SIGNAL_IN ( in_EXECUTE_LOOP_OPERATION               ,"operation"   ,Toperation_t       ,_param->_size_operation   ,_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
68//    _ALLOC2_SIGNAL_IN ( in_EXECUTE_LOOP_TYPE                    ,"type"        ,Ttype_t            ,_param->_size_type        ,_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
69      _ALLOC2_SIGNAL_IN ( in_EXECUTE_LOOP_CANCEL                  ,"cancel"      ,Tcontrol_t         ,1                         ,_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
70      _ALLOC2_SIGNAL_IN ( in_EXECUTE_LOOP_FLAGS                   ,"flags"       ,Tspecial_data_t    ,_param->_size_special_data,_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
71      _ALLOC2_SIGNAL_IN ( in_EXECUTE_LOOP_EXCEPTION               ,"exception"   ,Texception_t       ,_param->_size_exception   ,_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
72      _ALLOC2_SIGNAL_IN ( in_EXECUTE_LOOP_NO_SEQUENCE             ,"no_sequence" ,Tcontrol_t         ,1                         ,_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
73      _ALLOC2_SIGNAL_IN ( in_EXECUTE_LOOP_ADDRESS                 ,"address"     ,Taddress_t         ,_param->_size_instruction_address,_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
74      _ALLOC2_SIGNAL_IN ( in_EXECUTE_LOOP_DATA                    ,"data"        ,Tgeneral_data_t    ,_param->_size_general_data,_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
75
76      ALLOC2_INTERFACE_END(_param->_nb_execute_loop,_param->_nb_inst_execute[it1]);
77    }
78
79    // ~~~~~[ Interface "commit" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
80    {
81      ALLOC1_INTERFACE_BEGIN("commit",OUT,WEST, _("Instruction executed to Re Order Buffer"),_param->_nb_inst_commit);
82
83      ALLOC1_VALACK_OUT(out_COMMIT_VAL                           ,VAL);
84      ALLOC1_VALACK_IN ( in_COMMIT_ACK                           ,ACK);
85      ALLOC1_SIGNAL_OUT(out_COMMIT_WEN                           ,"wen"         ,Tcontrol_t         ,1);
86//    ALLOC1_SIGNAL_OUT(out_COMMIT_CONTEXT_ID                    ,"context_id"  ,Tcontext_t         ,_param->_size_context_id  );
87//    ALLOC1_SIGNAL_OUT(out_COMMIT_FRONT_END_ID                  ,"front_end_id",Tcontext_t         ,_param->_size_front_end_id);
88      ALLOC1_SIGNAL_OUT(out_COMMIT_PACKET_ID                     ,"packet_id"   ,Tpacket_t          ,_param->_size_rob_ptr     );
89//    ALLOC1_SIGNAL_OUT(out_COMMIT_OPERATION                     ,"operation"   ,Toperation_t       ,_param->_size_operation   );
90//    ALLOC1_SIGNAL_OUT(out_COMMIT_TYPE                          ,"type"        ,Ttype_t            ,_param->_size_type        );
91      ALLOC1_SIGNAL_OUT(out_COMMIT_CANCEL                        ,"cancel"      ,Tcontrol_t         ,1                         );
92      ALLOC1_SIGNAL_OUT(out_COMMIT_FLAGS                         ,"flags"       ,Tspecial_data_t    ,_param->_size_special_data);
93      ALLOC1_SIGNAL_OUT(out_COMMIT_EXCEPTION                     ,"exception"   ,Texception_t       ,_param->_size_exception   );
94      ALLOC1_SIGNAL_OUT(out_COMMIT_NO_SEQUENCE                   ,"no_sequence" ,Tcontrol_t         ,1                         );
95      ALLOC1_SIGNAL_OUT(out_COMMIT_ADDRESS                       ,"address"     ,Taddress_t         ,_param->_size_instruction_address);
96      ALLOC1_SIGNAL_IN ( in_COMMIT_NUM_REG_RD                    ,"num_reg_rd"  ,Tgeneral_address_t ,_param->_size_general_register);
97
98      ALLOC1_INTERFACE_END(_param->_nb_inst_commit);
99    }
100
101    // ~~~~~[ Interface : "spr" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
102    {
103      ALLOC1_INTERFACE_BEGIN("spr",OUT,EAST, _("Access to Special Register"), _param->_nb_inst_reexecute);
104
105      ALLOC1_VALACK_OUT(out_SPR_VAL                              ,VAL);
106      ALLOC1_VALACK_IN ( in_SPR_ACK                              ,ACK);
107      ALLOC1_SIGNAL_OUT(out_SPR_WEN                              ,"wen"         ,Tcontrol_t         ,1);
108      ALLOC1_SIGNAL_OUT(out_SPR_CONTEXT_ID                       ,"context_id"  ,Tcontext_t         ,_param->_size_context_id  );
109      ALLOC1_SIGNAL_OUT(out_SPR_FRONT_END_ID                     ,"front_end_id",Tcontext_t         ,_param->_size_front_end_id);
110      ALLOC1_SIGNAL_OUT(out_SPR_NUM_GROUP                        ,"num_group"   ,Tspr_address_t     ,_param->_size_special_address_group   );
111      ALLOC1_SIGNAL_OUT(out_SPR_NUM_REG                          ,"num_reg"     ,Tspr_address_t     ,_param->_size_special_address_register);
112      ALLOC1_SIGNAL_OUT(out_SPR_WDATA                            ,"wdata"       ,Tspr_t             ,_param->_size_spr);
113      ALLOC1_SIGNAL_IN ( in_SPR_RDATA                            ,"rdata"       ,Tspr_t             ,_param->_size_spr);
114      ALLOC1_SIGNAL_IN ( in_SPR_INVALID                          ,"invalid"     ,Tcontrol_t         ,1);
115
116      ALLOC1_INTERFACE_END(_param->_nb_inst_reexecute);
117    }
118
119    // ~~~~~[ Interface : "reexecute_rob" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
120    {
121      ALLOC1_INTERFACE_BEGIN("reexecute_rob", IN,EAST, _("Instruction reexecuted by the Re Order Buffer (Store head)"), _param->_nb_inst_reexecute);
122
123      ALLOC1_VALACK_IN ( in_REEXECUTE_ROB_VAL                    ,VAL);
124      ALLOC1_VALACK_OUT(out_REEXECUTE_ROB_ACK                    ,ACK);
125      ALLOC1_SIGNAL_IN ( in_REEXECUTE_ROB_CONTEXT_ID             ,"context_id"           ,Tcontext_t         ,_param->_size_context_id);
126      ALLOC1_SIGNAL_IN ( in_REEXECUTE_ROB_FRONT_END_ID           ,"front_end_id"         ,Tcontext_t         ,_param->_size_front_end_id);
127      ALLOC1_SIGNAL_IN ( in_REEXECUTE_ROB_PACKET_ID              ,"packet_id"            ,Tpacket_t          ,_param->_size_rob_ptr  );
128      ALLOC1_SIGNAL_IN ( in_REEXECUTE_ROB_OPERATION              ,"operation"            ,Toperation_t       ,_param->_size_operation);
129      ALLOC1_SIGNAL_IN ( in_REEXECUTE_ROB_TYPE                   ,"type"                 ,Ttype_t            ,_param->_size_type);
130      ALLOC1_SIGNAL_IN ( in_REEXECUTE_ROB_STORE_QUEUE_PTR_WRITE  ,"store_queue_ptr_write",Tlsq_ptr_t         ,_param->_size_store_queue_ptr);
131
132      ALLOC1_INTERFACE_END(_param->_nb_inst_reexecute);
133    }
134
135    // ~~~~~[ Interface : "reexecute" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
136    {
137      ALLOC1_INTERFACE_BEGIN("reexecute",OUT,SOUTH, _("Instruction reexecute, send at the issue_queue"), _param->_nb_inst_reexecute);
138
139      ALLOC1_VALACK_OUT(out_REEXECUTE_VAL                  ,VAL);
140      ALLOC1_VALACK_IN ( in_REEXECUTE_ACK                  ,ACK);
141      ALLOC1_SIGNAL_OUT(out_REEXECUTE_CONTEXT_ID           ,"context_id"           ,Tcontext_t        ,_param->_size_context_id      );
142      ALLOC1_SIGNAL_OUT(out_REEXECUTE_FRONT_END_ID         ,"front_end_id"         ,Tcontext_t        ,_param->_size_front_end_id    );
143      ALLOC1_SIGNAL_OUT(out_REEXECUTE_PACKET_ID            ,"packet_id"            ,Tpacket_t         ,_param->_size_rob_ptr         );
144      ALLOC1_SIGNAL_OUT(out_REEXECUTE_OPERATION            ,"operation"            ,Toperation_t      ,_param->_size_operation       );
145      ALLOC1_SIGNAL_OUT(out_REEXECUTE_TYPE                 ,"type"                 ,Ttype_t           ,_param->_size_type            );
146      ALLOC1_SIGNAL_OUT(out_REEXECUTE_STORE_QUEUE_PTR_WRITE,"store_queue_ptr_write",Tlsq_ptr_t        ,_param->_size_store_queue_ptr );
147      ALLOC1_SIGNAL_OUT(out_REEXECUTE_STORE_QUEUE_PTR_READ ,"store_queue_ptr_read" ,Tlsq_ptr_t        ,_param->_size_store_queue_ptr );
148      ALLOC1_SIGNAL_OUT(out_REEXECUTE_STORE_QUEUE_EMPTY    ,"store_queue_empty"    ,Tcontrol_t        ,1);
149      ALLOC1_SIGNAL_OUT(out_REEXECUTE_LOAD_QUEUE_PTR_WRITE ,"load_queue_ptr_write" ,Tlsq_ptr_t        ,_param->_size_load_queue_ptr  );
150      ALLOC1_SIGNAL_OUT(out_REEXECUTE_HAS_IMMEDIAT         ,"has_immediat"         ,Tcontrol_t        ,1                             );
151      ALLOC1_SIGNAL_OUT(out_REEXECUTE_IMMEDIAT             ,"immediat"             ,Tgeneral_data_t   ,_param->_size_general_data    );
152      ALLOC1_SIGNAL_OUT(out_REEXECUTE_READ_RA              ,"read_ra"              ,Tcontrol_t        ,1                             );
153      ALLOC1_SIGNAL_OUT(out_REEXECUTE_NUM_REG_RA           ,"num_reg_ra"           ,Tgeneral_address_t,_param->_size_general_register);
154      ALLOC1_SIGNAL_OUT(out_REEXECUTE_READ_RB              ,"read_rb"              ,Tcontrol_t        ,1                             );
155      ALLOC1_SIGNAL_OUT(out_REEXECUTE_NUM_REG_RB           ,"num_reg_rb"           ,Tgeneral_address_t,_param->_size_general_register);
156      ALLOC1_SIGNAL_OUT(out_REEXECUTE_READ_RC              ,"read_rc"              ,Tcontrol_t        ,1                             );
157      ALLOC1_SIGNAL_OUT(out_REEXECUTE_NUM_REG_RC           ,"num_reg_rc"           ,Tspecial_address_t,_param->_size_special_register);
158      ALLOC1_SIGNAL_OUT(out_REEXECUTE_WRITE_RD             ,"write_rd"             ,Tcontrol_t        ,1                             );
159      ALLOC1_SIGNAL_OUT(out_REEXECUTE_NUM_REG_RD           ,"num_reg_rd"           ,Tgeneral_address_t,_param->_size_general_register);
160      ALLOC1_SIGNAL_OUT(out_REEXECUTE_WRITE_RE             ,"write_re"             ,Tcontrol_t        ,1                             );
161      ALLOC1_SIGNAL_OUT(out_REEXECUTE_NUM_REG_RE           ,"num_reg_re"           ,Tspecial_address_t,_param->_size_special_register);
162
163      ALLOC1_INTERFACE_END(_param->_nb_inst_reexecute);
164    }
165
166    if (usage_is_set(_usage,USE_SYSTEMC))
167      {
168    // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
169    ALLOC1(_reexecute_queue         ,std::list<entry_t *>,_param->_nb_bank);
170
171    // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
172    ALLOC1(internal_QUEUE_PUSH             ,Tcontrol_t,_param->_nb_bank);
173    ALLOC1(internal_QUEUE_NUM_EXECUTE_LOOP ,uint32_t  ,_param->_nb_bank);
174    ALLOC1(internal_QUEUE_NUM_INST_EXECUTE ,uint32_t  ,_param->_nb_bank);
175    ALLOC1(internal_QUEUE_NUM_INST_COMMIT  ,uint32_t  ,_param->_nb_bank);
176    ALLOC1(internal_QUEUE_INFO             ,info_t    ,_param->_nb_bank);
177    ALLOC1(internal_SPR_VAL                ,Tcontrol_t,_param->_nb_inst_reexecute);
178    ALLOC1(internal_REEXECUTE_ROB_ACK      ,Tcontrol_t,_param->_nb_inst_reexecute);
179    ALLOC1(internal_REEXECUTE_VAL          ,Tcontrol_t,_param->_nb_inst_reexecute);
180#ifdef STATISTICS
181    ALLOC1(internal_COMMIT_VAL             ,Tcontrol_t,_param->_nb_inst_commit);
182#endif
183      }
184
185    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
186    _priority_execute_loop = new generic::priority::Priority (_name+"_priority_execute_loop",
187                                                              _param->_priority_execute_loop,
188                                                              _param->_load_balancing ,
189                                                              _param->_nb_execute_loop,
190                                                              _param->_nb_inst_execute,
191                                                              _param->_nb_execute_loop_select);
192
193    _priority_queue_in     = new generic::priority::Priority (_name+"_priority_queue_in",
194                                                              _param->_priority_queue_in,
195                                                              _param->_nb_bank);
196
197#ifdef POSITION
198    if (usage_is_set(_usage,USE_POSITION))
199        _component->generate_file();
200#endif
201
202    log_end(Reexecute_unit,FUNCTION);
203  };
204
205}; // end namespace reexecute_unit
206}; // end namespace ooo_engine
207}; // end namespace multi_ooo_engine
208}; // end namespace core
209
210}; // end namespace behavioural
211}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.