source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Commit_unit/src/Commit_unit_genMealy_retire.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: 10.7 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Commit_unit_genMealy_retire.cpp 123 2009-06-08 20:43:30Z 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::genMealy_retire"
21  void Commit_unit::genMealy_retire (void)
22  {
23    log_begin(Commit_unit,FUNCTION);
24    log_function(Commit_unit,FUNCTION,_name.c_str());
25
26    if (PORT_READ(in_NRESET))
27      {
28    Tcontrol_t retire_val          [_param->_nb_rename_unit][_param->_max_nb_inst_retire];
29    uint32_t   num_inst_retire     [_param->_nb_rename_unit];
30    bool       can_retire          [_param->_nb_rename_unit];
31
32    Tcontrol_t spr_write_val       [_param->_nb_front_end][_param->_max_nb_context];
33    Tcontrol_t spr_write_sr_f_val  [_param->_nb_front_end][_param->_max_nb_context];
34    Tcontrol_t spr_write_sr_f      [_param->_nb_front_end][_param->_max_nb_context];
35    Tcontrol_t spr_write_sr_cy_val [_param->_nb_front_end][_param->_max_nb_context];
36    Tcontrol_t spr_write_sr_cy     [_param->_nb_front_end][_param->_max_nb_context];
37    Tcontrol_t spr_write_sr_ov_val [_param->_nb_front_end][_param->_max_nb_context];
38    Tcontrol_t spr_write_sr_ov     [_param->_nb_front_end][_param->_max_nb_context];
39
40    // Initialisation
41    for (uint32_t i=0; i<_param->_nb_bank; i++)
42      internal_BANK_RETIRE_VAL  [i] = false;
43
44    for (uint32_t i=0; i<_param->_nb_rename_unit; i++)
45      {
46        num_inst_retire [i] = 0;
47        can_retire      [i] = true ;
48        for (uint32_t j=0; j<_param->_nb_inst_retire[i]; j++)
49          retire_val [i][j] = false;
50      }
51    for (uint32_t i=0; i<_param->_nb_front_end; ++i)
52      for (uint32_t j=0; j<_param->_nb_context[i]; ++j)
53        {
54          spr_write_val [i][j] = 0;
55          spr_write_sr_f_val  [i][j] = 0;
56          spr_write_sr_cy_val [i][j] = 0;
57          spr_write_sr_ov_val [i][j] = 0;
58
59        }
60
61    // Scan Top of each bank
62    internal_BANK_RETIRE_HEAD = reg_NUM_BANK_HEAD;
63    for (uint32_t i=0; i<_param->_nb_bank; i++)
64      {
65        uint32_t num_bank = (internal_BANK_RETIRE_HEAD+i)%_param->_nb_bank;
66
67        // Test if have instruction
68        if (not _rob[num_bank].empty())
69          {
70            // Scan all instruction in windows and test if instruction is speculative
71            entry_t  * entry = _rob [num_bank].front();
72            uint32_t   x     = entry->rename_unit_id;
73            uint32_t   y     = num_inst_retire [x];
74            bool       bypass= false;
75            // test if :
76            //  * can retire (all previous instruction is retired)
77            //  * all structure is ok (not busy)
78            if (can_retire [x] and // in-order
79                (y < _param->_nb_inst_retire [x]) and
80                PORT_READ(in_RETIRE_ACK [x][y])) // not busy
81              {
82                rob_state_t state        = entry->state;
83                Tcontext_t  front_end_id = entry->front_end_id;
84                Tcontext_t  context_id   = entry->context_id; 
85               
86                  if ((state == ROB_END_OK         ) or
87                      (state == ROB_END_KO         ) or
88                      (state == ROB_END_BRANCH_MISS) or
89                      (state == ROB_END_LOAD_MISS  ) or
90                      (state == ROB_END_MISS       )//  or
91//                    (state == ROB_END_EXCEPTION)
92                      )
93                    {
94                      Tcontrol_t         write_re       = entry->write_re;
95                      Tspecial_address_t num_reg_re_log = entry->num_reg_re_log;
96                     
97                      // if state is ok, when write flags in the SR regsiters
98                      bool spr_write_ack = true;
99                     
100                      // Write in SR the good flag
101                      if ((state == ROB_END_OK  ) and write_re)
102                        // ROB_END_BRANCH_MISS is a valid branch instruction but don't modify RE
103                        {
104                          spr_write_ack = PORT_READ(in_SPR_WRITE_ACK [front_end_id][context_id]);
105                         
106                          // retire_ack is set !!!
107                          spr_write_val       [front_end_id][context_id] = 1;
108                         
109                          Tspecial_data_t flags = entry->flags;
110                         
111                          switch (num_reg_re_log)
112                            {
113                            case SPR_LOGIC_SR_F     : 
114                              {
115                                spr_write_sr_f_val  [front_end_id][context_id] = 1;
116                                spr_write_sr_f      [front_end_id][context_id] = (flags & FLAG_F )!=0;
117                               
118                                break;
119                              }
120                            case SPR_LOGIC_SR_CY_OV :
121                              {
122                                spr_write_sr_cy_val [front_end_id][context_id] = 1;
123                                spr_write_sr_ov_val [front_end_id][context_id] = 1;     
124                                spr_write_sr_cy     [front_end_id][context_id] = (flags & FLAG_CY)!=0;
125                                spr_write_sr_ov     [front_end_id][context_id] = (flags & FLAG_OV)!=0;
126                               
127                                break;
128                              }
129                            default : 
130                              {
131#ifdef DEBUG_TEST
132                                throw ERRORMORPHEO(FUNCTION,_("Invalid num_reg_re_log.\n"));
133#endif
134                              }
135                            }
136                        }
137                     
138                      // find an instruction can be retire, and in order
139                     
140                      if (spr_write_ack)
141                        {
142                          retire_val [x][y] = 1;
143                          num_inst_retire [x] ++;
144                          internal_BANK_RETIRE_VAL [num_bank] = true;
145                        }
146                     
147                      internal_BANK_RETIRE_NUM_RENAME_UNIT [num_bank] = x;
148                      internal_BANK_RETIRE_NUM_INST        [num_bank] = y;
149                     
150                      if (_param->_have_port_front_end_id)
151                      PORT_WRITE(out_RETIRE_FRONT_END_ID          [x][y], front_end_id                );
152                      if (_param->_have_port_context_id)
153                      PORT_WRITE(out_RETIRE_CONTEXT_ID            [x][y], context_id                  );
154//                    PORT_WRITE(out_RETIRE_RENAME_UNIT_ID        [x][y], entry->rename_unit_id       );
155                      PORT_WRITE(out_RETIRE_USE_STORE_QUEUE       [x][y], entry->use_store_queue      );
156                      PORT_WRITE(out_RETIRE_USE_LOAD_QUEUE        [x][y], entry->use_load_queue       );
157                      PORT_WRITE(out_RETIRE_STORE_QUEUE_PTR_WRITE [x][y], entry->store_queue_ptr_write);
158                      if (_param->_have_port_load_queue_ptr)
159                      PORT_WRITE(out_RETIRE_LOAD_QUEUE_PTR_WRITE  [x][y], entry->load_queue_ptr_write );
160//                       PORT_WRITE(out_RETIRE_READ_RA               [x][y], entry->read_ra              );
161//                       PORT_WRITE(out_RETIRE_NUM_REG_RA_PHY        [x][y], entry->num_reg_ra_phy       );
162//                       PORT_WRITE(out_RETIRE_READ_RB               [x][y], entry->read_rb              );
163//                       PORT_WRITE(out_RETIRE_NUM_REG_RB_PHY        [x][y], entry->num_reg_rb_phy       );
164//                       PORT_WRITE(out_RETIRE_READ_RC               [x][y], entry->read_rc              );
165//                       PORT_WRITE(out_RETIRE_NUM_REG_RC_PHY        [x][y], entry->num_reg_rc_phy       );
166                      PORT_WRITE(out_RETIRE_WRITE_RD              [x][y], entry->write_rd             );
167                      PORT_WRITE(out_RETIRE_NUM_REG_RD_LOG        [x][y], entry->num_reg_rd_log       );
168                      PORT_WRITE(out_RETIRE_NUM_REG_RD_PHY_OLD    [x][y], entry->num_reg_rd_phy_old   );
169                      PORT_WRITE(out_RETIRE_NUM_REG_RD_PHY_NEW    [x][y], entry->num_reg_rd_phy_new   );
170                      PORT_WRITE(out_RETIRE_WRITE_RE              [x][y], write_re                    );
171                      PORT_WRITE(out_RETIRE_NUM_REG_RE_LOG        [x][y], num_reg_re_log              );
172                      PORT_WRITE(out_RETIRE_NUM_REG_RE_PHY_OLD    [x][y], entry->num_reg_re_phy_old   );
173                      PORT_WRITE(out_RETIRE_NUM_REG_RE_PHY_NEW    [x][y], entry->num_reg_re_phy_new   );
174
175                      // Event -> rob must be manage this event
176                      if ((state == ROB_END_BRANCH_MISS) or
177                          (state == ROB_END_LOAD_MISS))
178                        can_retire [x] = false;
179                    }
180
181                  bypass = ((state == ROB_END              ) or
182                            (state == ROB_STORE_OK         ) or
183                            (state == ROB_STORE_KO         ) or
184                            (state == ROB_STORE_OK_WAIT_END) or
185                            (state == ROB_STORE_KO_WAIT_END));
186                 
187                  uint32_t packet = ((entry->ptr << _param->_shift_num_slot) | num_bank);
188
189                  // if future event, don't update after this event
190                  if ((reg_EVENT_STATE  [entry->front_end_id][entry->context_id] == COMMIT_EVENT_STATE_NOT_YET_EVENT) and
191                      (reg_EVENT_PACKET [entry->front_end_id][entry->context_id] == packet))
192                    bypass = false;
193              }
194
195            // Retire "in-order"
196            can_retire [x]  &= (retire_val [x][y] or bypass);
197          }
198      }
199   
200    for (uint32_t i=0; i<_param->_nb_rename_unit; i++)
201      for (uint32_t j=0; j<_param->_nb_inst_retire[i]; j++)
202        PORT_WRITE(out_RETIRE_VAL [i][j],retire_val [i][j]);
203
204    for (uint32_t i=0; i<_param->_nb_front_end; ++i)
205      for (uint32_t j=0; j<_param->_nb_context[i]; ++j)
206        {
207          PORT_WRITE(out_SPR_WRITE_VAL       [i][j], spr_write_val       [i][j]);
208          PORT_WRITE(out_SPR_WRITE_SR_F_VAL  [i][j], spr_write_sr_f_val  [i][j]);
209          PORT_WRITE(out_SPR_WRITE_SR_F      [i][j], spr_write_sr_f      [i][j]);
210          PORT_WRITE(out_SPR_WRITE_SR_CY_VAL [i][j], spr_write_sr_cy_val [i][j]);
211          PORT_WRITE(out_SPR_WRITE_SR_CY     [i][j], spr_write_sr_cy     [i][j]);
212          PORT_WRITE(out_SPR_WRITE_SR_OV_VAL [i][j], spr_write_sr_ov_val [i][j]);
213          PORT_WRITE(out_SPR_WRITE_SR_OV     [i][j], spr_write_sr_ov     [i][j]);
214        }
215      }
216    else
217      {
218        for (uint32_t i=0; i<_param->_nb_rename_unit; i++)
219          for (uint32_t j=0; j<_param->_nb_inst_retire[i]; j++)
220            PORT_WRITE(out_RETIRE_VAL [i][j],0);
221      }
222
223    log_end(Commit_unit,FUNCTION);
224  };
225
226}; // end namespace commit_unit
227}; // end namespace ooo_engine
228}; // end namespace multi_ooo_engine
229}; // end namespace core
230}; // end namespace behavioural
231}; // end namespace morpheo             
232#endif
Note: See TracBrowser for help on using the repository browser.