source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Read_unit/Read_unit/Read_queue/src/Read_queue_vhdl_body.cpp @ 98

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

1) Fix bug (read unit, RAT -> write in R0, SPR desallocation ...)
2) Change VHDL Execute_queue -> use Generic/Queue?
3) Complete document on VHDL generation
4) Add soc test

  • Property svn:keywords set to Id
File size: 19.2 KB
Line 
1#ifdef VHDL
2/*
3 * $Id: Read_queue_vhdl_body.cpp 98 2008-12-31 10:18:08Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Read_unit/Read_unit/Read_queue/include/Read_queue.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_execute_loop {
15namespace execute_loop {
16namespace multi_read_unit {
17namespace read_unit {
18namespace read_queue {
19
20
21  void Read_queue::vhdl_body (Vhdl * & vhdl)
22  {
23    log_printf(FUNC,Read_queue,"vhdl_body","Begin");
24    vhdl->set_body(0,"");
25    vhdl->set_body(0,"");
26    vhdl->set_body(0,"-----------------------------------");
27    vhdl->set_body(0,"-- Instance queue                  ");
28    vhdl->set_body(0,"-----------------------------------");
29    vhdl->set_body(0,"");
30
31    vhdl->set_body(0,"instance_"+_name+"_queue : "+_name+"_queue");
32    vhdl->set_body(0,"port map (");
33    vhdl->set_body(1,"  in_CLOCK       \t=>\t      in_CLOCK ");
34    vhdl->set_body(1,", in_NRESET      \t=>\t      in_NRESET");
35    vhdl->set_body(1,", in_INSERT_VAL  \t=>\tinternal_QUEUE_INSERT_VAL");
36    vhdl->set_body(1,",out_INSERT_ACK  \t=>\tinternal_QUEUE_INSERT_ACK");
37    vhdl->set_body(1,", in_INSERT_DATA \t=>\tinternal_QUEUE_INSERT_DATA");
38    vhdl->set_body(1,",out_RETIRE_VAL  \t=>\tinternal_QUEUE_RETIRE_VAL");
39    vhdl->set_body(1,", in_RETIRE_ACK  \t=>\tinternal_QUEUE_RETIRE_ACK");
40    vhdl->set_body(1,",out_RETIRE_DATA \t=>\tinternal_QUEUE_RETIRE_DATA");
41    vhdl->set_body(0,");");
42
43    vhdl->set_body(0,"");
44    vhdl->set_body(0,"-----------------------------------");
45    vhdl->set_body(0,"-- Queue_data                      ");
46    vhdl->set_body(0,"-----------------------------------");
47    vhdl->set_body(0,"");
48   
49    uint32_t min = 0;
50    uint32_t max;
51
52    if(_param->_have_port_context_id   )
53      {
54        max = min-1+_param->_size_context_id;
55        vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_CONTEXT_ID;");
56        min = max+1;
57      }
58    if(_param->_have_port_front_end_id   )
59      {
60        max = min-1+_param->_size_front_end_id;
61        vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_FRONT_END_ID;");
62        min = max+1;
63      }
64    if(_param->_have_port_ooo_engine_id   )
65      {
66        max = min-1+_param->_size_ooo_engine_id;
67        vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_OOO_ENGINE_ID;");
68        min = max+1;
69      }
70    if(_param->_have_port_rob_ptr  )
71      {
72        max = min-1+_param->_size_rob_ptr  ;
73        vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_ROB_ID;");
74        min = max+1;
75      }
76
77    max = min-1+_param->_size_operation;
78    vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_OPERATION;");
79    min = max+1;
80
81    max = min-1+_param->_size_type;
82    vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_TYPE;");
83    min = max+1;
84
85    max = min;
86    vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_HAS_IMMEDIAT;");
87    min = max+1;
88
89    max = min-1+_param->_size_general_data;
90    vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_IMMEDIAT;");
91    min = max+1;
92
93    max = min;
94    vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_READ_RA;");
95    min = max+1;
96
97    max = min-1+_param->_size_general_register;
98    vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_NUM_REG_RA;");
99    min = max+1;
100
101    max = min;
102    vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_READ_RB;");
103    min = max+1;
104
105    max = min-1+_param->_size_general_register;
106    vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_NUM_REG_RB;");
107    min = max+1;
108
109    max = min;
110    vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_READ_RC;");
111    min = max+1;
112
113    max = min-1+_param->_size_special_register;
114    vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_NUM_REG_RC;");
115    min = max+1;
116
117    max = min;
118    vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_WRITE_RD;");
119    min = max+1;
120
121    max = min-1+_param->_size_general_register;
122    vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_NUM_REG_RD;");
123    min = max+1;
124
125    max = min;
126    vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_WRITE_RE;");
127    min = max+1;
128
129    max = min-1+_param->_size_special_register;
130    vhdl->set_body(0,"internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_NUM_REG_RE;");
131    min = max+1;
132
133    vhdl->set_body(0,"internal_QUEUE_RETIRE_ACK <= internal_READ_QUEUE_OUT_VAL and in_READ_QUEUE_OUT_ACK;");
134
135    vhdl->set_body(0,"");
136    vhdl->set_body(0,"-----------------------------------");
137    vhdl->set_body(0,"-- Interface read");
138    vhdl->set_body(0,"-----------------------------------");
139    vhdl->set_body(0,"");
140    vhdl->set_body(0,"-- GPR");
141    vhdl->set_body(0,"out_GPR_READ_0_VAL           <= internal_QUEUE_RETIRE_VAL and internal_READ_RA_VAL;");
142    vhdl->set_body(0,"out_GPR_READ_1_VAL           <= internal_QUEUE_RETIRE_VAL and internal_READ_RB_VAL;");
143    if(_param->_have_port_ooo_engine_id)
144      {
145        vhdl->set_body(0,"out_GPR_READ_0_OOO_ENGINE_ID <= internal_OOO_ENGINE_ID;");
146        vhdl->set_body(0,"out_GPR_READ_1_OOO_ENGINE_ID <= internal_OOO_ENGINE_ID;");
147      }
148    vhdl->set_body(0,"out_GPR_READ_0_NUM_REG       <= internal_NUM_REG_RA;");
149    vhdl->set_body(0,"out_GPR_READ_1_NUM_REG       <= internal_NUM_REG_RB;");
150    vhdl->set_body(0,"");
151   
152    vhdl->set_body(0,"-- SPR");
153    vhdl->set_body(0,"out_SPR_READ_0_VAL           <= internal_QUEUE_RETIRE_VAL and internal_READ_RC_VAL;");
154    if(_param->_have_port_ooo_engine_id)
155      {
156        vhdl->set_body(0,"out_SPR_READ_0_OOO_ENGINE_ID <= internal_OOO_ENGINE_ID;");
157      }
158    vhdl->set_body(0,"out_SPR_READ_0_NUM_REG       <= internal_NUM_REG_RC;");
159
160    vhdl->set_body(0,"");
161    vhdl->set_body(0,"-----------------------------------");
162    vhdl->set_body(0,"-- Interface read_queue_out");
163    vhdl->set_body(0,"-----------------------------------");
164    vhdl->set_body(0,"");
165   
166    if(_param->_have_port_context_id   )
167      vhdl->set_body(0,"out_READ_QUEUE_OUT_CONTEXT_ID    <= internal_CONTEXT_ID   ;");
168    if(_param->_have_port_front_end_id   )
169      vhdl->set_body(0,"out_READ_QUEUE_OUT_FRONT_END_ID  <= internal_FRONT_END_ID ;");
170    if(_param->_have_port_ooo_engine_id   )
171      vhdl->set_body(0,"out_READ_QUEUE_OUT_OOO_ENGINE_ID <= internal_OOO_ENGINE_ID;");
172    if(_param->_have_port_rob_ptr  )
173      vhdl->set_body(0,"out_READ_QUEUE_OUT_ROB_ID        <= internal_ROB_ID       ;");
174    vhdl->set_body(0,"out_READ_QUEUE_OUT_OPERATION     <= internal_OPERATION    ;");
175    vhdl->set_body(0,"out_READ_QUEUE_OUT_TYPE          <= internal_TYPE         ;");
176    vhdl->set_body(0,"out_READ_QUEUE_OUT_HAS_IMMEDIAT  <= internal_HAS_IMMEDIAT ;");
177    vhdl->set_body(0,"out_READ_QUEUE_OUT_IMMEDIAT      <= internal_IMMEDIAT     ;");
178//  vhdl->set_body(0,"out_READ_QUEUE_OUT_READ_RA       <= internal_READ_RA      ;");
179    vhdl->set_body(0,"out_READ_QUEUE_OUT_NUM_REG_RA    <= internal_NUM_REG_RA   ;");
180    vhdl->set_body(0,"out_READ_QUEUE_OUT_DATA_RA_VAL   <= internal_NEXT_DATA_RA_VAL;");
181    vhdl->set_body(0,"out_READ_QUEUE_OUT_DATA_RA       <= internal_NEXT_DATA_RA ;");
182//  vhdl->set_body(0,"out_READ_QUEUE_OUT_READ_RB       <= internal_READ_RB      ;");
183    vhdl->set_body(0,"out_READ_QUEUE_OUT_NUM_REG_RB    <= internal_NUM_REG_RB   ;");
184    vhdl->set_body(0,"out_READ_QUEUE_OUT_DATA_RB_VAL   <= internal_NEXT_DATA_RB_VAL;");
185    vhdl->set_body(0,"out_READ_QUEUE_OUT_DATA_RB       <= internal_NEXT_DATA_RB ;");
186//  vhdl->set_body(0,"out_READ_QUEUE_OUT_READ_RC       <= internal_READ_RC      ;");
187    vhdl->set_body(0,"out_READ_QUEUE_OUT_NUM_REG_RC    <= internal_NUM_REG_RC   ;");
188    vhdl->set_body(0,"out_READ_QUEUE_OUT_DATA_RC_VAL   <= internal_NEXT_DATA_RC_VAL;");
189    vhdl->set_body(0,"out_READ_QUEUE_OUT_DATA_RC       <= internal_NEXT_DATA_RC ;");
190    vhdl->set_body(0,"out_READ_QUEUE_OUT_WRITE_RD      <= internal_WRITE_RD     ;");
191    vhdl->set_body(0,"out_READ_QUEUE_OUT_NUM_REG_RD    <= internal_NUM_REG_RD   ;");
192    vhdl->set_body(0,"out_READ_QUEUE_OUT_WRITE_RE      <= internal_WRITE_RE     ;");
193    vhdl->set_body(0,"out_READ_QUEUE_OUT_NUM_REG_RE    <= internal_NUM_REG_RE   ;");
194   
195    vhdl->set_body(0,"");
196    vhdl->set_body(0,"-----------------------------------");
197    vhdl->set_body(0,"-- next reg update");
198    vhdl->set_body(0,"-----------------------------------");
199    vhdl->set_body(0,"");
200    vhdl->set_body(0,"-- read_rx_val - 1 : must access at the registerFile (after access, is set at 0)");
201   
202    {
203      vhdl->set_body(0,"");
204      vhdl->set_body(0,"internal_NEXT_READ_RA_VAL <=");
205      vhdl->set_body(1,"'0' when");
206      // bypass
207      vhdl->set_body(2,"-- check bypass");
208      for (int32_t i=_param->_nb_gpr_write-1; i>=0 ; i--)
209        {
210          std::string cmp;
211         
212          if (_param->_have_port_ooo_engine_id)
213            cmp = "and (in_GPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) ";
214          else
215            cmp = "";
216         
217          vhdl->set_body(2,"((in_GPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RA=in_GPR_WRITE_"+toString(i)+"_NUM_REG)) or");
218        }
219      vhdl->set_body(2,"false else");
220      vhdl->set_body(1,"internal_READ_RA_VAL and not in_GPR_READ_0_ACK;");
221    }
222    {
223      vhdl->set_body(0,"");
224      vhdl->set_body(0,"internal_NEXT_READ_RB_VAL <=");
225      vhdl->set_body(1,"'0' when");
226      // bypass
227      vhdl->set_body(2,"-- check bypass");
228      for (int32_t i=_param->_nb_gpr_write-1; i>=0 ; i--)
229        {
230          std::string cmp;
231         
232          if (_param->_have_port_ooo_engine_id)
233            cmp = "and (in_GPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) ";
234          else
235            cmp = "";
236         
237          vhdl->set_body(2,"((in_GPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RB=in_GPR_WRITE_"+toString(i)+"_NUM_REG)) or");
238        }
239      vhdl->set_body(2,"false else");
240      vhdl->set_body(1,"internal_READ_RB_VAL and not in_GPR_READ_1_ACK;");
241    }
242    {
243      vhdl->set_body(0,"");
244      vhdl->set_body(0,"internal_NEXT_READ_RC_VAL <=");
245      vhdl->set_body(1,"'0' when");
246      // bypass
247      vhdl->set_body(2,"-- check bypass");
248      for (int32_t i=_param->_nb_spr_write-1; i>=0 ; i--)
249        {
250          std::string cmp;
251         
252          if (_param->_have_port_ooo_engine_id)
253            cmp = "and (in_SPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) ";
254          else
255            cmp = "";
256         
257          vhdl->set_body(2,"((in_SPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RC=in_SPR_WRITE_"+toString(i)+"_NUM_REG)) or");
258        }
259      vhdl->set_body(2,"false else");
260      vhdl->set_body(1,"internal_READ_RC_VAL and not in_SPR_READ_0_ACK;");
261    }
262    {
263      vhdl->set_body(0,"");
264      vhdl->set_body(0,"internal_READ_QUEUE_OUT_VAL <= not internal_NEXT_READ_RA_VAL and not internal_NEXT_READ_RB_VAL and not internal_NEXT_READ_RC_VAL;");
265      vhdl->set_body(0,"     out_READ_QUEUE_OUT_VAL <= internal_READ_QUEUE_OUT_VAL and internal_QUEUE_RETIRE_VAL;");
266     
267    }
268   
269    vhdl->set_body(0,"");
270    vhdl->set_body(0,"-- data_rx_val - 1 : the read of registerFile is valid");
271   
272    {
273      vhdl->set_body(0,"");
274      vhdl->set_body(0,"internal_NEXT_DATA_RA_VAL <=");
275      vhdl->set_body(1,"'1' when");
276      // bypass
277      vhdl->set_body(2,"-- check bypass");
278      for (int32_t i=_param->_nb_gpr_write-1; i>=0 ; i--)
279        {
280          std::string cmp;
281       
282          if (_param->_have_port_ooo_engine_id)
283            cmp = "and (in_GPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) ";
284          else
285            cmp = "";
286         
287          vhdl->set_body(2,"((in_GPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RA=in_GPR_WRITE_"+toString(i)+"_NUM_REG)) or");
288        }
289      vhdl->set_body(2,"false else");
290      vhdl->set_body(1,"internal_DATA_RA_VAL or (internal_READ_RA_VAL and in_GPR_READ_0_ACK and in_GPR_READ_0_DATA_VAL);");
291    }
292    {
293      vhdl->set_body(0,"");
294      vhdl->set_body(0,"internal_NEXT_DATA_RB_VAL <=");
295      vhdl->set_body(1,"'1' when");
296      // bypass
297      vhdl->set_body(2,"-- check bypass");
298      for (int32_t i=_param->_nb_gpr_write-1; i>=0 ; i--)
299        {
300          std::string cmp;
301         
302          if (_param->_have_port_ooo_engine_id)
303            cmp = "and (in_GPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) ";
304        else
305          cmp = "";
306         
307          vhdl->set_body(2,"((in_GPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RB=in_GPR_WRITE_"+toString(i)+"_NUM_REG)) or");
308        }
309      vhdl->set_body(2,"false else");
310      vhdl->set_body(1,"internal_DATA_RB_VAL or (internal_READ_RB_VAL and in_GPR_READ_1_ACK and in_GPR_READ_1_DATA_VAL);");
311    }
312    {
313      vhdl->set_body(0,"");
314      vhdl->set_body(0,"internal_NEXT_DATA_RC_VAL <=");
315      vhdl->set_body(1,"'1' when");
316      // bypass
317      vhdl->set_body(2,"-- check bypass");
318      for (int32_t i=_param->_nb_spr_write-1; i>=0 ; i--)
319        {
320          std::string cmp;
321         
322          if (_param->_have_port_ooo_engine_id)
323            cmp = "and (in_SPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) ";
324          else
325            cmp = "";
326         
327          vhdl->set_body(2,"((in_SPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RC=in_SPR_WRITE_"+toString(i)+"_NUM_REG)) or");
328        }
329      vhdl->set_body(2,"false else");
330      vhdl->set_body(1,"internal_DATA_RC_VAL or (internal_READ_RC_VAL and in_SPR_READ_0_ACK and in_SPR_READ_0_DATA_VAL);");
331    }
332   
333    vhdl->set_body(0,"");
334    vhdl->set_body(0,"-- data_rx - data read");
335    {
336      vhdl->set_body(0,"");
337      vhdl->set_body(0,"internal_NEXT_DATA_RA <=");
338#ifdef SYSTEMC_VHDL_COMPATIBILITY
339      vhdl->set_body(1,""+std_logic_others(_param->_size_general_data,0)+" when internal_READ_RA='0' else");
340#endif
341      // bypass
342      vhdl->set_body(2,"-- check bypass");
343      for (int32_t i=_param->_nb_gpr_write-1; i>=0 ; i--)
344        {
345          std::string cmp;
346       
347          if (_param->_have_port_ooo_engine_id)
348            cmp = "and (in_GPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) ";
349          else
350            cmp = "";
351         
352          vhdl->set_body(1,"in_GPR_WRITE_"+toString(i)+"_DATA when ((in_GPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RA=in_GPR_WRITE_"+toString(i)+"_NUM_REG)) else");
353        }
354      vhdl->set_body(1,"reg_DATA_RA when (internal_DATA_RA_VAL='1') else");
355      vhdl->set_body(1,"in_GPR_READ_0_DATA;");
356    }
357    {
358      vhdl->set_body(0,"");
359      vhdl->set_body(0,"internal_NEXT_DATA_RB <=");
360#ifdef SYSTEMC_VHDL_COMPATIBILITY
361      vhdl->set_body(1,""+std_logic_others(_param->_size_general_data,0)+" when internal_READ_RB='0' else");
362#endif
363      // bypass
364      vhdl->set_body(2,"-- check bypass");
365      for (int32_t i=_param->_nb_gpr_write-1; i>=0 ; i--)
366        {
367          std::string cmp;
368       
369          if (_param->_have_port_ooo_engine_id)
370            cmp = "and (in_GPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) ";
371          else
372            cmp = "";
373         
374          vhdl->set_body(1,"in_GPR_WRITE_"+toString(i)+"_DATA when ((in_GPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RB=in_GPR_WRITE_"+toString(i)+"_NUM_REG)) else");
375        }
376      vhdl->set_body(1,"reg_DATA_RB when (internal_DATA_RB_VAL='1') else");
377      vhdl->set_body(1,"in_GPR_READ_1_DATA;");
378    }
379    {
380      vhdl->set_body(0,"");
381      vhdl->set_body(0,"internal_NEXT_DATA_RC <=");
382#ifdef SYSTEMC_VHDL_COMPATIBILITY
383      vhdl->set_body(1,""+std_logic_others(_param->_size_special_data,0)+" when internal_READ_RC='0' else");
384#endif
385      // bypass
386      vhdl->set_body(2,"-- check bypass");
387      for (int32_t i=_param->_nb_spr_write-1; i>=0 ; i--)
388        {
389          std::string cmp;
390       
391          if (_param->_have_port_ooo_engine_id)
392            cmp = "and (in_SPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) ";
393          else
394            cmp = "";
395         
396          vhdl->set_body(1,"in_SPR_WRITE_"+toString(i)+"_DATA when ((in_SPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (in_SPR_WRITE_"+toString(i)+"_NUM_REG=internal_NUM_REG_RC)) else");
397        }
398      vhdl->set_body(1,"reg_DATA_RC when (internal_DATA_RC_VAL='1') else");
399      vhdl->set_body(1,"in_SPR_READ_0_DATA;");
400
401    vhdl->set_body(0,"");
402    vhdl->set_body(0,"-----------------------------------");
403    vhdl->set_body(0,"-- transition");
404    vhdl->set_body(0,"-----------------------------------");
405    vhdl->set_body(0,"");
406    vhdl->set_body(0,"-- need a new head if :");
407    vhdl->set_body(0,"--   * queue is empty");
408    vhdl->set_body(0,"--   * pop with queue");
409    vhdl->set_body(0,"internal_NEXT_NEED_NEW_HEAD <= not internal_QUEUE_RETIRE_VAL or (internal_QUEUE_RETIRE_VAL and internal_QUEUE_RETIRE_ACK);");
410
411    vhdl->set_body(0,"internal_READ_RA_VAL   <=     internal_READ_RA when reg_NEED_NEW_HEAD='1' else reg_READ_RA_VAL;");
412    vhdl->set_body(0,"internal_READ_RB_VAL   <=     internal_READ_RB when reg_NEED_NEW_HEAD='1' else reg_READ_RB_VAL;");
413    vhdl->set_body(0,"internal_READ_RC_VAL   <=     internal_READ_RC when reg_NEED_NEW_HEAD='1' else reg_READ_RC_VAL;");
414    vhdl->set_body(0,"internal_DATA_RA_VAL   <= not internal_READ_RA when reg_NEED_NEW_HEAD='1' else reg_DATA_RA_VAL;");
415    vhdl->set_body(0,"internal_DATA_RB_VAL   <= not internal_READ_RB when reg_NEED_NEW_HEAD='1' else reg_DATA_RB_VAL;");
416    vhdl->set_body(0,"internal_DATA_RC_VAL   <= not internal_READ_RC when reg_NEED_NEW_HEAD='1' else reg_DATA_RC_VAL;");
417
418
419    vhdl->set_body(0,"");
420    vhdl->set_body(0,"transition: process (in_CLOCK)");
421    vhdl->set_body(0,"begin  -- process transition");
422    vhdl->set_body(1,"if in_CLOCK'event and in_CLOCK = '1' then");
423    vhdl->set_body(0,"");
424    vhdl->set_body(2,"if (in_NRESET = '0') then");   
425    vhdl->set_body(3,"reg_NEED_NEW_HEAD <= '1';");
426    vhdl->set_body(2,"else");
427    vhdl->set_body(3,"reg_NEED_NEW_HEAD <= internal_NEXT_NEED_NEW_HEAD;");
428    vhdl->set_body(3,"reg_READ_RA_VAL   <= internal_NEXT_READ_RA_VAL;");
429    vhdl->set_body(3,"reg_READ_RB_VAL   <= internal_NEXT_READ_RB_VAL;");
430    vhdl->set_body(3,"reg_READ_RC_VAL   <= internal_NEXT_READ_RC_VAL;");
431    vhdl->set_body(3,"reg_DATA_RA_VAL   <= internal_NEXT_DATA_RA_VAL;");
432    vhdl->set_body(3,"reg_DATA_RB_VAL   <= internal_NEXT_DATA_RB_VAL;");
433    vhdl->set_body(3,"reg_DATA_RC_VAL   <= internal_NEXT_DATA_RC_VAL;");
434    vhdl->set_body(3,"reg_DATA_RA       <= internal_NEXT_DATA_RA    ;");
435    vhdl->set_body(3,"reg_DATA_RB       <= internal_NEXT_DATA_RB    ;");
436    vhdl->set_body(3,"reg_DATA_RC       <= internal_NEXT_DATA_RC    ;");
437
438    vhdl->set_body(2,"end if;");
439    vhdl->set_body(0,"");
440    vhdl->set_body(1,"end if;");
441    vhdl->set_body(0,"end process transition;");
442
443    }
444
445
446    log_printf(FUNC,Read_queue,"vhdl_body","End");
447  };
448
449}; // end namespace read_queue
450}; // end namespace read_unit
451}; // end namespace multi_read_unit
452}; // end namespace execute_loop
453}; // end namespace multi_execute_loop
454}; // end namespace core
455
456}; // end namespace behavioural
457}; // end namespace morpheo             
458#endif
Note: See TracBrowser for help on using the repository browser.