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

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

Modification en profondeur de Component-port_map.
Compilation ok pour Register_unit ... a tester (systemC et vhdl)

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