source: trunk/IPs/systemC/Environment/src/Environment_genMoore.cpp @ 127

Last change on this file since 127 was 127, checked in by rosiere, 15 years ago
  • Property svn:keywords set to Id
File size: 5.1 KB
Line 
1#include "../include/Environment.h"
2
3using namespace morpheo;
4
5namespace environment {
6
7  void Environment::genMoore (void)
8  {
9    //Scan all entity and for each entity scan all port
10    for (uint32_t i = 0; i < param->nb_entity; i++)
11      {
12        //=============================================================================
13        //===== [ ICACHE ]=============================================================
14        //=============================================================================
15       
16        //-----------------------------------------------------------------------------
17        //----- [ Request ]------------------------------------------------------------
18        //-----------------------------------------------------------------------------
19        {
20          uint32_t nb_slot_free = component_buffer_irsp [i]->nb_slot_free ();
21          for (uint32_t j=0; j<param->icache_dedicated_nb_port [i]; j ++)
22            {
23              icache_req_ack [i][j] = (j < nb_slot_free);
24              ICACHE_REQ_ACK [i][j]->write (icache_req_ack [i][j]);
25            }
26        }
27
28        //-----------------------------------------------------------------------------
29        //----- [ Respons ]------------------------------------------------------------
30        //-----------------------------------------------------------------------------
31        {
32          // init
33          for (uint32_t j = 0; j < param->icache_dedicated_nb_port [i]; j ++)
34            icache_rsp_val [i][j] = 0;
35
36          _cout(ENVIRONMENT, "buffer_irsp [%d] : nb_slot_use %d\n",i,component_buffer_irsp [i]->nb_slot_use());
37          for (uint32_t j = 0; j+1 <= component_buffer_irsp [i]->nb_slot_use(); j ++)
38            {
39              // Test the number of element in the respons's buffer
40             
41              queue::slot_t<irsp_t*> slot = component_buffer_irsp [i]->read(j);
42             
43              uint32_t port = slot._data->port;
44             
45              bool val = ((slot._delay == 0) and (icache_rsp_val [i][port] == 0));
46
47              _cout(ENVIRONMENT, "buffer_irsp [%d][%d] - delay %d - port %d\n",i,j,slot._delay,port);
48
49             
50              if (val)
51                {
52                  _cout(ENVIRONMENT, "ICACHE_RSP [%d][%d] - respons valid\n",i,port);
53                 
54                  icache_rsp_val        [i][port] = 1;
55                               
56                  ICACHE_RSP_CONTEXT_ID [i][port]->write(slot._data->trdid); // TODO : test if exist
57                  ICACHE_RSP_PACKET_ID  [i][port]->write(slot._data->pktid); // TODO : test if exist
58                  ICACHE_RSP_ERROR      [i][port]->write(slot._data->error);
59                 
60                  for (uint32_t k = 0; k < param->iaccess_nb_instruction[i]; k ++)
61                    {
62                      Ticache_instruction_t data = 0;
63                     
64                      atoi (slot._data->data[k], data, param->iaccess_size_instruction[i]/8);
65                     
66                      ICACHE_RSP_INSTRUCTION [i][port][k]->write(data);
67                    }
68                }
69            }
70         
71          for (uint32_t j = 0; j < param->icache_dedicated_nb_port [i]; j ++)
72            ICACHE_RSP_VAL [i][j]->write (icache_rsp_val [i][j]);
73        }
74       
75        //=============================================================================
76        //===== [ DCACHE ]=============================================================
77        //=============================================================================
78       
79        //-----------------------------------------------------------------------------
80        //----- [ Request ]------------------------------------------------------------
81        //-----------------------------------------------------------------------------
82        {
83          uint32_t nb_slot_free = component_buffer_drsp [i]->nb_slot_free ();
84          for (uint32_t j = 0; j < param->dcache_dedicated_nb_port [i]; j ++)
85            {
86              dcache_req_ack [i][j] = (j < nb_slot_free);
87              DCACHE_REQ_ACK [i][j]->write (dcache_req_ack [i][j]);
88            }
89        }
90       
91        //-----------------------------------------------------------------------------
92        //----- [ Respons ]------------------------------------------------------------
93        //-----------------------------------------------------------------------------
94        {
95          for (uint32_t j = 0; j < param->dcache_dedicated_nb_port [i]; j ++)
96            {
97              // Test the number of element in the respons's buffer
98              if (j >= component_buffer_drsp [i]->nb_slot_use())
99                {
100                  dcache_rsp_val [i][j] = 0; // No respons
101                }
102              else
103                {
104                  queue::slot_t<drsp_t*> slot = component_buffer_drsp [i]->read(j);
105
106                  bool val = (slot._delay == 0); // respons if have a result
107                 
108                  dcache_rsp_val [i][j] = (val); // respons if have a result
109
110                  if (val)
111                    {
112                      _cout(ENVIRONMENT, "DCACHE_RSP [%d][%d] - respons valid\n",i,j);
113
114                      DCACHE_RSP_CONTEXT_ID [i][j]->write(slot._data->trdid); // TODO : test if exist
115                      DCACHE_RSP_PACKET_ID  [i][j]->write(slot._data->pktid); // TODO : test if exist
116                      DCACHE_RSP_ERROR      [i][j]->write(slot._data->error);
117                     
118                      Tdcache_data_t data = 0;
119                      atoi (slot._data->data[0], data, param->daccess_size_data[i]/8);
120                     
121                      DCACHE_RSP_RDATA       [i][j]->write(data);
122                    }
123                }
124              DCACHE_RSP_VAL [i][j]->write (dcache_rsp_val [i][j]);
125            }
126        }
127      }
128  }
129
130};
Note: See TracBrowser for help on using the repository browser.