source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Read_unit/Read_unit/Read_queue/src/Read_queue_genMealy_read_queue_out_gpr.cpp

Last change on this file 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.1 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Read_queue_genMealy_read_queue_out_gpr.cpp 136 2009-10-20 18:52:15Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Read_unit/Read_unit/Read_queue/include/Read_queue.h"
10
11namespace morpheo {
12namespace behavioural {
13namespace core {
14namespace multi_execute_loop {
15namespace execute_loop {
16namespace multi_read_unit {
17namespace read_unit {
18namespace read_queue {
19
20#undef  FUNCTION
21#define FUNCTION "Read_queue::genMealy_read_queue_out_gpr"
22  void Read_queue::genMealy_read_queue_out_gpr (void)
23  {
24    log_begin(Read_queue,FUNCTION);
25    log_function(Read_queue,FUNCTION,_name.c_str());
26
27    if (PORT_READ(in_NRESET))
28      {
29
30    // Tcontrol_t cancel = _queue_head->_cancel;
31
32    internal_READ_QUEUE_OUT_DATA_RA_VAL = (// Previous value
33                                           _queue_head->_data_ra_val or
34                                           // Test if have already access at the registerfile
35                                           (_queue_head->_read_ra_val           and
36                                            PORT_READ(in_GPR_READ_ACK      [0]) and
37                                            PORT_READ(in_GPR_READ_DATA_VAL [0]))
38                                           );
39
40    log_printf(TRACE,Read_queue,FUNCTION,"  * internal_READ_QUEUE_OUT_DATA_RA_VAL   : %d",internal_READ_QUEUE_OUT_DATA_RA_VAL);
41    log_printf(TRACE,Read_queue,FUNCTION,"    * _queue_head->_cancel                : %d",_queue_head->_cancel     );
42    log_printf(TRACE,Read_queue,FUNCTION,"    * _queue_head->_data_ra_val           : %d",_queue_head->_data_ra_val);
43    log_printf(TRACE,Read_queue,FUNCTION,"    * _queue_head->_read_ra_val           : %d",_queue_head->_read_ra_val);
44    log_printf(TRACE,Read_queue,FUNCTION,"    * in_GPR_READ_ACK      [0]            : %d",PORT_READ(in_GPR_READ_ACK      [0]));
45    log_printf(TRACE,Read_queue,FUNCTION,"    * in_GPR_READ_DATA_VAL [0]            : %d",PORT_READ(in_GPR_READ_DATA_VAL [0]));
46
47    internal_READ_QUEUE_OUT_DATA_RB_VAL = (_queue_head->_data_rb_val or
48                                           (_queue_head->_read_rb_val           and
49                                            PORT_READ(in_GPR_READ_ACK      [1]) and
50                                            PORT_READ(in_GPR_READ_DATA_VAL [1]))
51                                           );
52
53    log_printf(TRACE,Read_queue,FUNCTION,"  * internal_READ_QUEUE_OUT_DATA_RB_VAL   : %d",internal_READ_QUEUE_OUT_DATA_RB_VAL);
54    log_printf(TRACE,Read_queue,FUNCTION,"    * _queue_head->_data_rb_val           : %d",_queue_head->_data_rb_val);
55    log_printf(TRACE,Read_queue,FUNCTION,"    * _queue_head->_read_rb_val           : %d",_queue_head->_read_rb_val);
56    log_printf(TRACE,Read_queue,FUNCTION,"    * in_GPR_READ_ACK      [1]            : %d",PORT_READ(in_GPR_READ_ACK      [1]));
57    log_printf(TRACE,Read_queue,FUNCTION,"    * in_GPR_READ_DATA_VAL [1]            : %d",PORT_READ(in_GPR_READ_DATA_VAL [1]));
58               
59   
60    internal_READ_QUEUE_OUT_DATA_RA     = (// Test if have an previous access
61                                           (_queue_head->_data_ra_val)?
62                                           // if precious access, take previous data
63                                           _queue_head->_data_ra:
64                                           // else, take the read_data (don't test the validity of data)
65                                           PORT_READ(in_GPR_READ_DATA [0]));
66   
67    internal_READ_QUEUE_OUT_DATA_RB     = ((_queue_head->_data_rb_val)?
68                                           _queue_head->_data_rb:
69                                           PORT_READ(in_GPR_READ_DATA [1]));
70   
71    // Test all bypass
72    for (uint32_t i=0; i<_param->_nb_gpr_write ; i++)
73      {
74        bool cmp;
75
76        if (_param->_have_port_ooo_engine_id)
77          cmp = (PORT_READ (in_GPR_WRITE_OOO_ENGINE_ID [i]) == _queue_head->_ooo_engine_id);
78        else
79          cmp = true;
80
81        // Test if this bypass is valid
82        if ( (PORT_READ (in_GPR_WRITE_VAL [i]) == 1) and cmp)
83          {
84            Tgeneral_address_t gpr_write_num_reg = PORT_READ(in_GPR_WRITE_NUM_REG [i]);
85            Tgeneral_data_t    gpr_write_data    = PORT_READ(in_GPR_WRITE_DATA    [i]);
86           
87            if (_queue_head->_num_reg_ra == gpr_write_num_reg)
88              {
89                log_printf(TRACE,Read_queue,FUNCTION,"  * internal_READ_QUEUE_OUT_DATA_RA_VAL   - bypass hit (%d)",i);
90
91                internal_READ_QUEUE_OUT_DATA_RA_VAL = 1;
92#ifdef SYSTEMC_VHDL_COMPATIBILITY
93                if (_queue_head->_read_ra == 1)
94#endif
95                internal_READ_QUEUE_OUT_DATA_RA     = gpr_write_data;
96              }
97            if (_queue_head->_num_reg_rb == gpr_write_num_reg)
98              {
99                log_printf(TRACE,Read_queue,FUNCTION,"  * internal_READ_QUEUE_OUT_DATA_RB_VAL   - bypass hit (%d)",i);
100                internal_READ_QUEUE_OUT_DATA_RB_VAL = 1;
101#ifdef SYSTEMC_VHDL_COMPATIBILITY
102                if (_queue_head->_read_rb == 1)
103#endif
104                internal_READ_QUEUE_OUT_DATA_RB     = gpr_write_data;
105              }
106          }
107      }
108
109    // Affectation out port
110    PORT_WRITE(out_READ_QUEUE_OUT_DATA_RA    ,internal_READ_QUEUE_OUT_DATA_RA    );
111    PORT_WRITE(out_READ_QUEUE_OUT_DATA_RB    ,internal_READ_QUEUE_OUT_DATA_RB    );
112      }
113    else
114      {
115        internal_READ_QUEUE_OUT_DATA_RA_VAL = 0;
116        internal_READ_QUEUE_OUT_DATA_RB_VAL = 0;
117//         internal_READ_QUEUE_OUT_DATA_RA = 0;
118//         internal_READ_QUEUE_OUT_DATA_RB = 0;
119      }
120
121    PORT_WRITE(out_READ_QUEUE_OUT_DATA_RA_VAL,internal_READ_QUEUE_OUT_DATA_RA_VAL);
122    PORT_WRITE(out_READ_QUEUE_OUT_DATA_RB_VAL,internal_READ_QUEUE_OUT_DATA_RB_VAL);
123
124    log_end(Read_queue,FUNCTION);
125  };
126
127}; // end namespace read_queue
128}; // end namespace read_unit
129}; // end namespace multi_read_unit
130}; // end namespace execute_loop
131}; // end namespace multi_execute_loop
132}; // end namespace core
133}; // end namespace behavioural
134}; // end namespace morpheo             
135#endif
Note: See TracBrowser for help on using the repository browser.