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 @ 136

Last change on this file since 136 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.