source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Issue_queue/src/Issue_queue_genMealy.cpp @ 88

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

Almost complete design
with Test and test platform

  • Property svn:keywords set to Id
File size: 4.3 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Issue_queue_genMealy.cpp 88 2008-12-10 18:31:39Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Issue_queue/include/Issue_queue.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_ooo_engine {
15namespace ooo_engine {
16namespace issue_queue {
17
18
19#undef  FUNCTION
20#define FUNCTION "Issue_queue::genMealy"
21  void Issue_queue::genMealy (void)
22  {
23    log_begin(Issue_queue,FUNCTION);
24    log_function(Issue_queue,FUNCTION,_name.c_str());
25
26    Tcontrol_t bank_full         [_param->_nb_bank];
27    Tcontrol_t issue_ack         [_param->_nb_rename_unit][_param->_max_nb_inst_rename];
28    Tcontrol_t reexecute_ack     [_param->_nb_inst_reexecute];
29    bool       can_rename_select [_param->_nb_rename_unit];
30   
31    // Initialisation
32    for (uint32_t i=0; i<_param->_nb_bank; i++)
33      {
34        internal_BANK_IN_ACK  [i] = false;
35        bank_full [i] = not (_issue_queue[i].size() < _param->_size_bank); 
36      }
37    for (uint32_t i=0; i<_param->_nb_rename_unit; i++)
38      {
39        can_rename_select [i] = true;
40        for (uint32_t j=0; j<_param->_nb_inst_rename[i]; j++)
41          issue_ack [i][j] = false;
42      }
43    for (uint32_t i=0; i<_param->_nb_inst_reexecute; i++)
44      reexecute_ack [i] = false;
45   
46    std::list<generic::priority::select_t> * select_reg = _priority_reg->select(); // same select for all issue
47
48    // Priority at the Reexecute instruction !
49    for (uint32_t i=0; i<_param->_nb_inst_reexecute; i++)
50      // Test if have instruction
51      if (PORT_READ(in_REEXECUTE_VAL [i]))
52        {
53          Ttype_t type = PORT_READ(in_REEXECUTE_TYPE [i]);
54         
55          // scan all bank
56          for (std::list<generic::priority::select_t>::iterator it=select_reg->begin();
57               it!=select_reg->end();
58               it++)
59            {
60              uint32_t num_bank  = it->grp;
61              uint32_t num_issue = num_bank/_param->_nb_bank_select_out;
62              // test if bank is not busy (full or previous access) and if type match
63              if (not internal_BANK_IN_ACK [num_bank] and not bank_full [num_bank] and _param->_table_issue_type[num_issue][type])
64                {
65                  // find
66                  reexecute_ack [i] = true;
67                  internal_BANK_IN_ACK          [num_bank] = true;
68                  internal_BANK_IN_IS_REEXECUTE [num_bank] = 1;
69                  internal_BANK_IN_NUM_INST     [num_bank] = i;
70                  break;
71                }
72            }
73        }
74   
75    // issue_in interface
76    std::list<generic::priority::select_t> * select_in = _priority_in ->select(); // same select for all issue
77    for (std::list<generic::priority::select_t>::iterator it=select_in ->begin();
78         it!=select_in ->end();
79         it++)
80      {
81        uint32_t num_rename_unit = it->grp;
82        uint32_t num_inst_rename = it->elt;
83
84        // Test if have instruction
85        if (can_rename_select [num_rename_unit]//  and
86//          PORT_READ(in_ISSUE_IN_VAL [num_rename_unit][num_inst_rename])
87            )
88          {
89            Ttype_t type = PORT_READ(in_ISSUE_IN_TYPE [num_rename_unit][num_inst_rename]);
90         
91            // scan all bank
92            for (std::list<generic::priority::select_t>::iterator it=select_reg->begin();
93                 it!=select_reg->end();
94                 it++)
95              {
96                uint32_t num_bank  = it->grp;
97                uint32_t num_issue = num_bank/_param->_nb_bank_select_out;
98                // test if bank is not busy (full or previous access) and if type match
99                if (not internal_BANK_IN_ACK [num_bank] and not bank_full [num_bank] and _param->_table_issue_type[num_issue][type])
100                  {
101                    // find
102                    issue_ack [num_rename_unit][num_inst_rename] = true;
103                    internal_BANK_IN_ACK             [num_bank] = true;
104                    internal_BANK_IN_IS_REEXECUTE    [num_bank] = 0;
105                    internal_BANK_IN_NUM_RENAME_UNIT [num_bank] = num_rename_unit;
106                    internal_BANK_IN_NUM_INST        [num_bank] = num_inst_rename;
107                    break;
108                  }
109              }
110
111            // is a valid instruction, but it's not send at a bank
112            //  ... invalid this rename_unit (because, rename in_order)
113            can_rename_select [num_rename_unit] |= issue_ack [num_rename_unit][num_inst_rename];
114          }
115      }
116   
117    for (uint32_t i=0; i<_param->_nb_rename_unit; i++)
118      for (uint32_t j=0; j<_param->_nb_inst_rename[i]; j++)
119        PORT_WRITE(out_ISSUE_IN_ACK [i][j],issue_ack [i][j]);
120    for (uint32_t i=0; i<_param->_nb_inst_reexecute; i++)
121      PORT_WRITE(out_REEXECUTE_ACK [i],reexecute_ack [i]);
122
123    log_end(Issue_queue,FUNCTION);
124  };
125
126}; // end namespace issue_queue
127}; // end namespace ooo_engine
128}; // end namespace multi_ooo_engine
129}; // end namespace core
130
131}; // end namespace behavioural
132}; // end namespace morpheo             
133#endif
Note: See TracBrowser for help on using the repository browser.