source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Read_unit/Read_unit/Reservation_station/src/Reservation_station_genMoore.cpp @ 145

Last change on this file since 145 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: 5.5 KB
Line 
1#ifdef SYSTEMC
2//#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
3/*
4 * $Id: Reservation_station_genMoore.cpp 136 2009-10-20 18:52:15Z rosiere $
5 *
6 * [ Description ]
7 *
8 */
9
10#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Read_unit/Read_unit/Reservation_station/include/Reservation_station.h"
11
12namespace morpheo                    {
13namespace behavioural {
14namespace core {
15namespace multi_execute_loop {
16namespace execute_loop {
17namespace multi_read_unit {
18namespace read_unit {
19namespace reservation_station {
20
21
22#undef  FUNCTION
23#define FUNCTION "Reservation_station::genMoore"
24  void Reservation_station::genMoore (void)
25  {
26    log_begin(Reservation_station,FUNCTION);
27    log_function(Reservation_station,FUNCTION,_name.c_str());
28
29    if (PORT_READ(in_NRESET))
30      {
31    // ~~~~~[ Interface "insert" ]~~~~~~~~~~~~~~~~~~~~~~~~
32   
33    // accept a new instructions when reservation_station is not full
34#ifdef  SYSTEMC_VHDL_COMPATIBILITY
35    for (internal_INSERT_SLOT=0; (internal_INSERT_SLOT<_param->_size_queue) and (_queue_valid[internal_INSERT_SLOT]==true); internal_INSERT_SLOT++);
36    internal_INSERT_ACK = (internal_INSERT_SLOT<_param->_size_queue);
37#else
38    internal_INSERT_ACK = not _queue_control->full();
39#endif   
40
41    // ~~~~~[ Interface "retire" ]~~~~~~~~~~~~~~~~~~~~~~~
42
43    uint32_t index_queue=0;
44    const uint32_t nb_slot_scan = _param->_size_queue-_param->_nb_inst_retire+1;
45
46    for (uint32_t i=0; i<_param->_nb_inst_retire; i++)
47      {
48        bool     val        = false;
49        uint32_t index_find = 0;
50
51        log_printf(TRACE,Reservation_station,FUNCTION,"  * RETIRE [%d]",i);
52
53        for (; (
54#ifndef  SYSTEMC_VHDL_COMPATIBILITY
55                (index_queue<_queue_control->nb_elt()) and
56#endif
57                (index_queue>=i) and
58                (index_queue<nb_slot_scan+i) and
59                (val==false));
60             index_queue++)
61          {
62#ifdef  SYSTEMC_VHDL_COMPATIBILITY
63            index_find = index_queue;
64#else
65            index_find = (*_queue_control)[index_queue];
66#endif
67            internal_RETIRE_SLOT [i] = index_queue;
68
69            val   = 
70              (
71#ifdef  SYSTEMC_VHDL_COMPATIBILITY
72               _queue_valid [index_queue] and
73#endif
74               _queue[index_find]._data_ra_val and
75               _queue[index_find]._data_rb_val and
76               _queue[index_find]._data_rc_val
77               );
78
79            log_printf(
80#ifdef  SYSTEMC_VHDL_COMPATIBILITY
81                       TRACE,Reservation_station,FUNCTION,"    [%d] valid : %d, data ra %d, rb %d, rc %d - %d",
82                       index_find,
83                       _queue_valid [index_queue],
84#else
85                       TRACE,Reservation_station,FUNCTION,"    [%d] data ra %d, rb %d, rc %d - %d",
86                       index_find,
87#endif
88                       _queue[index_find]._data_ra_val,
89                       _queue[index_find]._data_rb_val,
90                       _queue[index_find]._data_rc_val,
91                       val);
92          }
93
94        internal_RETIRE_VAL [i] = val;
95
96        if (val)
97          {
98
99// #ifdef  SYSTEMC_VHDL_COMPATIBILITY
100//          index_find = internal_RETIRE_SLOT [i];
101// #else
102//          index_find = (*_queue_control)[internal_RETIRE_SLOT [i]];
103// #endif
104            if (_param->_have_port_context_id)
105            PORT_WRITE(out_RETIRE_CONTEXT_ID    [i],_queue[index_find]._context_id);
106            if (_param->_have_port_front_end_id)
107            PORT_WRITE(out_RETIRE_FRONT_END_ID  [i],_queue[index_find]._front_end_id);
108            if (_param->_have_port_ooo_engine_id)
109            PORT_WRITE(out_RETIRE_OOO_ENGINE_ID [i],_queue[index_find]._ooo_engine_id);
110            if (_param->_have_port_rob_ptr)
111            PORT_WRITE(out_RETIRE_ROB_ID        [i],_queue[index_find]._rob_id);
112            PORT_WRITE(out_RETIRE_OPERATION     [i],_queue[index_find]._operation);
113            PORT_WRITE(out_RETIRE_TYPE          [i],_queue[index_find]._type);
114            PORT_WRITE(out_RETIRE_CANCEL        [i],_queue[index_find]._cancel);
115            PORT_WRITE(out_RETIRE_STORE_QUEUE_PTR_WRITE [i],_queue[index_find]._store_queue_ptr_write);
116            PORT_WRITE(out_RETIRE_STORE_QUEUE_PTR_READ  [i],_queue[index_find]._store_queue_ptr_read );
117            PORT_WRITE(out_RETIRE_STORE_QUEUE_EMPTY     [i],_queue[index_find]._store_queue_empty    );
118            if (_param->_have_port_load_queue_ptr)
119            PORT_WRITE(out_RETIRE_LOAD_QUEUE_PTR_WRITE  [i],_queue[index_find]._load_queue_ptr_write );
120            PORT_WRITE(out_RETIRE_HAS_IMMEDIAT  [i],_queue[index_find]._has_immediat);
121            PORT_WRITE(out_RETIRE_IMMEDIAT      [i],_queue[index_find]._immediat);
122            PORT_WRITE(out_RETIRE_DATA_RA       [i],_queue[index_find]._data_ra);
123            PORT_WRITE(out_RETIRE_DATA_RB       [i],_queue[index_find]._data_rb);
124            PORT_WRITE(out_RETIRE_DATA_RC       [i],_queue[index_find]._data_rc);
125            PORT_WRITE(out_RETIRE_WRITE_RD      [i],_queue[index_find]._write_rd);
126            PORT_WRITE(out_RETIRE_NUM_REG_RD    [i],_queue[index_find]._num_reg_rd);
127            PORT_WRITE(out_RETIRE_WRITE_RE      [i],_queue[index_find]._write_re);
128            PORT_WRITE(out_RETIRE_NUM_REG_RE    [i],_queue[index_find]._num_reg_re);
129          }
130      }
131      }
132    else
133      {
134        // Reset
135        internal_INSERT_ACK = 0;
136        // internal_INSERT_SLOT
137       
138        for (uint32_t i=0; i<_param->_nb_inst_retire; i++)
139          {
140            internal_RETIRE_VAL [i] = 0;
141            // internal_RETIRE_SLOT [i];
142          }
143      }
144
145    // Write Output
146    PORT_WRITE(out_INSERT_ACK    , internal_INSERT_ACK);
147    for (uint32_t i=0; i<_param->_nb_inst_retire; i++)
148    PORT_WRITE(out_RETIRE_VAL [i], internal_RETIRE_VAL [i]);
149
150    log_end(Reservation_station,FUNCTION);
151  };
152
153}; // end namespace reservation_station
154}; // end namespace read_unit
155}; // end namespace multi_read_unit
156}; // end namespace execute_loop
157}; // end namespace multi_execute_loop
158}; // end namespace core
159
160}; // end namespace behavioural
161}; // end namespace morpheo             
162#endif
163//#endif
Note: See TracBrowser for help on using the repository browser.