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

Last change on this file since 54 was 54, checked in by rosiere, 17 years ago

Ajout de Read_queue

  • seulement en systemC
  • validé
File size: 4.5 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id$
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_printf(FUNC,Read_queue,FUNCTION,"Begin");
25
26    internal_READ_QUEUE_OUT_DATA_RA_VAL = (// Previous value
27                                           _queue_head->_data_ra_val or
28                                           // Test if have already access at the registerfile
29                                           (_queue_head->_read_ra_val           and
30                                            PORT_READ(in_GPR_READ_ACK      [0]) and
31                                            PORT_READ(in_GPR_READ_DATA_VAL [0]))
32                                           );
33
34    log_printf(TRACE,Read_queue,FUNCTION," * internal_READ_QUEUE_OUT_DATA_RA_VAL   : %d",internal_READ_QUEUE_OUT_DATA_RA_VAL);
35    log_printf(TRACE,Read_queue,FUNCTION,"   * _queue_head->_data_ra_val           : %d",_queue_head->_data_ra_val);
36    log_printf(TRACE,Read_queue,FUNCTION,"   * _queue_head->_read_ra_val           : %d",_queue_head->_read_ra_val);
37    log_printf(TRACE,Read_queue,FUNCTION,"   * in_GPR_READ_ACK      [0]            : %d",PORT_READ(in_GPR_READ_ACK      [0]));
38    log_printf(TRACE,Read_queue,FUNCTION,"   * in_GPR_READ_DATA_VAL [0]            : %d",PORT_READ(in_GPR_READ_DATA_VAL [0]));
39
40    internal_READ_QUEUE_OUT_DATA_RB_VAL = (_queue_head->_data_rb_val or
41                                           (_queue_head->_read_rb_val           and
42                                            PORT_READ(in_GPR_READ_ACK      [1]) and
43                                            PORT_READ(in_GPR_READ_DATA_VAL [1]))
44                                           );
45
46    log_printf(TRACE,Read_queue,FUNCTION," * internal_READ_QUEUE_OUT_DATA_RB_VAL   : %d",internal_READ_QUEUE_OUT_DATA_RB_VAL);
47    log_printf(TRACE,Read_queue,FUNCTION,"   * _queue_head->_data_rb_val           : %d",_queue_head->_data_rb_val);
48    log_printf(TRACE,Read_queue,FUNCTION,"   * _queue_head->_read_rb_val           : %d",_queue_head->_read_rb_val);
49    log_printf(TRACE,Read_queue,FUNCTION,"   * in_GPR_READ_ACK      [1]            : %d",PORT_READ(in_GPR_READ_ACK      [1]));
50    log_printf(TRACE,Read_queue,FUNCTION,"   * in_GPR_READ_DATA_VAL [1]            : %d",PORT_READ(in_GPR_READ_DATA_VAL [1]));
51               
52   
53    internal_READ_QUEUE_OUT_DATA_RA     = (// Test if have an previous access
54                                           (_queue_head->_data_ra_val)?
55                                           // if precious access, take previous data
56                                           _queue_head->_data_ra:
57                                           // else, take the read_data (don't test the validity of data)
58                                           PORT_READ(in_GPR_READ_DATA [0]));
59   
60    internal_READ_QUEUE_OUT_DATA_RB     = ((_queue_head->_data_rb_val)?
61                                           _queue_head->_data_rb:
62                                           PORT_READ(in_GPR_READ_DATA [1]));
63   
64    // Test all bypass
65    for (uint32_t i=0; i<_param->_nb_gpr_write ; i++)
66      {
67        // Test if this bypass is valid
68        if ( (PORT_READ (in_BYPASS_GPR_WRITE_VAL        [i]) == 1) and
69             (PORT_READ (in_BYPASS_GPR_WRITE_CONTEXT_ID [i]) == _queue_head->_context_id)
70             )
71          {
72            Tgeneral_address_t bypass_gpr_write_num_reg = PORT_READ(in_BYPASS_GPR_WRITE_NUM_REG [i]);
73            Tgeneral_data_t    bypass_gpr_write_data    = PORT_READ(in_BYPASS_GPR_WRITE_DATA    [i]);
74           
75            if (_queue_head->_num_reg_ra == bypass_gpr_write_num_reg)
76              {
77                log_printf(TRACE,Read_queue,FUNCTION," * internal_READ_QUEUE_OUT_DATA_RA_VAL   - bypass hit (%d)",i);
78
79                internal_READ_QUEUE_OUT_DATA_RA_VAL = 1;
80                internal_READ_QUEUE_OUT_DATA_RA     = bypass_gpr_write_data;
81              }
82            if (_queue_head->_num_reg_rb == bypass_gpr_write_num_reg)
83              {
84                log_printf(TRACE,Read_queue,FUNCTION," * internal_READ_QUEUE_OUT_DATA_RB_VAL   - bypass hit (%d)",i);
85                internal_READ_QUEUE_OUT_DATA_RB_VAL = 1;
86                internal_READ_QUEUE_OUT_DATA_RB     = bypass_gpr_write_data;
87              }
88          }
89      }
90
91    // Affectation out port
92    PORT_WRITE(out_READ_QUEUE_OUT_DATA_RA_VAL,internal_READ_QUEUE_OUT_DATA_RA_VAL);
93    PORT_WRITE(out_READ_QUEUE_OUT_DATA_RB_VAL,internal_READ_QUEUE_OUT_DATA_RB_VAL);
94    PORT_WRITE(out_READ_QUEUE_OUT_DATA_RA    ,internal_READ_QUEUE_OUT_DATA_RA    );
95    PORT_WRITE(out_READ_QUEUE_OUT_DATA_RB    ,internal_READ_QUEUE_OUT_DATA_RB    );
96
97    log_printf(FUNC,Read_queue,FUNCTION,"End");
98  };
99
100}; // end namespace read_queue
101}; // end namespace read_unit
102}; // end namespace multi_read_unit
103}; // end namespace execute_loop
104}; // end namespace multi_execute_loop
105}; // end namespace core
106}; // end namespace behavioural
107}; // end namespace morpheo             
108#endif
Note: See TracBrowser for help on using the repository browser.