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

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

1) Fix bug (read unit, RAT -> write in R0, SPR desallocation ...)
2) Change VHDL Execute_queue -> use Generic/Queue?
3) Complete document on VHDL generation
4) Add soc test

  • Property svn:keywords set to Id
File size: 5.7 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Commit_unit_genMoore.cpp 98 2008-12-31 10:18:08Z 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      Tcontrol_t val = false;
31
32      if (not _rob[reg_NUM_BANK_HEAD].empty())
33        {
34          entry_t    * entry = _rob [reg_NUM_BANK_HEAD].front();
35          rob_state_t  state = entry->state;
36
37          val   = ((state == ROB_STORE_HEAD_OK) or
38                   (state == ROB_STORE_HEAD_KO));
39         
40          if (val)
41            {
42              if (_param->_have_port_context_id)
43              PORT_WRITE(out_REEXECUTE_CONTEXT_ID            [0], entry->context_id           );
44              if (_param->_have_port_front_end_id)
45              PORT_WRITE(out_REEXECUTE_FRONT_END_ID          [0], entry->front_end_id         );
46              if (_param->_have_port_rob_ptr  )
47              PORT_WRITE(out_REEXECUTE_PACKET_ID             [0], entry->ptr                  );
48              PORT_WRITE(out_REEXECUTE_TYPE                  [0], entry->type                 );
49              PORT_WRITE(out_REEXECUTE_STORE_QUEUE_PTR_WRITE [0], entry->store_queue_ptr_write);
50              PORT_WRITE(out_REEXECUTE_OPERATION             [0], (state == ROB_STORE_HEAD_OK)?OPERATION_MEMORY_STORE_HEAD_OK:OPERATION_MEMORY_STORE_HEAD_KO);
51            }
52        }
53 
54      internal_REEXECUTE_VAL      [0] = val;
55      internal_REEXECUTE_NUM_BANK [0] = reg_NUM_BANK_HEAD;
56     
57      PORT_WRITE(out_REEXECUTE_VAL[0], internal_REEXECUTE_VAL [0]);
58    }
59
60    // ===================================================================
61    // =====[ BRANCH_COMPLETE ]===========================================
62    // ===================================================================
63    {
64      uint32_t nb_scan_bank = 0;
65
66      for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++)
67        {
68          Tcontrol_t  val  = false;
69         
70          for (uint32_t j=nb_scan_bank; j<_param->_nb_bank; j++)
71            {
72              nb_scan_bank ++;
73
74              uint32_t num_bank = (reg_NUM_BANK_HEAD+j)%_param->_nb_bank;
75             
76              if (not _rob [num_bank].empty())
77                {
78                  entry_t    * entry    = _rob [num_bank].front();
79                  rob_state_t  state    = entry->state;
80                 
81                  if (state == ROB_BRANCH_COMPLETE)
82                    {
83                      val = true;
84                     
85                      internal_BRANCH_COMPLETE_NUM_BANK           [i] = num_bank;
86                     
87                      if (_param->_have_port_context_id)
88                      PORT_WRITE(out_BRANCH_COMPLETE_CONTEXT_ID   [i], entry->context_id      );
89                      if (_param->_have_port_front_end_id)
90                      PORT_WRITE(out_BRANCH_COMPLETE_FRONT_END_ID [i], entry->front_end_id    );
91                      if (_param->_have_port_depth)
92                      PORT_WRITE(out_BRANCH_COMPLETE_DEPTH        [i], entry->depth           );
93                      PORT_WRITE(out_BRANCH_COMPLETE_ADDRESS      [i], entry->data_commit     );
94//                    PORT_WRITE(out_BRANCH_COMPLETE_FLAG         [i],(entry->flags&FLAG_F)!=0);
95                      PORT_WRITE(out_BRANCH_COMPLETE_NO_SEQUENCE  [i], entry->no_sequence     );
96                     
97                      break;
98                    }
99                }
100            }
101
102          internal_BRANCH_COMPLETE_VAL [i] = val;
103          PORT_WRITE(out_BRANCH_COMPLETE_VAL [i], internal_BRANCH_COMPLETE_VAL [i]);
104        }
105    }
106
107    // ===================================================================
108    // =====[ UPDATE ]====================================================
109    // ===================================================================
110    {
111      Tcontrol_t val = false;
112
113      if (not _rob[reg_NUM_BANK_HEAD].empty())
114        {
115          entry_t    * entry = _rob [reg_NUM_BANK_HEAD].front();
116          rob_state_t  state = entry->state;
117
118          val   = (state == ROB_END_EXCEPTION);
119         
120          if (val)
121            {
122              throw ERRORMORPHEO(FUNCTION,_("Moore : exception is not yet supported (Coming Soon).\n"));
123            }
124        }
125    }
126
127//   public    : SC_OUT(Tcontrol_t         )   * out_UPDATE_VAL                        ;
128//   public    : SC_IN (Tcontrol_t         )   *  in_UPDATE_ACK                        ;
129//   public    : SC_OUT(Tcontext_t         )   * out_UPDATE_CONTEXT_ID                 ;
130//   public    : SC_OUT(Tcontext_t         )   * out_UPDATE_FRONT_END_ID               ;
131//   public    : SC_OUT(Tdepth_t           )   * out_UPDATE_DEPTH                      ;
132//   public    : SC_OUT(Tevent_type_t      )   * out_UPDATE_TYPE                       ;
133//   public    : SC_OUT(Tcontrol_t         )   * out_UPDATE_IS_DELAY_SLOT              ;
134//   public    : SC_OUT(Taddress_t         )   * out_UPDATE_ADDRESS                    ;
135//   public    : SC_OUT(Taddress_t         )   * out_UPDATE_ADDRESS_EPCR               ;
136//   public    : SC_OUT(Tcontrol_t         )   * out_UPDATE_ADDRESS_EEAR_VAL           ;
137//   public    : SC_OUT(Taddress_t         )   * out_UPDATE_ADDRESS_EEAR               ;
138 
139    // ===================================================================
140    // =====[ NB_INST ]===================================================
141    // ===================================================================
142    for (uint32_t i=0; i<_param->_nb_front_end; i++)
143      for (uint32_t j=0; j<_param->_nb_context [i]; j++)
144        {
145          PORT_WRITE(out_NB_INST_COMMIT_ALL [i][j], reg_NB_INST_COMMIT_ALL [i][j]);
146          PORT_WRITE(out_NB_INST_COMMIT_MEM [i][j], reg_NB_INST_COMMIT_MEM [i][j]);
147        }
148
149
150    log_end(Commit_unit,FUNCTION);
151  };
152
153}; // end namespace commit_unit
154}; // end namespace ooo_engine
155}; // end namespace multi_ooo_engine
156}; // end namespace core
157}; // end namespace behavioural
158}; // end namespace morpheo             
159#endif
Note: See TracBrowser for help on using the repository browser.