source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/RegisterFile/RegisterFile_Multi_Banked/src/RegisterFile_Multi_Banked_vhdl_body.cpp @ 58

Last change on this file since 58 was 58, checked in by rosiere, 17 years ago

Vhdl : RegisterFile_Multi_Banked - "full crossbar"
Correction d'un bug pour le "partial crossbar"

File size: 15.2 KB
Line 
1#ifdef VHDL
2/*
3 * $Id$
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Generic/RegisterFile/RegisterFile_Multi_Banked/include/RegisterFile_Multi_Banked.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace generic {
14namespace registerfile {
15namespace registerfile_multi_banked {
16
17
18  void RegisterFile_Multi_Banked::vhdl_body (Vhdl * & vhdl)
19  {
20    log_printf(FUNC,RegisterFile_Multi_Banked,"vhdl_body","Begin");
21
22    uint32_t read_select_limit ;
23    uint32_t read_nb_select1   ;
24    uint32_t read_nb_select2   ;
25    uint32_t write_select_limit;
26    uint32_t write_nb_select1  ;
27    uint32_t write_nb_select2  ;
28   
29    read_select_limit = _param->_nb_port_read%_param->_nb_port_read_by_bank;
30    read_nb_select2   = _param->_nb_port_read/_param->_nb_port_read_by_bank;
31    read_nb_select1   = (read_select_limit==0)?0:(read_nb_select2+1);               
32 
33    write_select_limit= _param->_nb_port_write%_param->_nb_port_write_by_bank;
34    write_nb_select2  = _param->_nb_port_write/_param->_nb_port_write_by_bank;
35    write_nb_select1  = (write_select_limit==0)?0:(write_nb_select2+1);             
36
37    vhdl->set_body("");
38    vhdl->set_body("-----------------------------------");
39    vhdl->set_body("-- Instance bank                   ");
40    vhdl->set_body("-----------------------------------");
41    vhdl->set_body("");
42
43    for (uint32_t i=0; i<_param->_nb_bank; i++)
44      {
45        vhdl->set_body(_name+"_bank_"+toString(i)+" : "+_name+"_bank");
46        vhdl->set_body("port map (");
47        vhdl->set_body("\t  in_CLOCK \t=>\tin_CLOCK ");
48        vhdl->set_body("\t, in_NRESET\t=>\tin_NRESET");
49        for (uint32_t j=0; j<_param->_nb_port_read_by_bank; j++)
50          {
51            vhdl->set_body("\t, in_READ_"+toString(j)+"_VAL     \t=>\tinternal_BANK_READ_"+toString(i)+"_"+toString(j)+"_VAL");
52            vhdl->set_body("\t,out_READ_"+toString(j)+"_ACK     \t=>\tinternal_BANK_READ_"+toString(i)+"_"+toString(j)+"_ACK");
53            vhdl->set_body("\t, in_READ_"+toString(j)+"_ADDRESS \t=>\tinternal_BANK_READ_"+toString(i)+"_"+toString(j)+"_ADDRESS");
54            vhdl->set_body("\t,out_READ_"+toString(j)+"_DATA    \t=>\tinternal_BANK_READ_"+toString(i)+"_"+toString(j)+"_DATA");
55          }
56        for (uint32_t j=0; j<_param->_nb_port_write_by_bank; j++)
57          {
58            vhdl->set_body("\t, in_WRITE_"+toString(j)+"_VAL     \t=>\tinternal_BANK_WRITE_"+toString(i)+"_"+toString(j)+"_VAL");
59            vhdl->set_body("\t,out_WRITE_"+toString(j)+"_ACK     \t=>\tinternal_BANK_WRITE_"+toString(i)+"_"+toString(j)+"_ACK");
60            vhdl->set_body("\t, in_WRITE_"+toString(j)+"_ADDRESS \t=>\tinternal_BANK_WRITE_"+toString(i)+"_"+toString(j)+"_ADDRESS");
61            vhdl->set_body("\t, in_WRITE_"+toString(j)+"_DATA    \t=>\tinternal_BANK_WRITE_"+toString(i)+"_"+toString(j)+"_DATA");
62          }
63
64        vhdl->set_body(");");
65        vhdl->set_body("");
66      }
67
68    vhdl->set_body("");
69    vhdl->set_body("-----------------------------------");
70    vhdl->set_body("-- Instance select");
71    vhdl->set_body("-- (1 select by port)");
72    vhdl->set_body("-----------------------------------");
73    vhdl->set_body("");
74    for (uint32_t i=0; i<_param->_nb_bank; i++)
75      {
76        for (uint32_t j=0; j<_param->_nb_port_read_by_bank; j++)
77          {
78            uint32_t nb_port = (_param->_crossbar == FULL_CROSSBAR)?_param->_nb_port_read:((j<read_select_limit)?read_nb_select1:read_nb_select2);
79
80            vhdl->set_body(_name+"_read_select_"+toString(i)+"_"+toString(j)+" : "+_name+"_select_"+toString(nb_port)+"_ports");
81            vhdl->set_body("port map (");
82            for (uint32_t k=0; k<nb_port; k++)
83              {
84                uint32_t num_port  = (_param->_crossbar == FULL_CROSSBAR)?k:(_param->_nb_port_read_by_bank*k+j);
85                string   separator = ((k==0)?" ":",");
86                string   index     = (_param->_crossbar == FULL_CROSSBAR)?("_"+toString(j)):"";
87
88                vhdl->set_body("\t"+separator+" in_VAL_"+toString(k)+"     \t=>\tinternal_READ_"+toString(i)+"_"+toString(num_port)+index+"_VAL");
89                vhdl->set_body("\t,out_ACK_"+toString(k)+"     \t=>\tinternal_SELECT_READ_"+toString(i)+"_"+toString(num_port)+index+"_VAL");
90              }
91            vhdl->set_body(");");
92            vhdl->set_body("");
93          }
94
95        for (uint32_t j=0; j<_param->_nb_port_write_by_bank; j++)
96          {
97            uint32_t nb_port = (_param->_crossbar == FULL_CROSSBAR)?_param->_nb_port_write:((j<write_select_limit)?write_nb_select1:write_nb_select2);
98
99            vhdl->set_body(_name+"_write_select_"+toString(i)+"_"+toString(j)+" : "+_name+"_select_"+toString(nb_port)+"_ports");
100            vhdl->set_body("port map (");
101            for (uint32_t k=0; k<nb_port; k++)
102              {
103                uint32_t num_port  = (_param->_crossbar == FULL_CROSSBAR)?k:(_param->_nb_port_write_by_bank*k+j);
104                string   separator = ((k==0)?" ":",");
105                string   index     = (_param->_crossbar == FULL_CROSSBAR)?("_"+toString(j)):"";
106               
107                vhdl->set_body("\t"+separator+" in_VAL_"+toString(k)+"     \t=>\tinternal_WRITE_"+toString(i)+"_"+toString(num_port)+index+"_VAL");
108                vhdl->set_body("\t,out_ACK_"+toString(k)+"     \t=>\tinternal_SELECT_WRITE_"+toString(i)+"_"+toString(num_port)+index+"_VAL");
109              }
110            vhdl->set_body(");");
111            vhdl->set_body("");
112          }
113      }
114
115    vhdl->set_body("");
116    vhdl->set_body("-----------------------------------");
117    vhdl->set_body("-- Bank Val");
118    vhdl->set_body("-----------------------------------");
119    vhdl->set_body("");
120    for (uint32_t i=0; i<_param->_nb_bank; i++)
121      {
122        for (uint32_t j=0; j<_param->_nb_port_read_by_bank; j++)
123          {
124            uint32_t nb_port = (_param->_crossbar == FULL_CROSSBAR)?_param->_nb_port_read:((j<read_select_limit)?read_nb_select1:read_nb_select2);
125
126            vhdl->set_body("internal_BANK_READ_"+toString(i)+"_"+toString(j)+ "_VAL  <= '0'");
127            for (uint32_t k=0; k<nb_port; k++)
128              {
129                uint32_t num_port  = (_param->_crossbar == FULL_CROSSBAR)?k:(_param->_nb_port_read_by_bank*k+j);
130                string   index     = (_param->_crossbar == FULL_CROSSBAR)?("_"+toString(j)):"";
131                vhdl->set_body("\tor internal_SELECT_READ_"+toString(i)+"_"+toString(num_port)+index+"_VAL");
132              }
133            vhdl->set_body(";");
134          }
135        for (uint32_t j=0; j<_param->_nb_port_write_by_bank; j++)
136          {
137            uint32_t nb_port = (_param->_crossbar == FULL_CROSSBAR)?_param->_nb_port_write:((j<write_select_limit)?write_nb_select1:write_nb_select2);
138
139            vhdl->set_body("internal_BANK_WRITE_"+toString(i)+"_"+toString(j)+ "_VAL <= '0'");
140            for (uint32_t k=0; k<nb_port; k++)
141              {
142                uint32_t num_port  = (_param->_crossbar == FULL_CROSSBAR)?k:(_param->_nb_port_write_by_bank*k+j);
143                string   index     = (_param->_crossbar == FULL_CROSSBAR)?("_"+toString(j)):"";
144
145                vhdl->set_body("\tor internal_SELECT_WRITE_"+toString(i)+"_"+toString(num_port)+index+"_VAL");
146              }
147            vhdl->set_body(";");
148          }
149      }
150
151    vhdl->set_body("");
152    vhdl->set_body("-----------------------------------");
153    vhdl->set_body("-- Bank Address");
154    vhdl->set_body("-----------------------------------");
155    vhdl->set_body("");
156    for (uint32_t i=0; i<_param->_nb_bank; i++)
157      {
158        for (uint32_t j=0; j<_param->_nb_port_read_by_bank; j++)
159          {
160            uint32_t nb_port = (_param->_crossbar == FULL_CROSSBAR)?_param->_nb_port_read:((j<read_select_limit)?read_nb_select1:read_nb_select2);
161
162            vhdl->set_body("internal_BANK_READ_"+toString(i)+"_"+toString(j)+ "_ADDRESS  <=");
163            for (uint32_t k=1; k<nb_port; k++)
164              {
165                uint32_t num_port  = (_param->_crossbar == FULL_CROSSBAR)?k:(_param->_nb_port_read_by_bank*k+j);
166                string   index     = (_param->_crossbar == FULL_CROSSBAR)?("_"+toString(j)):"";
167                               
168                vhdl->set_body("\tin_READ_"+toString(num_port)+"_ADDRESS"+std_logic_range(_param->_size_address_by_bank)+"  when internal_SELECT_READ_"+toString(i)+"_"+toString(num_port)+index+"_VAL ='1' else");
169              }
170            vhdl->set_body("\tin_READ_"+toString(j)+"_ADDRESS"+std_logic_range(_param->_size_address_by_bank)+";");
171//          vhdl->set_body("\t"+std_logic_others(_param->_size_word,0)+";");
172          }
173        for (uint32_t j=0; j<_param->_nb_port_write_by_bank; j++)
174          {
175            uint32_t nb_port = (_param->_crossbar == FULL_CROSSBAR)?_param->_nb_port_write:((j<write_select_limit)?write_nb_select1:write_nb_select2);
176
177            vhdl->set_body("internal_BANK_WRITE_"+toString(i)+"_"+toString(j)+ "_ADDRESS <=");
178            for (uint32_t k=1; k<nb_port; k++)
179              {
180                uint32_t num_port  = (_param->_crossbar == FULL_CROSSBAR)?k:(_param->_nb_port_write_by_bank*k+j);
181                string   index     = (_param->_crossbar == FULL_CROSSBAR)?("_"+toString(j)):"";
182
183                vhdl->set_body("\tin_WRITE_"+toString(num_port)+"_ADDRESS"+std_logic_range(_param->_size_address_by_bank)+" when internal_SELECT_WRITE_"+toString(i)+"_"+toString(num_port)+index+"_VAL='1' else");
184              }
185            vhdl->set_body("\tin_WRITE_"+toString(j)+"_ADDRESS"+std_logic_range(_param->_size_address_by_bank)+";");
186//          vhdl->set_body("\t"+std_logic_others(_param->_size_word,0)+";");
187          }
188      }
189
190    vhdl->set_body("");
191    vhdl->set_body("-----------------------------------");
192    vhdl->set_body("-- Bank Data");
193    vhdl->set_body("-----------------------------------");
194    vhdl->set_body("");
195    for (uint32_t i=0; i<_param->_nb_bank; i++)
196      {
197        for (uint32_t j=0; j<_param->_nb_port_write_by_bank; j++)
198          {
199            uint32_t nb_port = (_param->_crossbar == FULL_CROSSBAR)?_param->_nb_port_write:((j<write_select_limit)?write_nb_select1:write_nb_select2);
200
201            vhdl->set_body("internal_BANK_WRITE_"+toString(i)+"_"+toString(j)+ "_DATA <=");
202            for (uint32_t k=1; k<nb_port; k++)
203              {
204                uint32_t num_port  = (_param->_crossbar == FULL_CROSSBAR)?k:(_param->_nb_port_write_by_bank*k+j);
205                string   index     = (_param->_crossbar == FULL_CROSSBAR)?("_"+toString(j)):"";
206                vhdl->set_body("\tin_WRITE_"+toString(num_port)+"_DATA when internal_SELECT_WRITE_"+toString(i)+"_"+toString(num_port)+index+"_VAL='1' else");
207              }
208            vhdl->set_body("\tin_WRITE_"+toString(j)+"_DATA;");
209//          vhdl->set_body("\t"+std_logic_others(_param->_size_word,0)+";");
210          }
211      }
212
213    vhdl->set_body("");
214    vhdl->set_body("-----------------------------------");
215    vhdl->set_body("-- VAL (to Select)");
216    vhdl->set_body("-----------------------------------");
217    vhdl->set_body("");
218
219    for (uint32_t i=0; i<_param->_nb_bank; i++)
220      {
221        for (uint32_t j=0; j<_param->_nb_port_read; j ++)
222          {
223            string address = (_param->_nb_bank==1)?"":("and (in_READ_"+toString(j)+"_ADDRESS"+std_logic_range(_param->_size_address-1,_param->_size_address_by_bank)+"="+std_logic_conv( _param->_size_address-_param->_size_address_by_bank,i)+") ");
224
225            vhdl->set_body("internal_READ_"+toString(i)+"_"+toString(j)+"_VAL  <= '1' when (in_READ_"+toString(j)+"_VAL ='1') "+address+"else '0';");
226          }
227        for (uint32_t j=0; j<_param->_nb_port_write; j ++)
228          {
229            string address = (_param->_nb_bank==1)?"":("and (in_WRITE_"+toString(j)+"_ADDRESS"+std_logic_range(_param->_size_address-1,_param->_size_address_by_bank)+"="+std_logic_conv( _param->_size_address-_param->_size_address_by_bank,i)+") ");
230            vhdl->set_body("internal_WRITE_"+toString(i)+"_"+toString(j)+"_VAL <= '1' when (in_WRITE_"+toString(j)+"_VAL='1') "+address+"else '0';");
231          }
232      }
233
234    if (_param->_crossbar == FULL_CROSSBAR)
235      {
236        for (uint32_t i=0; i<_param->_nb_bank; i++)
237          {
238            for (uint32_t j=0; j<_param->_nb_port_read; j++)
239              {
240                for (uint32_t k=0; k<_param->_nb_port_read_by_bank; k++)
241                  {
242                    vhdl->set_body("internal_READ_"+toString(i)+"_"+toString(j)+"_"+toString(k)+"_VAL  <= internal_READ_"+toString(i)+"_"+toString(j)+"_VAL  and not");
243                    vhdl->set_body("\t('0'");
244                    for (uint32_t l=0; l<k; l++)
245                      {
246                        vhdl->set_body("\tor internal_SELECT_READ_"+toString(i)+"_"+toString(j)+"_"+toString(l)+"_VAL"); 
247                      }
248                   
249                    vhdl->set_body("\t);");
250                  }
251              }
252            for (uint32_t j=0; j<_param->_nb_port_write; j++)
253              {
254                for (uint32_t k=0; k<_param->_nb_port_write_by_bank; k++)
255                  {
256                    vhdl->set_body("internal_WRITE_"+toString(i)+"_"+toString(j)+"_"+toString(k)+"_VAL <= internal_WRITE_"+toString(i)+"_"+toString(j)+"_VAL and not");
257                    vhdl->set_body("\t('0'");
258
259                      for (uint32_t l=0; l<k; l++)
260                      {
261                        vhdl->set_body("\tor internal_SELECT_WRITE_"+toString(i)+"_"+toString(j)+"_"+toString(l)+"_VAL"); 
262                      }
263                   
264                    vhdl->set_body("\t);");
265                  }
266              }
267          }
268      }
269    vhdl->set_body("");
270    vhdl->set_body("-----------------------------------");
271    vhdl->set_body("-- OUTPUT");
272    vhdl->set_body("-----------------------------------");
273    vhdl->set_body("");
274
275    if (_param->_crossbar == FULL_CROSSBAR)
276      {
277        for (uint32_t i=0; i<_param->_nb_port_read; i ++)
278          {
279            vhdl->set_body("out_READ_"+toString(i)+"_ACK  <= ");
280            for (uint32_t j=0; j<_param->_nb_bank; j ++)
281              {
282                for (uint32_t k=0; k<_param->_nb_port_read_by_bank; k ++)
283                  {
284                    vhdl->set_body("\tinternal_BANK_READ_"+toString(j)+"_"+toString(k)+"_ACK  when internal_SELECT_READ_"+toString(j)+"_"+toString(i)+"_"+toString(k)+"_VAL  = '1' else");
285                  }
286              }
287            vhdl->set_body("\t'0';");
288            vhdl->set_body("out_READ_"+toString(i)+"_DATA <= ");
289            for (uint32_t j=0; j<_param->_nb_bank; j ++)
290              {
291                for (uint32_t k=0; k<_param->_nb_port_read_by_bank; k ++)
292                  {
293                    vhdl->set_body("\tinternal_BANK_READ_"+toString(j)+"_"+toString(k)+"_DATA when internal_SELECT_READ_"+toString(j)+"_"+toString(i)+"_"+toString(k)+"_VAL  = '1' else");
294                  }
295              }
296            vhdl->set_body("\t"+std_logic_others(_param->_size_word,0)+";");
297          }
298        for (uint32_t i=0; i<_param->_nb_port_write; i ++)
299          {
300            vhdl->set_body("out_WRITE_"+toString(i)+"_ACK <= ");
301            for (uint32_t j=0; j<_param->_nb_bank; j ++)
302              {
303                for (uint32_t k=0; k<_param->_nb_port_write_by_bank; k ++)
304                  {
305                    vhdl->set_body("\tinternal_BANK_WRITE_"+toString(j)+"_"+toString(k)+"_ACK when internal_SELECT_WRITE_"+toString(j)+"_"+toString(i)+"_"+toString(k)+"_VAL = '1' else");
306                  }
307              }
308            vhdl->set_body("\t'0';");
309          }
310      }
311    else
312      {
313        for (uint32_t i=0; i<_param->_nb_port_read; i ++)
314          {
315            uint32_t link = _param->_link_port_read_to_bank_read[i];
316
317            vhdl->set_body("out_READ_"+toString(i)+"_ACK  <= ");
318            for (uint32_t j=0; j<_param->_nb_bank; j ++)
319              {
320                vhdl->set_body("\tinternal_BANK_READ_"+toString(j)+"_"+toString(link)+"_ACK  when internal_SELECT_READ_"+toString(j)+"_"+toString(i)+"_VAL  = '1' else");
321              }
322//          vhdl->set_body("\tinternal_BANK_READ_"+toString(0)+"_"+toString(link)+"_ACK;");
323            vhdl->set_body("\t'0';");
324
325            vhdl->set_body("out_READ_"+toString(i)+"_DATA <= ");
326            for (uint32_t j=1; j<_param->_nb_bank; j ++)
327              {
328                vhdl->set_body("\tinternal_BANK_READ_"+toString(j)+"_"+toString(link)+"_DATA when internal_SELECT_READ_"+toString(j)+"_"+toString(i)+"_VAL = '1' else");
329              }
330            vhdl->set_body("\tinternal_BANK_READ_"+toString(0)+"_"+toString(link)+"_DATA;");
331//          vhdl->set_body("\t"+std_logic_others(_param->_size_word,0)+";");
332          }
333        for (uint32_t i=0; i<_param->_nb_port_write; i ++)
334          {
335            uint32_t link = _param->_link_port_write_to_bank_write[i];
336
337            vhdl->set_body("out_WRITE_"+toString(i)+"_ACK <= ");
338            for (uint32_t j=0; j<_param->_nb_bank; j ++)
339              {
340                vhdl->set_body("\tinternal_BANK_WRITE_"+toString(j)+"_"+toString(link)+"_ACK when internal_SELECT_WRITE_"+toString(j)+"_"+toString(i)+"_VAL = '1' else");
341              }
342//          vhdl->set_body("\tinternal_BANK_WRITE_"+toString(0)+"_"+toString(link)+"_ACK;");
343            vhdl->set_body("\t'0';");
344          }
345      }
346
347    log_printf(FUNC,RegisterFile_Multi_Banked,"vhdl_body","End");
348  };
349
350}; // end namespace registerfile_multi_banked
351}; // end namespace registerfile
352}; // end namespace generic
353}; // end namespace behavioural
354}; // end namespace morpheo             
355#endif
Note: See TracBrowser for help on using the repository browser.