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

Last change on this file since 123 was 123, checked in by rosiere, 15 years ago

1) Fix performance
2) add auto generation to SPECINT2000
3) add reset in genMoore and genMealy

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