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

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

1) Bug fix (Operation, Instruction)
2) Modif Return Address Stack
3) Add Soft Test
4) Add Soc Test

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