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

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

1) Correct bug in link two signal
2) Fix error detected with valgrind
3) modif distexe script

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