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

Last change on this file since 88 was 88, checked in by rosiere, 16 years ago

Almost complete design
with Test and test platform

  • Property svn:keywords set to Id
File size: 4.6 KB
RevLine 
[54]1#ifdef SYSTEMC
2/*
3 * $Id: Read_queue_genMealy_read_queue_out_gpr.cpp 88 2008-12-10 18:31:39Z 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  {
[88]24    log_begin(Read_queue,FUNCTION);
25    log_function(Read_queue,FUNCTION,_name.c_str());
[54]26
27    internal_READ_QUEUE_OUT_DATA_RA_VAL = (// Previous value
28                                           _queue_head->_data_ra_val or
29                                           // Test if have already access at the registerfile
30                                           (_queue_head->_read_ra_val           and
31                                            PORT_READ(in_GPR_READ_ACK      [0]) and
32                                            PORT_READ(in_GPR_READ_DATA_VAL [0]))
33                                           );
34
[88]35    log_printf(TRACE,Read_queue,FUNCTION,"  * internal_READ_QUEUE_OUT_DATA_RA_VAL   : %d",internal_READ_QUEUE_OUT_DATA_RA_VAL);
36    log_printf(TRACE,Read_queue,FUNCTION,"    * _queue_head->_data_ra_val           : %d",_queue_head->_data_ra_val);
37    log_printf(TRACE,Read_queue,FUNCTION,"    * _queue_head->_read_ra_val           : %d",_queue_head->_read_ra_val);
38    log_printf(TRACE,Read_queue,FUNCTION,"    * in_GPR_READ_ACK      [0]            : %d",PORT_READ(in_GPR_READ_ACK      [0]));
39    log_printf(TRACE,Read_queue,FUNCTION,"    * in_GPR_READ_DATA_VAL [0]            : %d",PORT_READ(in_GPR_READ_DATA_VAL [0]));
[54]40
41    internal_READ_QUEUE_OUT_DATA_RB_VAL = (_queue_head->_data_rb_val or
42                                           (_queue_head->_read_rb_val           and
43                                            PORT_READ(in_GPR_READ_ACK      [1]) and
44                                            PORT_READ(in_GPR_READ_DATA_VAL [1]))
45                                           );
46
[88]47    log_printf(TRACE,Read_queue,FUNCTION,"  * internal_READ_QUEUE_OUT_DATA_RB_VAL   : %d",internal_READ_QUEUE_OUT_DATA_RB_VAL);
48    log_printf(TRACE,Read_queue,FUNCTION,"    * _queue_head->_data_rb_val           : %d",_queue_head->_data_rb_val);
49    log_printf(TRACE,Read_queue,FUNCTION,"    * _queue_head->_read_rb_val           : %d",_queue_head->_read_rb_val);
50    log_printf(TRACE,Read_queue,FUNCTION,"    * in_GPR_READ_ACK      [1]            : %d",PORT_READ(in_GPR_READ_ACK      [1]));
51    log_printf(TRACE,Read_queue,FUNCTION,"    * in_GPR_READ_DATA_VAL [1]            : %d",PORT_READ(in_GPR_READ_DATA_VAL [1]));
[54]52               
53   
54    internal_READ_QUEUE_OUT_DATA_RA     = (// Test if have an previous access
55                                           (_queue_head->_data_ra_val)?
56                                           // if precious access, take previous data
57                                           _queue_head->_data_ra:
58                                           // else, take the read_data (don't test the validity of data)
59                                           PORT_READ(in_GPR_READ_DATA [0]));
60   
61    internal_READ_QUEUE_OUT_DATA_RB     = ((_queue_head->_data_rb_val)?
62                                           _queue_head->_data_rb:
63                                           PORT_READ(in_GPR_READ_DATA [1]));
64   
65    // Test all bypass
66    for (uint32_t i=0; i<_param->_nb_gpr_write ; i++)
67      {
[68]68        bool cmp;
69
70        if (_param->_have_port_ooo_engine_id)
71          cmp = (PORT_READ (in_GPR_WRITE_OOO_ENGINE_ID [i]) == _queue_head->_ooo_engine_id);
72        else
73          cmp = true;
74
[54]75        // Test if this bypass is valid
[68]76        if ( (PORT_READ (in_GPR_WRITE_VAL [i]) == 1) and cmp)
[54]77          {
[55]78            Tgeneral_address_t gpr_write_num_reg = PORT_READ(in_GPR_WRITE_NUM_REG [i]);
79            Tgeneral_data_t    gpr_write_data    = PORT_READ(in_GPR_WRITE_DATA    [i]);
[54]80           
[55]81            if (_queue_head->_num_reg_ra == gpr_write_num_reg)
[54]82              {
[88]83                log_printf(TRACE,Read_queue,FUNCTION,"  * internal_READ_QUEUE_OUT_DATA_RA_VAL   - bypass hit (%d)",i);
[54]84
85                internal_READ_QUEUE_OUT_DATA_RA_VAL = 1;
[68]86#ifdef SYSTEMC_VHDL_COMPATIBILITY
87                if (_queue_head->_read_ra == 1)
88#endif
[55]89                internal_READ_QUEUE_OUT_DATA_RA     = gpr_write_data;
[54]90              }
[55]91            if (_queue_head->_num_reg_rb == gpr_write_num_reg)
[54]92              {
[88]93                log_printf(TRACE,Read_queue,FUNCTION,"  * internal_READ_QUEUE_OUT_DATA_RB_VAL   - bypass hit (%d)",i);
[54]94                internal_READ_QUEUE_OUT_DATA_RB_VAL = 1;
[68]95#ifdef SYSTEMC_VHDL_COMPATIBILITY
96                if (_queue_head->_read_rb == 1)
97#endif
[55]98                internal_READ_QUEUE_OUT_DATA_RB     = gpr_write_data;
[54]99              }
100          }
101      }
102
103    // Affectation out port
104    PORT_WRITE(out_READ_QUEUE_OUT_DATA_RA_VAL,internal_READ_QUEUE_OUT_DATA_RA_VAL);
105    PORT_WRITE(out_READ_QUEUE_OUT_DATA_RB_VAL,internal_READ_QUEUE_OUT_DATA_RB_VAL);
106    PORT_WRITE(out_READ_QUEUE_OUT_DATA_RA    ,internal_READ_QUEUE_OUT_DATA_RA    );
107    PORT_WRITE(out_READ_QUEUE_OUT_DATA_RB    ,internal_READ_QUEUE_OUT_DATA_RB    );
108
[88]109    log_end(Read_queue,FUNCTION);
[54]110  };
111
112}; // end namespace read_queue
113}; // end namespace read_unit
114}; // end namespace multi_read_unit
115}; // end namespace execute_loop
116}; // end namespace multi_execute_loop
117}; // end namespace core
118}; // end namespace behavioural
119}; // end namespace morpheo             
120#endif
Note: See TracBrowser for help on using the repository browser.