source: trunk/IPs/systemC/processor/Morpheo/Documentation/doc/document-morpheo-vhdl_generation/tex/document-morpheo-vhdl_generation-fr-05_02_execute_queue.tex @ 100

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

1) Bug fix (Operation, Instruction)
2) Modif Return Address Stack
3) Add Soft Test
4) Add Soc Test

  • Property svn:keywords set to Id
File size: 16.6 KB
Line 
1%------------------------------------------------------------------------------
2% $Id: document-morpheo-vhdl_generation-fr-05_02_execute_queue.tex 100 2009-01-08 13:06:27Z rosiere $
3%------------------------------------------------------------------------------
4
5\subSection{Tampon entre la boucle d'exécutione et le buffer de réordonnancement}
6
7\subsubSection{Fichier Execute\_queue\_vhdl.cpp}
8
9\lstparam{C++}
10\begin{lstlisting}[caption={Execute\_queue\_vhdl.cpp}]
11void Execute_queue::vhdl (void)
12{
13  morpheo::behavioural::generic::queue::Parameters * param_queue;
14 
15  param_queue = new morpheo::behavioural::generic::queue::Parameters
16    (_param->_size_queue,
17     _param->_size_internal_queue
18     );
19 
20  morpheo::behavioural::generic::queue::Queue      * queue;
21
22  std::string queue_name = _name + "_queue";
23  queue = new morpheo::behavioural::generic::queue::Queue
24    (queue_name.c_str()
25#ifdef STATISTICS
26     ,NULL
27#endif
28     ,param_queue
29     ,USE_VHDL);
30 
31  _component->set_component(queue->_component
32#ifdef POSITION
33                            , 50, 50, 50, 50
34#endif
35                            , INSTANCE_LIBRARY
36                            );
37
38  Vhdl * vhdl = new Vhdl (_name);
39
40  _interfaces->set_port(vhdl);
41  _component->vhdl_instance(vhdl);
42
43  vhdl_declaration (vhdl);
44  vhdl_body        (vhdl);
45
46  vhdl->generate_file();
47
48  delete vhdl;
49};
50\end{lstlisting}
51
52\subsubSection{Fichier Execute\_queue\_vhdl\_declaration.cpp}
53
54\lstparam{C++}
55\begin{lstlisting}[caption={Execute\_queue\_vhdl\_declaration.cpp}]
56void Execute_queue::vhdl_declaration (Vhdl * & vhdl)
57{
58  vhdl->set_alias  ("internal_QUEUE_INSERT_VAL ",
59                    1,
60                    " in_EXECUTE_QUEUE_IN_VAL",
61                    std_logic_range(1));
62  vhdl->set_alias  ("internal_QUEUE_INSERT_ACK ",
63                    1,
64                    "out_EXECUTE_QUEUE_IN_ACK",
65                    std_logic_range(1));
66  vhdl->set_signal ("internal_QUEUE_INSERT_DATA",
67                    _param->_size_internal_queue);
68  vhdl->set_signal ("internal_QUEUE_RETIRE_DATA",
69                    _param->_size_internal_queue);
70  vhdl->set_alias  ("internal_QUEUE_RETIRE_VAL ",
71                    1,
72                    "out_EXECUTE_QUEUE_OUT_VAL",
73                    std_logic_range(1));
74  vhdl->set_alias  ("internal_QUEUE_RETIRE_ACK ",
75                    1,
76                    " in_EXECUTE_QUEUE_OUT_ACK",
77                    std_logic_range(1));
78
79  uint32_t min = 0;
80  uint32_t max, size;
81
82  if(_param->_have_port_context_id   )
83    {
84  size = _param->_size_context_id;
85  max = min-1+size;
86  vhdl->set_alias ("internal_EXECUTE_QUEUE_OUT_CONTEXT_ID           ",
87                   std_logic(size),
88                   "internal_QUEUE_RETIRE_DATA",
89                   std_logic_range(_param->_size_internal_queue,max,min));
90  min = max+1;
91    }
92  if(_param->_have_port_front_end_id   )
93    {
94  size = _param->_size_front_end_id;
95  max = min-1+size;
96  vhdl->set_alias ("internal_EXECUTE_QUEUE_OUT_FRONT_END_ID         ",
97                   std_logic(size),
98                   "internal_QUEUE_RETIRE_DATA",
99                   std_logic_range(_param->_size_internal_queue,max,min));
100  min = max+1;
101    }
102  if(_param->_have_port_ooo_engine_id   )
103    {
104  size = _param->_size_ooo_engine_id;
105  max = min-1+size;
106  vhdl->set_alias ("internal_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID        ",
107                   std_logic(size),
108                   "internal_QUEUE_RETIRE_DATA",
109                   std_logic_range(_param->_size_internal_queue,max,min));
110  min = max+1;
111    }
112  if(_param->_have_port_rob_ptr)
113    {
114  size = _param->_size_rob_ptr;
115  max = min-1+size;
116  vhdl->set_alias ("internal_EXECUTE_QUEUE_OUT_PACKET_ID            ",
117                   std_logic(size),
118                   "internal_QUEUE_RETIRE_DATA",
119                   std_logic_range(_param->_size_internal_queue,max,min));
120  min = max+1;
121    }
122
123  size = _param->_size_special_data;
124  max = min-1+size;
125  vhdl->set_alias ("internal_EXECUTE_QUEUE_OUT_FLAGS                ",
126                   std_logic(size),
127                   "internal_QUEUE_RETIRE_DATA",
128                   std_logic_range(_param->_size_internal_queue,max,min));
129  min = max+1;
130
131  size = _param->_size_exception;   
132  max = min-1+size;
133  vhdl->set_alias ("internal_EXECUTE_QUEUE_OUT_EXCEPTION            ",
134                   std_logic(size),
135                   "internal_QUEUE_RETIRE_DATA",
136                   std_logic_range(_param->_size_internal_queue,max,min));
137  min = max+1;
138
139  size = 1;
140  max = min-1+size;
141  vhdl->set_alias ("internal_EXECUTE_QUEUE_OUT_NO_SEQUENCE          ",
142                   std_logic(size),
143                   "internal_QUEUE_RETIRE_DATA",
144                   std_logic_range(_param->_size_internal_queue,max,min));
145  min = max+1;
146
147  size = _param->_size_instruction_address;
148  max = min-1+size;
149  vhdl->set_alias ("internal_EXECUTE_QUEUE_OUT_ADDRESS              ",
150                   std_logic(size),
151                   "internal_QUEUE_RETIRE_DATA",
152                   std_logic_range(_param->_size_internal_queue,max,min));
153  min = max+1;
154
155  size = _param->_size_general_data;
156  max = min-1+size;
157  vhdl->set_alias ("internal_EXECUTE_QUEUE_OUT_DATA                 ",
158                   std_logic(size),
159                   "internal_QUEUE_RETIRE_DATA",
160                   std_logic_range(_param->_size_internal_queue,max,min));
161  min = max+1;
162};
163\end{lstlisting}
164
165\subsubSection{Fichier Execute\_queue\_vhdl\_body.cpp}
166
167\lstparam{C++}
168\begin{lstlisting}[caption={Execute\_queue\_vhdl\_body.cpp}]
169void Execute_queue::vhdl_body (Vhdl * & vhdl)
170{
171  vhdl->set_comment(0,"");
172  vhdl->set_comment(0,"-----------------------------------");
173  vhdl->set_comment(0,"-- Instance queue                  ");
174  vhdl->set_comment(0,"-----------------------------------");
175  vhdl->set_comment(0,"");
176
177  vhdl->set_body   (0,"instance_"+_name+"_queue : "+_name+"_queue");
178  vhdl->set_body   (0,"port map (");
179  vhdl->set_body   (1,"  in_CLOCK       \t=>\t      in_CLOCK ");
180  vhdl->set_body   (1,", in_NRESET      \t=>\t      in_NRESET");
181  vhdl->set_body   (1,", in_INSERT_VAL  \t=>\tinternal_QUEUE_INSERT_VAL");
182  vhdl->set_body   (1,",out_INSERT_ACK  \t=>\tinternal_QUEUE_INSERT_ACK");
183  vhdl->set_body   (1,", in_INSERT_DATA \t=>\tinternal_QUEUE_INSERT_DATA");
184  vhdl->set_body   (1,",out_RETIRE_VAL  \t=>\tinternal_QUEUE_RETIRE_VAL");
185  vhdl->set_body   (1,", in_RETIRE_ACK  \t=>\tinternal_QUEUE_RETIRE_ACK");
186  vhdl->set_body   (1,",out_RETIRE_DATA \t=>\tinternal_QUEUE_RETIRE_DATA");
187  vhdl->set_body   (0,");");
188
189  vhdl->set_comment(0,"");
190  vhdl->set_comment(0,"-----------------------------------");
191  vhdl->set_comment(0,"-- Input  Buffer                   ");
192  vhdl->set_comment(0,"-----------------------------------");
193  vhdl->set_comment(0,"");
194
195  {
196  uint32_t min = 0;
197  uint32_t max, size;
198  uint32_t size_queue = _param->_size_internal_queue;
199
200  if(_param->_have_port_context_id   )
201    {
202  size = _param->_size_context_id;
203  max = min-1+size;
204  vhdl->set_body   (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(size_queue,max,min)+
205                      " <= in_EXECUTE_QUEUE_IN_CONTEXT_ID;");
206  min = max+1;
207    }
208  if(_param->_have_port_front_end_id   )
209    {
210  size = _param->_size_front_end_id;
211  max = min-1+size;
212  vhdl->set_body   (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(size_queue,max,min)+
213                      " <= in_EXECUTE_QUEUE_IN_FRONT_END_ID;");
214  min = max+1;
215    }
216  if(_param->_have_port_ooo_engine_id   )
217    {
218  size = _param->_size_ooo_engine_id;
219  max = min-1+size;
220  vhdl->set_body   (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(size_queue,max,min)+
221                      " <= in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID;");
222  min = max+1;
223    }
224  if(_param->_have_port_rob_ptr)
225    {
226  size = _param->_size_rob_ptr;
227  max = min-1+size;
228  vhdl->set_body   (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(size_queue,max,min)+
229                      " <= in_EXECUTE_QUEUE_IN_PACKET_ID;");
230  min = max+1;
231    }
232
233  size = _param->_size_special_data;
234  max = min-1+size;
235  vhdl->set_body   (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(size_queue,max,min)+
236                      " <= in_EXECUTE_QUEUE_IN_FLAGS;");
237  min = max+1;
238
239  size = _param->_size_exception;   
240  max = min-1+size;
241  vhdl->set_body   (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(size_queue,max,min)+
242                      " <= in_EXECUTE_QUEUE_IN_EXCEPTION;");
243  min = max+1;
244
245  size = 1;
246  max = min-1+size;
247  vhdl->set_body   (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(size_queue,max,min)+
248                      " <= in_EXECUTE_QUEUE_IN_NO_SEQUENCE;");
249  min = max+1;
250
251  size = _param->_size_instruction_address;
252  max = min-1+size;
253  vhdl->set_body   (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(size_queue,max,min)+
254                      " <= in_EXECUTE_QUEUE_IN_ADDRESS;");
255  min = max+1;
256
257  size = _param->_size_general_data;
258  max = min-1+size;
259  vhdl->set_body   (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(size_queue,max,min)+
260                      " <= in_EXECUTE_QUEUE_IN_DATA;");
261  min = max+1;
262  }
263
264  vhdl->set_comment(0,"");
265  vhdl->set_comment(0,"-----------------------------------");
266  vhdl->set_comment(0,"-- Output Buffer                   ");
267  vhdl->set_comment(0,"-----------------------------------");
268  vhdl->set_comment(0,"");
269
270  if(_param->_have_port_context_id)
271  vhdl->set_body   (0,"out_EXECUTE_QUEUE_OUT_CONTEXT_ID   "+
272                      " <= internal_EXECUTE_QUEUE_OUT_CONTEXT_ID   ;");
273  if(_param->_have_port_front_end_id)
274  vhdl->set_body   (0,"out_EXECUTE_QUEUE_OUT_FRONT_END_ID "+
275                      " <= internal_EXECUTE_QUEUE_OUT_FRONT_END_ID ;");
276  if(_param->_have_port_ooo_engine_id)
277  vhdl->set_body   (0,"out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID"+
278                      " <= internal_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID;");
279  if(_param->_have_port_rob_ptr)
280  vhdl->set_body   (0,"out_EXECUTE_QUEUE_OUT_PACKET_ID    "+
281                      " <= internal_EXECUTE_QUEUE_OUT_PACKET_ID    ;");
282  vhdl->set_body   (0,"out_EXECUTE_QUEUE_OUT_FLAGS        "+
283                      " <= internal_EXECUTE_QUEUE_OUT_FLAGS        ;");
284  vhdl->set_body   (0,"out_EXECUTE_QUEUE_OUT_EXCEPTION    "+
285                      " <= internal_EXECUTE_QUEUE_OUT_EXCEPTION    ;");
286  vhdl->set_body   (0,"out_EXECUTE_QUEUE_OUT_NO_SEQUENCE  "+
287                      " <= internal_EXECUTE_QUEUE_OUT_NO_SEQUENCE  ;");
288  vhdl->set_body   (0,"out_EXECUTE_QUEUE_OUT_ADDRESS      "+
289                      " <= internal_EXECUTE_QUEUE_OUT_ADDRESS      ;");
290  vhdl->set_body   (0,"out_EXECUTE_QUEUE_OUT_DATA         "+
291                      " <= internal_EXECUTE_QUEUE_OUT_DATA         ;");
292};
293\end{lstlisting}
294
295\subsubSection{Fichier Execute\_queue.vhdl}
296
297\lstparam{VHDL}
298\begin{lstlisting}[caption={Execute\_queue.cpp}]
299library ieee;
300  use ieee.numeric_bit.all;       
301  use ieee.numeric_std.all;       
302  use ieee.std_logic_1164.all;   
303  use ieee.std_logic_arith.all;   
304  use ieee.std_logic_misc.all;   
305--use ieee.std_logic_signed.all; 
306  use ieee.std_logic_unsigned.all;
307--use ieee.std_logic_textio.all; 
308
309library work;
310use work.Execute_queue_0_Pack.all;
311use work.Execute_queue_0_queue_Pack.all;
312
313entity Execute_queue_0 is
314  port (
315   in_CLOCK                           : in  std_logic;
316   in_NRESET                          : in  std_logic;
317   in_EXECUTE_QUEUE_IN_VAL            : in  std_logic;
318  out_EXECUTE_QUEUE_IN_ACK            : out std_logic;
319   in_EXECUTE_QUEUE_IN_CONTEXT_ID     : in  std_logic;
320   in_EXECUTE_QUEUE_IN_FRONT_END_ID   : in  std_logic;
321   in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID  : in  std_logic;
322   in_EXECUTE_QUEUE_IN_PACKET_ID      : in  std_logic_vector(5 downto 0);
323   in_EXECUTE_QUEUE_IN_FLAGS          : in  std_logic_vector(1 downto 0);
324   in_EXECUTE_QUEUE_IN_EXCEPTION      : in  std_logic_vector(4 downto 0);
325   in_EXECUTE_QUEUE_IN_NO_SEQUENCE    : in  std_logic;
326   in_EXECUTE_QUEUE_IN_ADDRESS        : in  std_logic_vector(31 downto 0);
327   in_EXECUTE_QUEUE_IN_DATA           : in  std_logic_vector(31 downto 0);
328  out_EXECUTE_QUEUE_OUT_VAL           : out std_logic;
329   in_EXECUTE_QUEUE_OUT_ACK           : in  std_logic;
330  out_EXECUTE_QUEUE_OUT_CONTEXT_ID    : out std_logic;
331  out_EXECUTE_QUEUE_OUT_FRONT_END_ID  : out std_logic;
332  out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID : out std_logic;
333  out_EXECUTE_QUEUE_OUT_PACKET_ID     : out std_logic_vector(5 downto 0);
334  out_EXECUTE_QUEUE_OUT_FLAGS         : out std_logic_vector(1 downto 0);
335  out_EXECUTE_QUEUE_OUT_EXCEPTION     : out std_logic_vector(4 downto 0);
336  out_EXECUTE_QUEUE_OUT_NO_SEQUENCE   : out std_logic;
337  out_EXECUTE_QUEUE_OUT_ADDRESS       : out std_logic_vector(31 downto 0);
338  out_EXECUTE_QUEUE_OUT_DATA          : out std_logic_vector(31 downto 0)
339  );
340end Execute_queue_0;
341
342architecture behavioural of Execute_queue_0 is
343
344  signal internal_QUEUE_INSERT_DATA              : std_logic_vector(80 downto 0);
345  signal internal_QUEUE_RETIRE_DATA              : std_logic_vector(80 downto 0);
346
347  alias internal_QUEUE_INSERT_VAL                : std_logic                     is
348          in_EXECUTE_QUEUE_IN_VAL;
349  alias internal_QUEUE_INSERT_ACK                : std_logic                     is
350         out_EXECUTE_QUEUE_IN_ACK;
351  alias internal_QUEUE_RETIRE_VAL                : std_logic                     is
352        out_EXECUTE_QUEUE_OUT_VAL;
353  alias internal_QUEUE_RETIRE_ACK                : std_logic                     is
354         in_EXECUTE_QUEUE_OUT_ACK;
355  alias internal_EXECUTE_QUEUE_OUT_CONTEXT_ID    : std_logic                     is
356        internal_QUEUE_RETIRE_DATA   (0);
357  alias internal_EXECUTE_QUEUE_OUT_FRONT_END_ID  : std_logic                     is
358        internal_QUEUE_RETIRE_DATA   (1);
359  alias internal_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID : std_logic                     is
360        internal_QUEUE_RETIRE_DATA   (2);
361  alias internal_EXECUTE_QUEUE_OUT_PACKET_ID     : std_logic_vector(5 downto 0)  is
362        internal_QUEUE_RETIRE_DATA   (8 downto 3);
363  alias internal_EXECUTE_QUEUE_OUT_FLAGS         : std_logic_vector(1 downto 0)  is
364        internal_QUEUE_RETIRE_DATA   (10 downto 9);
365  alias internal_EXECUTE_QUEUE_OUT_EXCEPTION     : std_logic_vector(4 downto 0)  is
366        internal_QUEUE_RETIRE_DATA   (15 downto 11);
367  alias internal_EXECUTE_QUEUE_OUT_NO_SEQUENCE   : std_logic                     is
368        internal_QUEUE_RETIRE_DATA   (16);
369  alias internal_EXECUTE_QUEUE_OUT_ADDRESS       : std_logic_vector(31 downto 0) is
370        internal_QUEUE_RETIRE_DATA   (48 downto 17);
371  alias internal_EXECUTE_QUEUE_OUT_DATA          : std_logic_vector(31 downto 0) is
372        internal_QUEUE_RETIRE_DATA   (80 downto 49);
373
374begin
375  --
376  -- -----------------------------------
377  -- -- Instance queue                 
378  -- -----------------------------------
379  --
380  instance_Execute_queue_0_queue : Execute_queue_0_queue
381  port map (
382            in_CLOCK              =>            in_CLOCK
383          , in_NRESET             =>            in_NRESET
384          , in_INSERT_VAL         =>      internal_QUEUE_INSERT_VAL
385          ,out_INSERT_ACK         =>      internal_QUEUE_INSERT_ACK
386          , in_INSERT_DATA        =>      internal_QUEUE_INSERT_DATA
387          ,out_RETIRE_VAL         =>      internal_QUEUE_RETIRE_VAL
388          , in_RETIRE_ACK         =>      internal_QUEUE_RETIRE_ACK
389          ,out_RETIRE_DATA        =>      internal_QUEUE_RETIRE_DATA
390  );
391  --
392  -- -----------------------------------
393  -- -- Input  Buffer                   
394  -- -----------------------------------
395  --
396  internal_QUEUE_INSERT_DATA (0)            <= in_EXECUTE_QUEUE_IN_CONTEXT_ID;
397  internal_QUEUE_INSERT_DATA (1)            <= in_EXECUTE_QUEUE_IN_FRONT_END_ID;
398  internal_QUEUE_INSERT_DATA (2)            <= in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID;
399  internal_QUEUE_INSERT_DATA (8 downto 3)   <= in_EXECUTE_QUEUE_IN_PACKET_ID;
400  internal_QUEUE_INSERT_DATA (10 downto 9)  <= in_EXECUTE_QUEUE_IN_FLAGS;
401  internal_QUEUE_INSERT_DATA (15 downto 11) <= in_EXECUTE_QUEUE_IN_EXCEPTION;
402  internal_QUEUE_INSERT_DATA (16)           <= in_EXECUTE_QUEUE_IN_NO_SEQUENCE;
403  internal_QUEUE_INSERT_DATA (48 downto 17) <= in_EXECUTE_QUEUE_IN_ADDRESS;
404  internal_QUEUE_INSERT_DATA (80 downto 49) <= in_EXECUTE_QUEUE_IN_DATA;
405  --
406  -- -----------------------------------
407  -- -- Output Buffer                   
408  -- -----------------------------------
409  --
410  out_EXECUTE_QUEUE_OUT_CONTEXT_ID    <= internal_EXECUTE_QUEUE_OUT_CONTEXT_ID;
411  out_EXECUTE_QUEUE_OUT_FRONT_END_ID  <= internal_EXECUTE_QUEUE_OUT_FRONT_END_ID;
412  out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID <= internal_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID;
413  out_EXECUTE_QUEUE_OUT_PACKET_ID     <= internal_EXECUTE_QUEUE_OUT_PACKET_ID;
414  out_EXECUTE_QUEUE_OUT_FLAGS         <= internal_EXECUTE_QUEUE_OUT_FLAGS;
415  out_EXECUTE_QUEUE_OUT_EXCEPTION     <= internal_EXECUTE_QUEUE_OUT_EXCEPTION;
416  out_EXECUTE_QUEUE_OUT_NO_SEQUENCE   <= internal_EXECUTE_QUEUE_OUT_NO_SEQUENCE;
417  out_EXECUTE_QUEUE_OUT_ADDRESS       <= internal_EXECUTE_QUEUE_OUT_ADDRESS;
418  out_EXECUTE_QUEUE_OUT_DATA          <= internal_EXECUTE_QUEUE_OUT_DATA;
419
420end behavioural;
421\end{lstlisting}
422
Note: See TracBrowser for help on using the repository browser.