source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Commit_unit/src/Commit_unit_genMoore.cpp @ 118

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

1) Stat List : scan all queue to find free register
2) Write_queue : test "genMealy" add bypass [0]
3) Functionnal_unit : add const parameters to add or not the pipeline_in
4) Load Store Unit : if load make an exception, free nb_check
5) Debug, change test to add model

  • Property svn:keywords set to Id
File size: 8.5 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Commit_unit_genMoore.cpp 118 2009-05-20 22:01:32Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Commit_unit/include/Commit_unit.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_ooo_engine {
15namespace ooo_engine {
16namespace commit_unit {
17
18
19#undef  FUNCTION
20#define FUNCTION "Commit_unit::genMoore"
21  void Commit_unit::genMoore (void)
22  {
23    log_begin(Commit_unit,FUNCTION);
24    log_function(Commit_unit,FUNCTION,_name.c_str());
25
26    // ===================================================================
27    // =====[ REEXECUTE ]=================================================
28    // ===================================================================
29    {
30      log_printf(TRACE,Commit_unit,FUNCTION,"  * REEXECUTE [0]");
31
32      // Store instruction comming Out Of Order in Load Store Unit.
33      // Must be executed in no speculative mode. Also, send a signal when an Store is in head of ROB
34
35      Tcontrol_t val      = false;
36      uint32_t   num_bank = reg_NUM_BANK_HEAD;
37
38      if (not _rob[num_bank].empty())
39        {
40          log_printf(TRACE,Commit_unit,FUNCTION,"    * ROB is not empty");
41          log_printf(TRACE,Commit_unit,FUNCTION,"    * num_bank      : %d",num_bank);
42
43          entry_t    * entry = _rob [num_bank].front();
44          rob_state_t  state = entry->state;
45
46          // Test state
47          val   = ((state == ROB_STORE_HEAD_OK) or
48                   (state == ROB_STORE_HEAD_KO));
49
50          log_printf(TRACE,Commit_unit,FUNCTION,"    * val           : %d",val);
51          if (val)
52            {
53              Tpacket_t packet_id = ((entry->ptr << _param->_shift_num_slot) | num_bank);
54
55              log_printf(TRACE,Commit_unit,FUNCTION,"    * packet_id     : %d",packet_id);
56         
57              // Reexecute store
58              if (_param->_have_port_context_id)
59              PORT_WRITE(out_REEXECUTE_CONTEXT_ID            [0], entry->context_id           );
60              if (_param->_have_port_front_end_id)
61              PORT_WRITE(out_REEXECUTE_FRONT_END_ID          [0], entry->front_end_id         );
62              if (_param->_have_port_rob_ptr  )
63              PORT_WRITE(out_REEXECUTE_PACKET_ID             [0], packet_id                   );
64              PORT_WRITE(out_REEXECUTE_TYPE                  [0], entry->type                 );
65              PORT_WRITE(out_REEXECUTE_STORE_QUEUE_PTR_WRITE [0], entry->store_queue_ptr_write);
66              PORT_WRITE(out_REEXECUTE_OPERATION             [0], (state == ROB_STORE_HEAD_OK)?OPERATION_MEMORY_STORE_HEAD_OK:OPERATION_MEMORY_STORE_HEAD_KO);
67            }
68        }
69 
70      internal_REEXECUTE_VAL      [0] = val;
71      internal_REEXECUTE_NUM_BANK [0] = num_bank;
72     
73      PORT_WRITE(out_REEXECUTE_VAL[0], internal_REEXECUTE_VAL [0]);
74    }
75
76    // ===================================================================
77    // =====[ BRANCH_COMPLETE ]===========================================
78    // ===================================================================
79    {
80      // Branchement must be send at the prediction unit
81      uint32_t nb_scan_bank = 0;
82
83      // for each port, find a valid branchement.
84      for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++)
85        {
86          Tcontrol_t  val  = false;
87         
88          for (uint32_t j=nb_scan_bank; j<_param->_nb_bank; j++)
89            {
90              nb_scan_bank ++;
91
92              // translate bank number
93              uint32_t num_bank = (reg_NUM_BANK_HEAD+j)%_param->_nb_bank;
94             
95              if (not _rob [num_bank].empty())
96                {
97                  entry_t    * entry    = _rob [num_bank].front();
98                  rob_state_t  state    = entry->state;
99                 
100                  if (state == ROB_BRANCH_COMPLETE)
101                    {
102                      val = true;
103                     
104                      internal_BRANCH_COMPLETE_NUM_BANK           [i] = num_bank;
105                     
106                      if (_param->_have_port_context_id)
107                      PORT_WRITE(out_BRANCH_COMPLETE_CONTEXT_ID   [i], entry->context_id      );
108                      if (_param->_have_port_front_end_id)
109                      PORT_WRITE(out_BRANCH_COMPLETE_FRONT_END_ID [i], entry->front_end_id    );
110                      if (_param->_have_port_depth)
111                      PORT_WRITE(out_BRANCH_COMPLETE_DEPTH        [i], entry->depth           );
112                      PORT_WRITE(out_BRANCH_COMPLETE_ADDRESS      [i], entry->address_next    );
113//                    PORT_WRITE(out_BRANCH_COMPLETE_FLAG         [i],(entry->flags&FLAG_F)!=0);
114                      PORT_WRITE(out_BRANCH_COMPLETE_NO_SEQUENCE  [i], entry->no_sequence     );
115                     
116                      break;
117                    }
118                }
119            }
120
121          internal_BRANCH_COMPLETE_VAL [i] = val;
122          PORT_WRITE(out_BRANCH_COMPLETE_VAL [i], internal_BRANCH_COMPLETE_VAL [i]);
123        }
124    }
125
126    // ===================================================================
127    // =====[ UPDATE ]====================================================
128    // ===================================================================
129    {
130      internal_UPDATE_VAL = 0;
131      internal_UPDATE_NUM_BANK = reg_NUM_BANK_HEAD;
132
133      if (not _rob[internal_UPDATE_NUM_BANK].empty())
134        {
135          log_printf(TRACE,Commit_unit,FUNCTION,"  * UPDATE");
136          log_printf(TRACE,Commit_unit,FUNCTION,"    * num_bank : %d",internal_UPDATE_NUM_BANK);
137
138          entry_t * entry = _rob [internal_UPDATE_NUM_BANK].front();
139
140          switch (entry->state)
141            {
142            case ROB_END_EXCEPTION_UPDATE :
143              {
144                internal_UPDATE_VAL = 1;
145                throw ERRORMORPHEO(FUNCTION,_("Moore : exception is not yet supported (Coming Soon).\n"));
146                break;
147              }
148            case ROB_END_LOAD_MISS_UPDATE :
149              {
150                log_printf(TRACE,Commit_unit,FUNCTION,"    * ROB_END_LOAD_MISS_UPDATE");
151
152                internal_UPDATE_VAL = 1;
153
154                Tcontext_t front_end_id = entry->front_end_id;
155                Tcontext_t context_id   = entry->context_id  ;
156
157                log_printf(TRACE,Commit_unit,FUNCTION,"      * front_end_id : %d",front_end_id);
158                log_printf(TRACE,Commit_unit,FUNCTION,"      * context_id   : %d",context_id  );
159
160                if (_param->_have_port_front_end_id)
161                PORT_WRITE(out_UPDATE_FRONT_END_ID    ,front_end_id);
162                if (_param->_have_port_context_id)
163                PORT_WRITE(out_UPDATE_CONTEXT_ID      ,context_id  );
164                if (_param->_have_port_depth)
165                PORT_WRITE(out_UPDATE_DEPTH           ,entry->depth);
166                PORT_WRITE(out_UPDATE_TYPE            ,EVENT_TYPE_LOAD_MISS_SPECULATION);
167//                 PORT_WRITE(out_UPDATE_IS_DELAY_SLOT   ,reg_PC_CURRENT_IS_DS      [front_end_id][context_id]);
168//                 PORT_WRITE(out_UPDATE_ADDRESS         ,reg_PC_CURRENT            [front_end_id][context_id]);
169//                 PORT_WRITE(out_UPDATE_ADDRESS_EPCR_VAL,reg_PC_CURRENT_IS_DS_TAKE [front_end_id][context_id]);
170//                 PORT_WRITE(out_UPDATE_ADDRESS_EPCR    ,reg_PC_NEXT               [front_end_id][context_id]);
171//                 PORT_WRITE(out_UPDATE_ADDRESS_EEAR_VAL,0);
172// //              PORT_WRITE(out_UPDATE_ADDRESS_EEAR    ,);
173
174                PORT_WRITE(out_UPDATE_IS_DELAY_SLOT   ,0);
175                PORT_WRITE(out_UPDATE_ADDRESS         ,reg_PC_NEXT [front_end_id][context_id]);
176                PORT_WRITE(out_UPDATE_ADDRESS_EPCR_VAL,0);
177//              PORT_WRITE(out_UPDATE_ADDRESS_EPCR    ,);
178                PORT_WRITE(out_UPDATE_ADDRESS_EEAR_VAL,0);
179//              PORT_WRITE(out_UPDATE_ADDRESS_EEAR    ,);
180
181                break;
182              }
183            default :
184              {
185//                 internal_UPDATE_VAL = 0;
186              }
187            }
188        }
189     
190      PORT_WRITE(out_UPDATE_VAL, internal_UPDATE_VAL);
191
192      log_printf(TRACE,Commit_unit,FUNCTION,"  * UPDATE (end)");
193    }
194 
195    // ===================================================================
196    // =====[ NB_INST ]===================================================
197    // ===================================================================
198    for (uint32_t i=0; i<_param->_nb_front_end; i++)
199      for (uint32_t j=0; j<_param->_nb_context [i]; j++)
200        {
201          PORT_WRITE(out_NB_INST_COMMIT_ALL [i][j], reg_NB_INST_COMMIT_ALL [i][j]);
202          PORT_WRITE(out_NB_INST_COMMIT_MEM [i][j], reg_NB_INST_COMMIT_MEM [i][j]);
203        }
204
205    // ===================================================================
206    // =====[ RETIRE_EVENT ]==============================================
207    // ===================================================================
208    for (uint32_t i=0; i<_param->_nb_front_end; i++)
209      for (uint32_t j=0; j<_param->_nb_context [i]; j++)
210        PORT_WRITE(out_RETIRE_EVENT_STATE [i][j], reg_EVENT_STATE[i][j]);
211
212    log_end(Commit_unit,FUNCTION);
213  };
214
215}; // end namespace commit_unit
216}; // end namespace ooo_engine
217}; // end namespace multi_ooo_engine
218}; // end namespace core
219}; // end namespace behavioural
220}; // end namespace morpheo             
221#endif
Note: See TracBrowser for help on using the repository browser.