source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/save/Functionnal_unit_0_07_04_09.vhdl @ 116

Last change on this file since 116 was 116, checked in by moulu, 15 years ago

1) added a generic multiplier (systemC isn't working with 8bits)
2) added a partial functionnal unit vhdl.

  • Property svn:keywords set to Id
File size: 36.9 KB
Line 
1-------------------------------------------------------------------------------
2-- File    : ./Functionnal_unit_0.vhdl
3-- Date    : Fri Mar 13 16:20:01 2009
4-- Version : 0.2.111 - Castor
5-- Comment : it's a autogenerated file, don't modify
6-------------------------------------------------------------------------------
7
8
9library ieee;
10  use ieee.numeric_bit.all;       
11  use ieee.numeric_std.all;       
12  use ieee.std_logic_1164.all;   
13  use ieee.std_logic_arith.all;   
14  use ieee.std_logic_misc.all;   
15--use ieee.std_logic_signed.all; 
16  use ieee.std_logic_unsigned.all;
17--use ieee.std_logic_textio.all; 
18
19
20library work;
21use work.Functionnal_unit_0_Pack.all;
22use work.Functionnal_unit_0_shifter_Pack.all;
23
24Library XilinxCoreLib;
25use XilinxCoreLib.c_compare_v9_0_comp.all;
26use XilinxCoreLib.mult_gen_v9_0_comp.all;
27
28entity Functionnal_unit_0 is
29        port (
30        in_CLOCK        : in     std_logic;
31        in_NRESET       : in     std_logic;
32        in_EXECUTE_IN_VAL       : in     std_logic;
33        out_EXECUTE_IN_ACK      : out    std_logic;
34        in_EXECUTE_IN_OOO_ENGINE_ID     : in     std_logic;
35        in_EXECUTE_IN_PACKET_ID : in     std_logic_vector(7 downto 0);
36        in_EXECUTE_IN_OPERATION : in     std_logic_vector(6 downto 0);
37        in_EXECUTE_IN_TYPE      : in     std_logic_vector(4 downto 0);
38        in_EXECUTE_IN_STORE_QUEUE_PTR_WRITE     : in     std_logic_vector(1 downto 0);
39        in_EXECUTE_IN_HAS_IMMEDIAT      : in     std_logic;
40        in_EXECUTE_IN_IMMEDIAT  : in     std_logic_vector(31 downto 0);
41        in_EXECUTE_IN_DATA_RA   : in     std_logic_vector(31 downto 0);
42        in_EXECUTE_IN_DATA_RB   : in     std_logic_vector(31 downto 0);
43        in_EXECUTE_IN_DATA_RC   : in     std_logic_vector(1 downto 0);
44        in_EXECUTE_IN_WRITE_RD  : in     std_logic;
45        in_EXECUTE_IN_NUM_REG_RD        : in     std_logic_vector(4 downto 0);
46        in_EXECUTE_IN_WRITE_RE  : in     std_logic;
47        in_EXECUTE_IN_NUM_REG_RE        : in     std_logic_vector(3 downto 0);
48        out_EXECUTE_OUT_VAL     : out    std_logic;
49        in_EXECUTE_OUT_ACK      : in     std_logic;
50        out_EXECUTE_OUT_OOO_ENGINE_ID   : out    std_logic;
51        out_EXECUTE_OUT_PACKET_ID       : out    std_logic_vector(7 downto 0);
52        out_EXECUTE_OUT_WRITE_RD        : out    std_logic;
53        out_EXECUTE_OUT_NUM_REG_RD      : out    std_logic_vector(4 downto 0);
54        out_EXECUTE_OUT_DATA_RD : out    std_logic_vector(31 downto 0);
55        out_EXECUTE_OUT_WRITE_RE        : out    std_logic;
56        out_EXECUTE_OUT_NUM_REG_RE      : out    std_logic_vector(3 downto 0);
57        out_EXECUTE_OUT_DATA_RE : out    std_logic_vector(1 downto 0);
58        out_EXECUTE_OUT_EXCEPTION       : out    std_logic_vector(4 downto 0);
59        out_EXECUTE_OUT_NO_SEQUENCE     : out    std_logic;
60        out_EXECUTE_OUT_ADDRESS : out    std_logic_vector(29 downto 0)
61             );
62end Functionnal_unit_0;
63
64architecture behavioural of Functionnal_unit_0 is
65        type Tmac       is array (1 downto 0) of std_logic_vector(31 downto 0);
66
67        signal sig_EXECUTE_IN_ACK       : std_logic;
68        signal reg_EXECUTE_IN_VAL       : std_logic;
69        signal reg_EXECUTE_IN_OOO_ENGINE_ID     : std_logic;
70        signal reg_EXECUTE_IN_PACKET_ID : std_logic_vector(7 downto 0);
71        signal reg_EXECUTE_IN_OPERATION : std_logic_vector(6 downto 0);
72        signal reg_EXECUTE_IN_TYPE      : std_logic_vector(4 downto 0);
73        signal reg_EXECUTE_IN_HAS_IMMEDIAT      : std_logic;
74        signal reg_EXECUTE_IN_IMMEDIAT  : std_logic_vector(31 downto 0);
75        signal reg_EXECUTE_IN_DATA_RA   : std_logic_vector(31 downto 0);
76        signal reg_EXECUTE_IN_DATA_RB   : std_logic_vector(31 downto 0);
77        signal reg_EXECUTE_IN_DATA_RC   : std_logic_vector(1 downto 0);
78        signal reg_EXECUTE_IN_WRITE_RD  : std_logic;
79        signal reg_EXECUTE_IN_NUM_REG_RD        : std_logic_vector(4 downto 0);
80        signal reg_EXECUTE_IN_WRITE_RE  : std_logic;
81        signal reg_EXECUTE_IN_NUM_REG_RE        : std_logic_vector(3 downto 0);
82        signal sig_B_OPERAND    : std_logic_vector(31 downto 0);
83        signal sig_IS_ARITH     : std_logic;
84        signal sig_IS_LOGIC     : std_logic;
85        signal sig_CIN_ARITH    : std_logic;
86        signal sig_ARITH_B_OPERAND      : std_logic_vector(31 downto 0);
87        signal sig_RES_ARITH    : std_logic_vector(32 downto 0);
88        signal sig_A_AND_B      : std_logic_vector(31 downto 0);
89        signal sig_A_OR_B       : std_logic_vector(31 downto 0);
90        signal sig_A_XOR_B      : std_logic_vector(31 downto 0);
91        signal sig_RES_LOGIC    : std_logic_vector(31 downto 0);
92        signal sig_RES_ALU      : std_logic_vector(31 downto 0);
93        signal sig_OVR_ALU      : std_logic;
94        signal sig_COUT_ALU     : std_logic;
95        signal sig_RES_MOVE     : std_logic_vector(31 downto 0);
96        signal sig_CMOV : std_logic_vector(31 downto 0);
97        signal sig_MOVHI        : std_logic_vector(31 downto 0);
98        signal sig_RES_BRANCH   : std_logic_vector(31 downto 0);
99        signal sig_ADDR_BRANCH  : std_logic_vector(29 downto 0);
100        signal sig_NOSQ_BRANCH  : std_logic;
101        signal sig_RES_SHIFTER  : std_logic_vector(31 downto 0);
102        signal sig_EXT_BYTE_S   : std_logic_vector(31 downto 0);
103        signal sig_EXT_BYTE_Z   : std_logic_vector(31 downto 0);
104        signal sig_EXT_HALF_WORD_S      : std_logic_vector(31 downto 0);
105        signal sig_EXT_HALF_WORD_Z      : std_logic_vector(31 downto 0);
106        signal sig_EXT_WORD_S   : std_logic_vector(31 downto 0);
107        signal sig_EXT_WORD_Z   : std_logic_vector(31 downto 0);
108        signal sig_EXT_S        : std_logic_vector(31 downto 0);
109        signal sig_EXT_Z        : std_logic_vector(31 downto 0);
110        signal sig_RES_EXTEND   : std_logic_vector(31 downto 0);
111        signal sig_FF1  : std_logic_vector(5 downto 0);
112        signal sig_FL1  : std_logic_vector(5 downto 0);
113        signal sig_RES_FIND     : std_logic_vector(31 downto 0);
114        signal sig_SPR_IS_HERE  : std_logic;
115        signal sig_MFSPR        : std_logic_vector(31 downto 0);
116        signal sig_MTSPR        : std_logic_vector(31 downto 0);
117        signal sig_RES_SPECIAL  : std_logic_vector(31 downto 0);
118        signal sig_EXECUTE_OUT_VAL      : std_logic;
119        signal sig_UPDATE       : std_logic;
120        signal reg_EXECUTE_OUT_VAL      : std_logic;
121        signal reg_EXECUTE_OUT_OOO_ENGINE_ID    : std_logic;
122        signal sig_EXECUTE_OUT_OOO_ENGINE_ID    : std_logic;
123        signal reg_EXECUTE_OUT_PACKET_ID        : std_logic_vector(7 downto 0);
124        signal sig_EXECUTE_OUT_PACKET_ID        : std_logic_vector(7 downto 0);
125        signal reg_EXECUTE_OUT_WRITE_RD : std_logic;
126        signal sig_EXECUTE_OUT_WRITE_RD : std_logic;
127        signal reg_EXECUTE_OUT_NUM_REG_RD       : std_logic_vector(4 downto 0);
128        signal sig_EXECUTE_OUT_NUM_REG_RD       : std_logic_vector(4 downto 0);
129        signal reg_EXECUTE_OUT_DATA_RD  : std_logic_vector(31 downto 0);
130        signal sig_EXECUTE_OUT_DATA_RD  : std_logic_vector(31 downto 0);
131        signal reg_EXECUTE_OUT_WRITE_RE : std_logic;
132        signal sig_EXECUTE_OUT_WRITE_RE : std_logic;
133        signal reg_EXECUTE_OUT_NUM_REG_RE       : std_logic_vector(3 downto 0);
134        signal sig_EXECUTE_OUT_NUM_REG_RE       : std_logic_vector(3 downto 0);
135        signal reg_EXECUTE_OUT_DATA_RE  : std_logic_vector(1 downto 0);
136        signal sig_EXECUTE_OUT_DATA_RE  : std_logic_vector(1 downto 0);
137        signal reg_EXECUTE_OUT_EXCEPTION        : std_logic_vector(4 downto 0);
138        signal sig_EXECUTE_OUT_EXCEPTION        : std_logic_vector(4 downto 0);
139        signal reg_EXECUTE_OUT_NO_SEQUENCE      : std_logic;
140        signal sig_EXECUTE_OUT_NO_SEQUENCE      : std_logic;
141        signal reg_EXECUTE_OUT_ADDRESS  : std_logic_vector(29 downto 0);
142        signal sig_EXECUTE_OUT_ADDRESS  : std_logic_vector(29 downto 0);
143        signal reg_MACLO                : Tmac;
144        signal reg_MACHI                : Tmac;
145
146        signal sig_VAL_5                : std_logic;
147        signal sig_VAL_0                : std_logic;
148        signal sig_NUM_REG_RE_0         : std_logic_vector(3 downto 0);
149        signal sig_WRITE_RE_0           : std_logic;
150        signal sig_NUM_REG_RD_0         : std_logic_vector(4 downto 0);
151        signal sig_WRITE_RD_0           : std_logic;
152        signal sig_TYPE_0               : std_logic_vector(4 downto 0);
153        signal sig_PACKET_ID_0          : std_logic_vector(7 downto 0);
154        signal sig_OOO_ENGINE_ID_0      : std_logic;
155
156        signal sig_IS_LESS      : std_logic;
157        signal sig_A_COMPARE    : std_logic_vector(31 downto 0);
158        signal sig_B_COMPARE    : std_logic_vector(31 downto 0);
159        signal sig_A_GT_B_S     : std_logic;
160        signal sig_A_GT_B_U     : std_logic;
161        signal sig_A_EQ_B       : std_logic;
162        signal sig_A_GT_B       : std_logic;
163        signal sig_A_GE_B       : std_logic;
164        signal sig_A_NE_B       : std_logic;
165        signal sig_IS_SIGNED    : std_logic;
166        signal sig_FLAG_F       : std_logic;
167        signal sig_BUSY         : std_logic;
168
169        signal sig_FULL_RES_MUL         : std_logic_vector (63 downto 0);
170        signal sig_FULL_RES_MULU        : std_logic_vector (63 downto 0);
171        signal sig_FULL_RES_MULS        : std_logic_vector (63 downto 0);
172        signal sig_RES_MUL              : std_logic_vector (31 downto 0);
173        signal sig_COUT_MUL             : std_logic;
174        signal sig_OVR_MUL              : std_logic;
175
176
177        type TFQUEUE    is array (6 downto 0) of std_logic_vector(25 downto 0);
178        -- OOO_ENGINE_ID(1) + PACKET_ID(8) + TYPE(5) + WRITE_RD(1) +
179        -- NUM_REG_RD(5) + WRITE_RE(1) + NUM_REG_RE(4) + VALID(1) = 26 BITS
180        signal reg_FUNCTIONAL_QUEUE             : TFQUEUE;
181
182
183        alias reg_OOO_ENGINE_ID_6       : std_logic     is reg_FUNCTIONAL_QUEUE(6)(25);
184        alias reg_PACKET_ID_6           : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(6)(24 downto 17);
185        alias reg_TYPE_6                : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(6)(16 downto 12);
186        alias reg_WRITE_RD_6            : std_logic     is reg_FUNCTIONAL_QUEUE(6)(11);
187        alias reg_NUM_REG_RD_6          : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(6)(10 downto 6);
188        alias reg_WRITE_RE_6            : std_logic     is reg_FUNCTIONAL_QUEUE(6)(5);
189        alias reg_NUM_REG_RE_6          : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(6)(4 downto 1);
190        alias reg_VAL_6                 : std_logic     is reg_FUNCTIONAL_QUEUE(6)(0);
191
192        alias reg_OOO_ENGINE_ID_5       : std_logic     is reg_FUNCTIONAL_QUEUE(5)(25);
193        alias reg_OOO_ENGINE_ID_4       : std_logic     is reg_FUNCTIONAL_QUEUE(4)(25);
194        alias reg_OOO_ENGINE_ID_3       : std_logic     is reg_FUNCTIONAL_QUEUE(3)(25);
195        alias reg_OOO_ENGINE_ID_2       : std_logic     is reg_FUNCTIONAL_QUEUE(2)(25);
196        alias reg_OOO_ENGINE_ID_1       : std_logic     is reg_FUNCTIONAL_QUEUE(1)(25);
197        alias reg_OOO_ENGINE_ID_0       : std_logic     is reg_FUNCTIONAL_QUEUE(0)(25);
198        alias reg_PACKET_ID_5           : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(5)(24 downto 17);
199        alias reg_PACKET_ID_4           : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(4)(24 downto 17);
200        alias reg_PACKET_ID_3           : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(3)(24 downto 17);
201        alias reg_PACKET_ID_2           : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(2)(24 downto 17);
202        alias reg_PACKET_ID_1           : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(1)(24 downto 17);
203        alias reg_PACKET_ID_0           : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(0)(24 downto 17);
204        alias reg_TYPE_5                : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(5)(16 downto 12);
205        alias reg_TYPE_4                : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(4)(16 downto 12);
206        alias reg_TYPE_3                : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(3)(16 downto 12);
207        alias reg_TYPE_2                : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(2)(16 downto 12);
208        alias reg_TYPE_1                : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(1)(16 downto 12);
209        alias reg_TYPE_0                : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(0)(16 downto 12);
210        alias reg_WRITE_RD_5            : std_logic     is reg_FUNCTIONAL_QUEUE(5)(11);
211        alias reg_WRITE_RD_4            : std_logic     is reg_FUNCTIONAL_QUEUE(4)(11);
212        alias reg_WRITE_RD_3            : std_logic     is reg_FUNCTIONAL_QUEUE(3)(11);
213        alias reg_WRITE_RD_2            : std_logic     is reg_FUNCTIONAL_QUEUE(2)(11);
214        alias reg_WRITE_RD_1            : std_logic     is reg_FUNCTIONAL_QUEUE(1)(11);
215        alias reg_WRITE_RD_0            : std_logic     is reg_FUNCTIONAL_QUEUE(0)(11);
216        alias reg_NUM_REG_RD_5          : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(5)(10 downto 6);
217        alias reg_NUM_REG_RD_4          : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(4)(10 downto 6);
218        alias reg_NUM_REG_RD_3          : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(3)(10 downto 6);
219        alias reg_NUM_REG_RD_2          : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(2)(10 downto 6);
220        alias reg_NUM_REG_RD_1          : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(1)(10 downto 6);
221        alias reg_NUM_REG_RD_0          : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(0)(10 downto 6);
222        alias reg_WRITE_RE_5            : std_logic     is reg_FUNCTIONAL_QUEUE(5)(5);
223        alias reg_WRITE_RE_4            : std_logic     is reg_FUNCTIONAL_QUEUE(4)(5);
224        alias reg_WRITE_RE_3            : std_logic     is reg_FUNCTIONAL_QUEUE(3)(5);
225        alias reg_WRITE_RE_2            : std_logic     is reg_FUNCTIONAL_QUEUE(2)(5);
226        alias reg_WRITE_RE_1            : std_logic     is reg_FUNCTIONAL_QUEUE(1)(5);
227        alias reg_WRITE_RE_0            : std_logic     is reg_FUNCTIONAL_QUEUE(0)(5);
228        alias reg_NUM_REG_RE_5          : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(5)(4 downto 1);
229        alias reg_NUM_REG_RE_4          : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(4)(4 downto 1);
230        alias reg_NUM_REG_RE_3          : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(3)(4 downto 1);
231        alias reg_NUM_REG_RE_2          : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(2)(4 downto 1);
232        alias reg_NUM_REG_RE_1          : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(1)(4 downto 1);
233        alias reg_NUM_REG_RE_0          : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(0)(4 downto 1);
234        alias reg_VAL_5                 : std_logic     is reg_FUNCTIONAL_QUEUE(5)(0);
235        alias reg_VAL_4                 : std_logic     is reg_FUNCTIONAL_QUEUE(4)(0);
236        alias reg_VAL_3                 : std_logic     is reg_FUNCTIONAL_QUEUE(3)(0);
237        alias reg_VAL_2                 : std_logic     is reg_FUNCTIONAL_QUEUE(2)(0);
238        alias reg_VAL_1                 : std_logic     is reg_FUNCTIONAL_QUEUE(1)(0);
239        alias reg_VAL_0                 : std_logic     is reg_FUNCTIONAL_QUEUE(0)(0);
240
241begin
242       
243        --
244        -- -----------------------------------
245        -- -- Registers                       
246        -- -----------------------------------
247        --
248
249        process (in_CLOCK)
250        begin
251          if in_CLOCK'event and in_CLOCK = '1' then
252            if (in_NRESET = '0') then
253              reg_EXECUTE_IN_VAL <= '0';
254              reg_EXECUTE_OUT_VAL <= '0';
255              reg_FUNCTIONAL_QUEUE(0) <= (others => '0');
256              reg_FUNCTIONAL_QUEUE(1) <= (others => '0');
257              reg_FUNCTIONAL_QUEUE(2) <= (others => '0');
258              reg_FUNCTIONAL_QUEUE(3) <= (others => '0');
259              reg_FUNCTIONAL_QUEUE(4) <= (others => '0');
260              reg_FUNCTIONAL_QUEUE(5) <= (others => '0');
261              reg_FUNCTIONAL_QUEUE(6) <= (others => '0');
262            else
263              -- Input
264              if (sig_EXECUTE_IN_ACK = '1') then
265                reg_EXECUTE_IN_VAL           <= in_EXECUTE_IN_VAL;
266                reg_EXECUTE_IN_NUM_REG_RE    <= in_EXECUTE_IN_NUM_REG_RE;
267                reg_EXECUTE_IN_WRITE_RE      <= in_EXECUTE_IN_WRITE_RE;
268                reg_EXECUTE_IN_NUM_REG_RD    <= in_EXECUTE_IN_NUM_REG_RD;
269                reg_EXECUTE_IN_WRITE_RD      <= in_EXECUTE_IN_WRITE_RD;
270                reg_EXECUTE_IN_DATA_RC       <= in_EXECUTE_IN_DATA_RC;
271                reg_EXECUTE_IN_DATA_RB       <= in_EXECUTE_IN_DATA_RB;
272                reg_EXECUTE_IN_DATA_RA       <= in_EXECUTE_IN_DATA_RA;
273                reg_EXECUTE_IN_IMMEDIAT      <= in_EXECUTE_IN_IMMEDIAT;
274                reg_EXECUTE_IN_HAS_IMMEDIAT  <= in_EXECUTE_IN_HAS_IMMEDIAT;
275                reg_EXECUTE_IN_TYPE          <= in_EXECUTE_IN_TYPE;
276                reg_EXECUTE_IN_OPERATION     <= in_EXECUTE_IN_OPERATION;
277                reg_EXECUTE_IN_PACKET_ID     <= in_EXECUTE_IN_PACKET_ID;
278                reg_EXECUTE_IN_OOO_ENGINE_ID <= in_EXECUTE_IN_OOO_ENGINE_ID;
279
280                reg_NUM_REG_RE_6    <= in_EXECUTE_IN_NUM_REG_RE;
281                reg_WRITE_RE_6      <= in_EXECUTE_IN_WRITE_RE;
282                reg_NUM_REG_RD_6    <= in_EXECUTE_IN_NUM_REG_RD;
283                reg_WRITE_RD_6      <= in_EXECUTE_IN_WRITE_RD;
284                reg_TYPE_6          <= in_EXECUTE_IN_TYPE;
285                reg_PACKET_ID_6     <= in_EXECUTE_IN_PACKET_ID;
286                reg_OOO_ENGINE_ID_6 <= in_EXECUTE_IN_OOO_ENGINE_ID;
287
288                -- Pipeline
289                if (in_EXECUTE_IN_TYPE = "00100") then
290                  reg_VAL_0           <= reg_VAL_1;
291                  reg_NUM_REG_RE_0    <= reg_NUM_REG_RE_1;
292                  reg_WRITE_RE_0      <= reg_WRITE_RE_1;
293                  reg_NUM_REG_RD_0    <= reg_NUM_REG_RD_1;
294                  reg_WRITE_RD_0      <= reg_WRITE_RD_1;
295                  reg_TYPE_0          <= reg_TYPE_1;
296                  reg_PACKET_ID_0     <= reg_PACKET_ID_1;
297                  reg_OOO_ENGINE_ID_0 <= reg_OOO_ENGINE_ID_1;
298
299                  reg_VAL_6           <= in_EXECUTE_IN_VAL;
300
301                else
302                  reg_VAL_0           <= in_EXECUTE_IN_VAL;
303                  reg_NUM_REG_RE_0    <= in_EXECUTE_IN_NUM_REG_RE;
304                  reg_WRITE_RE_0      <= in_EXECUTE_IN_WRITE_RE;
305                  reg_NUM_REG_RD_0    <= in_EXECUTE_IN_NUM_REG_RD;
306                  reg_WRITE_RD_0      <= in_EXECUTE_IN_WRITE_RD;
307                  reg_TYPE_0          <= in_EXECUTE_IN_TYPE;
308                  reg_PACKET_ID_0     <= in_EXECUTE_IN_PACKET_ID;
309                  reg_OOO_ENGINE_ID_0 <= in_EXECUTE_IN_OOO_ENGINE_ID;
310
311                  reg_VAL_6           <= '0';
312
313                end if;
314              end if;
315              if (sig_UPDATE = '1') then
316
317                reg_VAL_1           <= reg_VAL_2;
318                reg_NUM_REG_RE_1    <= reg_NUM_REG_RE_2;
319                reg_WRITE_RE_1      <= reg_WRITE_RE_2;
320                reg_NUM_REG_RD_1    <= reg_NUM_REG_RD_2;
321                reg_WRITE_RD_1      <= reg_WRITE_RD_2;
322                reg_TYPE_1          <= reg_TYPE_2;
323                reg_PACKET_ID_1     <= reg_PACKET_ID_2;
324                reg_OOO_ENGINE_ID_1 <= reg_OOO_ENGINE_ID_2;
325
326                reg_VAL_2           <= reg_VAL_3;
327                reg_NUM_REG_RE_2    <= reg_NUM_REG_RE_3;
328                reg_WRITE_RE_2      <= reg_WRITE_RE_3;
329                reg_NUM_REG_RD_2    <= reg_NUM_REG_RD_3;
330                reg_WRITE_RD_2      <= reg_WRITE_RD_3;
331                reg_TYPE_2          <= reg_TYPE_3;
332                reg_PACKET_ID_2     <= reg_PACKET_ID_3;
333                reg_OOO_ENGINE_ID_2 <= reg_OOO_ENGINE_ID_3;
334
335                reg_VAL_3           <= reg_VAL_4;
336                reg_NUM_REG_RE_3    <= reg_NUM_REG_RE_4;
337                reg_WRITE_RE_3      <= reg_WRITE_RE_4;
338                reg_NUM_REG_RD_3    <= reg_NUM_REG_RD_4;
339                reg_WRITE_RD_3      <= reg_WRITE_RD_4;
340                reg_TYPE_3          <= reg_TYPE_4;
341                reg_PACKET_ID_3     <= reg_PACKET_ID_4;
342                reg_OOO_ENGINE_ID_3 <= reg_OOO_ENGINE_ID_4;
343
344                reg_VAL_4           <= reg_VAL_5;
345                reg_NUM_REG_RE_4    <= reg_NUM_REG_RE_5;
346                reg_WRITE_RE_4      <= reg_WRITE_RE_5;
347                reg_NUM_REG_RD_4    <= reg_NUM_REG_RD_5;
348                reg_WRITE_RD_4      <= reg_WRITE_RD_5;
349                reg_TYPE_4          <= reg_TYPE_5;
350                reg_PACKET_ID_4     <= reg_PACKET_ID_5;
351                reg_OOO_ENGINE_ID_4 <= reg_OOO_ENGINE_ID_5;
352
353                reg_VAL_5           <= reg_VAL_6;
354                reg_NUM_REG_RE_5    <= reg_NUM_REG_RE_6;
355                reg_WRITE_RE_5      <= reg_WRITE_RE_6;
356                reg_NUM_REG_RD_5    <= reg_NUM_REG_RD_6;
357                reg_WRITE_RD_5      <= reg_WRITE_RD_6;
358                reg_TYPE_5          <= reg_TYPE_6;
359                reg_PACKET_ID_5     <= reg_PACKET_ID_6;
360                reg_OOO_ENGINE_ID_5 <= reg_OOO_ENGINE_ID_6;
361
362                -- Output
363                reg_EXECUTE_OUT_VAL <= reg_VAL_0;
364                reg_EXECUTE_OUT_OOO_ENGINE_ID <= sig_EXECUTE_OUT_OOO_ENGINE_ID;
365                reg_EXECUTE_OUT_PACKET_ID <= sig_EXECUTE_OUT_PACKET_ID;
366                reg_EXECUTE_OUT_WRITE_RD <=  sig_EXECUTE_OUT_WRITE_RD;
367                reg_EXECUTE_OUT_NUM_REG_RD <= sig_EXECUTE_OUT_NUM_REG_RD;
368                reg_EXECUTE_OUT_DATA_RD <= sig_EXECUTE_OUT_DATA_RD;
369                reg_EXECUTE_OUT_WRITE_RE <= sig_EXECUTE_OUT_WRITE_RE;
370                reg_EXECUTE_OUT_NUM_REG_RE <= sig_EXECUTE_OUT_NUM_REG_RE;
371                reg_EXECUTE_OUT_DATA_RE <= sig_EXECUTE_OUT_DATA_RE;
372                reg_EXECUTE_OUT_EXCEPTION <= sig_EXECUTE_OUT_EXCEPTION;
373                reg_EXECUTE_OUT_NO_SEQUENCE <= sig_EXECUTE_OUT_NO_SEQUENCE;
374                reg_EXECUTE_OUT_ADDRESS <= sig_EXECUTE_OUT_ADDRESS;
375              end if;
376            end if;
377          end if;
378        end process;
379       
380        --
381        -- -----------------------------------
382        -- -- Insides                         
383        -- -----------------------------------
384        --
385       
386--      sig_VAL_0 <= in_EXECUTE_IN_VAL when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
387--              reg_VAL_1;
388--      sig_NUM_REG_RE_0 <= in_EXECUTE_IN_NUM_REG_RE when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
389--              reg_NUM_REG_RE_1;
390--      sig_WRITE_RE_0 <= in_EXECUTE_IN_WRITE_RE when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
391--              reg_WRITE_RE_1;
392--      sig_NUM_REG_RD_0 <= in_EXECUTE_IN_NUM_REG_RD when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
393--              reg_NUM_REG_RD_1;
394--      sig_WRITE_RD_0 <= in_EXECUTE_IN_WRITE_RD when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
395--              reg_WRITE_RD_1;
396--      sig_TYPE_0 <= in_EXECUTE_IN_TYPE when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
397--              reg_TYPE_1;
398--      sig_PACKET_ID_0 <= in_EXECUTE_IN_PACKET_ID when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
399--              reg_PACKET_ID_1;
400--      sig_OOO_ENGINE_ID_0 <= in_EXECUTE_IN_OOO_ENGINE_ID when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
401--              reg_OOO_ENGINE_ID_1;
402
403--      sig_VAL_5 <= reg_EXECUTE_IN_VAL when (reg_EXECUTE_IN_TYPE = "00100") else
404--              '0';
405
406        sig_B_OPERAND <= reg_EXECUTE_IN_IMMEDIAT when (reg_EXECUTE_IN_HAS_IMMEDIAT = '1') else
407                reg_EXECUTE_IN_DATA_RB;
408        --
409        -- ALU
410        --
411        sig_IS_ARITH <= reg_EXECUTE_IN_OPERATION(0) or reg_EXECUTE_IN_OPERATION(1) or reg_EXECUTE_IN_OPERATION(2);
412        sig_IS_LOGIC <= reg_EXECUTE_IN_OPERATION(3) or reg_EXECUTE_IN_OPERATION(4) or reg_EXECUTE_IN_OPERATION(5);
413        sig_CIN_ARITH <= reg_EXECUTE_IN_DATA_RC(1) and reg_EXECUTE_IN_OPERATION(1);
414        sig_ARITH_B_OPERAND <= ((not sig_B_OPERAND) + 1) when (reg_EXECUTE_IN_OPERATION(2) = '1') else
415                sig_B_OPERAND;
416        sig_RES_ARITH <= ('0' & reg_EXECUTE_IN_DATA_RA) + ('0' & sig_ARITH_B_OPERAND) + ("000000000000000000000000000000" & sig_CIN_ARITH);
417       
418        sig_A_AND_B <= reg_EXECUTE_IN_DATA_RA and sig_B_OPERAND;
419        sig_A_OR_B <= reg_EXECUTE_IN_DATA_RA or sig_B_OPERAND;
420        sig_A_XOR_B <= reg_EXECUTE_IN_DATA_RA xor sig_B_OPERAND;
421       
422        with reg_EXECUTE_IN_OPERATION select
423        sig_RES_LOGIC <=
424                sig_A_AND_B when "0001000",
425                sig_A_OR_B  when "0010000",
426                sig_A_XOR_B when "0100000",
427                "00000000000000000000000000000000" when others;
428        sig_RES_ALU <=
429                sig_RES_ARITH (31 downto 0) when (sig_IS_ARITH = '1') else
430                sig_RES_LOGIC when (sig_IS_LOGIC = '1') else
431                "00000000000000000000000000000000";
432       
433        -- In ISA l.sub doesn't change carry flag.
434        sig_COUT_ALU <= (sig_RES_ARITH(32) and (reg_EXECUTE_IN_OPERATION(0) or reg_EXECUTE_IN_OPERATION(1))) or (reg_EXECUTE_IN_OPERATION(2) and reg_EXECUTE_IN_DATA_RC(1));
435        sig_OVR_ALU <= ((sig_ARITH_B_OPERAND(31) and reg_EXECUTE_IN_DATA_RA(31) and not sig_RES_ARITH(31)) or (not sig_ARITH_B_OPERAND(31) and not reg_EXECUTE_IN_DATA_RA(31) and sig_RES_ARITH(31))) and sig_IS_ARITH;
436       
437        --
438        -- MOVE
439        --
440        sig_MOVHI <= reg_EXECUTE_IN_IMMEDIAT(15 downto 0) & "0000000000000000";
441        sig_CMOV <=
442                reg_EXECUTE_IN_DATA_RA when (reg_EXECUTE_IN_DATA_RC(0) = '1') else
443                reg_EXECUTE_IN_DATA_RB;
444        sig_RES_MOVE <=
445                sig_MOVHI when (reg_EXECUTE_IN_OPERATION(0) = '1') else
446                sig_CMOV when (reg_EXECUTE_IN_OPERATION(1) = '1') else
447                "00000000000000000000000000000000";
448       
449        --
450        -- TEST
451        --
452        sig_IS_LESS <= reg_EXECUTE_IN_OPERATION(3);
453        sig_A_COMPARE <=
454                sig_B_OPERAND when (sig_IS_LESS = '1') else
455                reg_EXECUTE_IN_DATA_RA;
456
457        sig_B_COMPARE <=
458                reg_EXECUTE_IN_DATA_RA when (sig_IS_LESS = '1') else
459                sig_B_OPERAND;
460
461        a_gt_b_s : c_compare_v9_0
462          generic map (
463            c_width      => 32,
464            c_data_type  => 0,                -- 0 = signed, 1 = unsigned
465            c_has_a_eq_b => 0,
466            c_has_a_gt_b => 1)
467          port map (
468            a => sig_A_COMPARE,
469            b => sig_B_COMPARE,
470            a_gt_b => sig_A_GT_B_S);
471
472        a_gt_b_u : c_compare_v9_0
473          generic map (
474            c_width      => 32,
475            c_data_type  => 1,                -- 0 = signed, 1 = unsigned
476            c_has_a_eq_b => 0,
477            c_has_a_gt_b => 1)
478          port map (
479            a => sig_A_COMPARE,
480            b => sig_B_COMPARE,
481            a_gt_b => sig_A_GT_B_U);
482
483        a_eq_b : c_compare_v9_0
484          generic map (                       -- sign doesn't matter for
485                                              -- equality test
486            c_width      => 32,
487            c_has_a_eq_b => 1,
488            c_has_a_gt_b => 0)
489          port map (
490            a => sig_A_COMPARE,
491            b => sig_B_COMPARE,
492            a_eq_b => sig_A_EQ_B);
493
494        sig_IS_SIGNED <= reg_EXECUTE_IN_OPERATION(6);
495        sig_A_GT_B <=
496                sig_A_GT_B_S when (sig_IS_SIGNED = '1') else
497                sig_A_GT_B_U;
498        sig_A_GE_B <= sig_A_GT_B or sig_A_EQ_B;
499        sig_A_NE_B <= not sig_A_EQ_B;
500       
501        sig_FLAG_F <=
502                (sig_A_EQ_B and reg_EXECUTE_IN_OPERATION(4)) or
503                (sig_A_NE_B and reg_EXECUTE_IN_OPERATION(5)) or
504                (sig_A_GE_B and reg_EXECUTE_IN_OPERATION(0)) or
505                (sig_A_GT_B and reg_EXECUTE_IN_OPERATION(1));
506       
507        --
508        -- MULT
509        --
510        signed_multiplier : mult_gen_v9_0
511          generic map (
512            c_xdevicefamily => "virtex4",  -- specifies target Xilinx FPGA name
513            c_a_width       => 32,         -- width of A port
514            c_a_type        => 0,          -- datatype of A port
515            c_b_width       => 32,         -- width of B port
516            c_b_type        => 0,          -- datatype of B port
517            c_out_high      => 63,         -- MSB of P output port (N-1 downto 0 convention)
518            c_mult_type     => 1,          -- Type of multiplier to implement
519            c_opt_goal      => 1,          -- Optimization of multiplier
520            c_has_ce        => 1,          -- Use clock enable on all registers
521            c_pipe_stages   => 6           -- Number of register stages required
522            )
523          port map (
524            clk => in_CLOCK,
525            a   => reg_EXECUTE_IN_DATA_RA,
526            b   => sig_B_OPERAND,
527            ce  => sig_UPDATE,
528            p   => sig_FULL_RES_MULS
529            );
530
531        unsigned_multiplier : mult_gen_v9_0
532          generic map (
533            c_xdevicefamily => "virtex4",  -- specifies target Xilinx FPGA name
534            c_a_width       => 32,         -- width of A port
535            c_a_type        => 1,          -- datatype of A port
536            c_b_width       => 32,         -- width of B port
537            c_b_type        => 1,          -- datatype of B port
538            c_out_high      => 63,         -- MSB of P output port (N-1 downto 0 convention)
539            c_mult_type     => 1,          -- Type of multiplier to implement
540            c_opt_goal      => 1,          -- Optimization of multiplier
541            c_has_ce        => 1,          -- Use clock enable on all registers
542            c_pipe_stages   => 6           -- Number of register stages required
543            )
544          port map (
545            clk => in_CLOCK,
546            a   => reg_EXECUTE_IN_DATA_RA,
547            b   => sig_B_OPERAND,
548            ce  => sig_UPDATE,
549            p   => sig_FULL_RES_MULU
550            );
551
552        sig_FULL_RES_MUL <=
553                sig_FULL_RES_MULS when (reg_EXECUTE_IN_OPERATION(0) = '1') else
554                sig_FULL_RES_MULU;
555
556        sig_RES_MUL <= sig_FULL_RES_MUL (31 downto 0);
557
558        sig_COUT_MUL <= sig_FULL_RES_MUL(63) or sig_FULL_RES_MUL(62) or sig_FULL_RES_MUL(61) or sig_FULL_RES_MUL(60) or
559                        sig_FULL_RES_MUL(59) or sig_FULL_RES_MUL(58) or sig_FULL_RES_MUL(57) or sig_FULL_RES_MUL(56) or
560                        sig_FULL_RES_MUL(55) or sig_FULL_RES_MUL(54) or sig_FULL_RES_MUL(53) or sig_FULL_RES_MUL(52) or
561                        sig_FULL_RES_MUL(51) or sig_FULL_RES_MUL(50) or sig_FULL_RES_MUL(49) or sig_FULL_RES_MUL(48) or
562                        sig_FULL_RES_MUL(47) or sig_FULL_RES_MUL(46) or sig_FULL_RES_MUL(45) or sig_FULL_RES_MUL(44) or
563                        sig_FULL_RES_MUL(43) or sig_FULL_RES_MUL(42) or sig_FULL_RES_MUL(41) or sig_FULL_RES_MUL(40) or
564                        sig_FULL_RES_MUL(39) or sig_FULL_RES_MUL(38) or sig_FULL_RES_MUL(37) or sig_FULL_RES_MUL(36) or
565                        sig_FULL_RES_MUL(35) or sig_FULL_RES_MUL(34) or sig_FULL_RES_MUL(33) or sig_FULL_RES_MUL(32);
566
567        sig_OVR_MUL <= sig_COUT_MUL;
568
569        --
570        -- BRANCH
571        --
572        sig_NOSQ_BRANCH <= (reg_EXECUTE_IN_DATA_RC(0) and reg_EXECUTE_IN_OPERATION(2)) or (not reg_EXECUTE_IN_DATA_RC(0) and reg_EXECUTE_IN_OPERATION(1)) or reg_EXECUTE_IN_OPERATION(3);
573        sig_RES_BRANCH <=
574                reg_EXECUTE_IN_IMMEDIAT(29 downto 0) & "00"when (reg_EXECUTE_IN_OPERATION(3) = '1') else
575                "00000000000000000000000000000000";
576        sig_ADDR_BRANCH <=
577                reg_EXECUTE_IN_DATA_RB(31 downto 2) when (reg_EXECUTE_IN_OPERATION(3) = '1') else
578                reg_EXECUTE_IN_IMMEDIAT(29 downto 0);
579       
580        --
581        -- SHIFTER
582        --
583        -- Instance shifter
584        instance_Functionnal_unit_0_shifter : Functionnal_unit_0_shifter
585        port map (
586                  in_SHIFTER_0_DATA             =>      reg_EXECUTE_IN_DATA_RA
587                , in_SHIFTER_0_SHIFT            =>      sig_B_OPERAND(4 downto 0)
588                , in_SHIFTER_0_DIRECTION        =>      reg_EXECUTE_IN_OPERATION(0)
589                , in_SHIFTER_0_TYPE             =>      reg_EXECUTE_IN_OPERATION(1)
590                , in_SHIFTER_0_CARRY            =>      reg_EXECUTE_IN_OPERATION(2)
591                ,out_SHIFTER_0_DATA             =>      sig_RES_SHIFTER
592        );
593       
594       
595        --
596        -- EXTEND
597        --
598        sig_EXT_BYTE_S <=
599                "111111111111111111111111" & reg_EXECUTE_IN_DATA_RA (7 downto 0) when (reg_EXECUTE_IN_DATA_RA (7) = '1') else
600                "000000000000000000000000" & reg_EXECUTE_IN_DATA_RA (7 downto 0);
601       
602        sig_EXT_BYTE_Z <=
603                "000000000000000000000000" & reg_EXECUTE_IN_DATA_RA (7 downto 0);
604       
605        sig_EXT_HALF_WORD_S <=
606                "1111111111111111" & reg_EXECUTE_IN_DATA_RA (15 downto 0) when (reg_EXECUTE_IN_DATA_RA (15) = '1') else
607                "0000000000000000" & reg_EXECUTE_IN_DATA_RA (15 downto 0);
608       
609        sig_EXT_HALF_WORD_Z <=
610                "0000000000000000" & reg_EXECUTE_IN_DATA_RA (15 downto 0);
611       
612        sig_EXT_WORD_S <=
613                "" & reg_EXECUTE_IN_DATA_RA (31 downto 0) when (reg_EXECUTE_IN_DATA_RA (31) = '1') else
614                "" & reg_EXECUTE_IN_DATA_RA (31 downto 0);
615       
616        sig_EXT_WORD_Z <=
617                "" & reg_EXECUTE_IN_DATA_RA (31 downto 0);
618       
619        sig_EXT_S <=
620                sig_EXT_BYTE_S      when (reg_EXECUTE_IN_IMMEDIAT = 8)  else
621                sig_EXT_HALF_WORD_S when (reg_EXECUTE_IN_IMMEDIAT = 16) else
622                sig_EXT_WORD_S;
623       
624        sig_EXT_Z <=
625                sig_EXT_BYTE_Z      when (reg_EXECUTE_IN_IMMEDIAT = 8)  else
626                sig_EXT_HALF_WORD_Z when (reg_EXECUTE_IN_IMMEDIAT = 16) else
627                sig_EXT_WORD_Z;
628       
629        sig_RES_EXTEND <=
630                sig_EXT_Z      when (reg_EXECUTE_IN_OPERATION(0) = '1')  else
631                sig_EXT_S;
632       
633       
634        --
635        -- FIND
636        --
637        sig_FF1 <=
638                "000001"        when (reg_EXECUTE_IN_DATA_RA (0) = '1')         else
639                "000010"        when (reg_EXECUTE_IN_DATA_RA (1) = '1')         else
640                "000011"        when (reg_EXECUTE_IN_DATA_RA (2) = '1')         else
641                "000100"        when (reg_EXECUTE_IN_DATA_RA (3) = '1')         else
642                "000101"        when (reg_EXECUTE_IN_DATA_RA (4) = '1')         else
643                "000110"        when (reg_EXECUTE_IN_DATA_RA (5) = '1')         else
644                "000111"        when (reg_EXECUTE_IN_DATA_RA (6) = '1')         else
645                "001000"        when (reg_EXECUTE_IN_DATA_RA (7) = '1')         else
646                "001001"        when (reg_EXECUTE_IN_DATA_RA (8) = '1')         else
647                "001010"        when (reg_EXECUTE_IN_DATA_RA (9) = '1')         else
648                "001011"        when (reg_EXECUTE_IN_DATA_RA (10) = '1')        else
649                "001100"        when (reg_EXECUTE_IN_DATA_RA (11) = '1')        else
650                "001101"        when (reg_EXECUTE_IN_DATA_RA (12) = '1')        else
651                "001110"        when (reg_EXECUTE_IN_DATA_RA (13) = '1')        else
652                "001111"        when (reg_EXECUTE_IN_DATA_RA (14) = '1')        else
653                "010000"        when (reg_EXECUTE_IN_DATA_RA (15) = '1')        else
654                "010001"        when (reg_EXECUTE_IN_DATA_RA (16) = '1')        else
655                "010010"        when (reg_EXECUTE_IN_DATA_RA (17) = '1')        else
656                "010011"        when (reg_EXECUTE_IN_DATA_RA (18) = '1')        else
657                "010100"        when (reg_EXECUTE_IN_DATA_RA (19) = '1')        else
658                "010101"        when (reg_EXECUTE_IN_DATA_RA (20) = '1')        else
659                "010110"        when (reg_EXECUTE_IN_DATA_RA (21) = '1')        else
660                "010111"        when (reg_EXECUTE_IN_DATA_RA (22) = '1')        else
661                "011000"        when (reg_EXECUTE_IN_DATA_RA (23) = '1')        else
662                "011001"        when (reg_EXECUTE_IN_DATA_RA (24) = '1')        else
663                "011010"        when (reg_EXECUTE_IN_DATA_RA (25) = '1')        else
664                "011011"        when (reg_EXECUTE_IN_DATA_RA (26) = '1')        else
665                "011100"        when (reg_EXECUTE_IN_DATA_RA (27) = '1')        else
666                "011101"        when (reg_EXECUTE_IN_DATA_RA (28) = '1')        else
667                "011110"        when (reg_EXECUTE_IN_DATA_RA (29) = '1')        else
668                "011111"        when (reg_EXECUTE_IN_DATA_RA (30) = '1')        else
669                "100000"        when (reg_EXECUTE_IN_DATA_RA (31) = '1')        else
670                "000000";
671       
672        sig_FL1 <=
673                "100000"        when (reg_EXECUTE_IN_DATA_RA (31) = '1')        else
674                "011111"        when (reg_EXECUTE_IN_DATA_RA (30) = '1')        else
675                "011110"        when (reg_EXECUTE_IN_DATA_RA (29) = '1')        else
676                "011101"        when (reg_EXECUTE_IN_DATA_RA (28) = '1')        else
677                "011100"        when (reg_EXECUTE_IN_DATA_RA (27) = '1')        else
678                "011011"        when (reg_EXECUTE_IN_DATA_RA (26) = '1')        else
679                "011010"        when (reg_EXECUTE_IN_DATA_RA (25) = '1')        else
680                "011001"        when (reg_EXECUTE_IN_DATA_RA (24) = '1')        else
681                "011000"        when (reg_EXECUTE_IN_DATA_RA (23) = '1')        else
682                "010111"        when (reg_EXECUTE_IN_DATA_RA (22) = '1')        else
683                "010110"        when (reg_EXECUTE_IN_DATA_RA (21) = '1')        else
684                "010101"        when (reg_EXECUTE_IN_DATA_RA (20) = '1')        else
685                "010100"        when (reg_EXECUTE_IN_DATA_RA (19) = '1')        else
686                "010011"        when (reg_EXECUTE_IN_DATA_RA (18) = '1')        else
687                "010010"        when (reg_EXECUTE_IN_DATA_RA (17) = '1')        else
688                "010001"        when (reg_EXECUTE_IN_DATA_RA (16) = '1')        else
689                "010000"        when (reg_EXECUTE_IN_DATA_RA (15) = '1')        else
690                "001111"        when (reg_EXECUTE_IN_DATA_RA (14) = '1')        else
691                "001110"        when (reg_EXECUTE_IN_DATA_RA (13) = '1')        else
692                "001101"        when (reg_EXECUTE_IN_DATA_RA (12) = '1')        else
693                "001100"        when (reg_EXECUTE_IN_DATA_RA (11) = '1')        else
694                "001011"        when (reg_EXECUTE_IN_DATA_RA (10) = '1')        else
695                "001010"        when (reg_EXECUTE_IN_DATA_RA (9) = '1')         else
696                "001001"        when (reg_EXECUTE_IN_DATA_RA (8) = '1')         else
697                "001000"        when (reg_EXECUTE_IN_DATA_RA (7) = '1')         else
698                "000111"        when (reg_EXECUTE_IN_DATA_RA (6) = '1')         else
699                "000110"        when (reg_EXECUTE_IN_DATA_RA (5) = '1')         else
700                "000101"        when (reg_EXECUTE_IN_DATA_RA (4) = '1')         else
701                "000100"        when (reg_EXECUTE_IN_DATA_RA (3) = '1')         else
702                "000011"        when (reg_EXECUTE_IN_DATA_RA (2) = '1')         else
703                "000010"        when (reg_EXECUTE_IN_DATA_RA (1) = '1')         else
704                "000001"        when (reg_EXECUTE_IN_DATA_RA (0) = '1')         else
705                "000000";
706       
707        sig_RES_FIND <=
708                "00000000000000000000000000"&sig_FF1      when (reg_EXECUTE_IN_OPERATION(0) = '1')  else
709                "00000000000000000000000000"&sig_FL1;
710       
711       
712        --
713        -- SPECIAL
714        --
715        sig_SPR_IS_HERE <=
716                '1' when (sig_A_OR_B(15 downto 0) = "00101") else
717                '0';
718        -- MFSPR
719        sig_MFSPR <=
720                reg_MACLO(0) when (sig_SPR_IS_HERE = '1' and sig_A_OR_B(10 downto 0) = "00000000001") else
721                reg_MACHI(0) when (sig_SPR_IS_HERE = '1' and sig_A_OR_B(10 downto 0) = "00000000010") else
722                "00000000000000000000000000000000";
723       
724       
725        -- MTSPR
726        process (in_CLOCK)
727        begin
728                if in_CLOCK'event and in_CLOCK = '1' then
729                        if (sig_SPR_IS_HERE = '1') then
730                                if (sig_A_OR_B(10 downto 0) = "00000000001") then
731                                        reg_MACLO(0) <= reg_EXECUTE_IN_DATA_RB;
732                                end if;
733                                if (sig_A_OR_B(10 downto 0) = "00000000010") then
734                                        reg_MACHI(0) <= reg_EXECUTE_IN_DATA_RB;
735                                end if;
736                        end if;
737                end if;
738        end process;
739       
740        sig_RES_SPECIAL <=
741                sig_MFSPR when (reg_EXECUTE_IN_OPERATION = "0000001")  else
742                reg_EXECUTE_IN_DATA_RB when (reg_EXECUTE_IN_OPERATION = "0000010")  else
743                "00000000000000000000000000000000";
744       
745        --
746        -- TRANSACTION
747        --
748        sig_BUSY <=
749--              reg_FUNCTIONAL_QUEUE(34)(0) when in_EXECUTE_IN_OPERATION = "" else
750                reg_VAL_6  when in_EXECUTE_IN_TYPE = "00100" else
751                reg_VAL_0;
752        sig_EXECUTE_OUT_VAL <= reg_EXECUTE_OUT_VAL;
753        sig_UPDATE <= not reg_EXECUTE_OUT_VAL or in_EXECUTE_OUT_ACK;
754        sig_EXECUTE_IN_ACK <= not sig_BUSY or sig_UPDATE;
755       
756        --
757        -- -----------------------------------
758        -- -- Output Buffer Signals
759        -- -----------------------------------
760        --
761       
762        sig_EXECUTE_OUT_OOO_ENGINE_ID <= reg_OOO_ENGINE_ID_0;
763        sig_EXECUTE_OUT_PACKET_ID <= reg_PACKET_ID_0;
764        sig_EXECUTE_OUT_WRITE_RD <=  reg_WRITE_RD_0;
765        sig_EXECUTE_OUT_NUM_REG_RD <= reg_NUM_REG_RD_0;
766        with reg_TYPE_0 select
767        sig_EXECUTE_OUT_DATA_RD <=
768                sig_RES_ALU when "00000",
769                sig_RES_MOVE when "00010",
770                sig_RES_BRANCH when "01010",
771                sig_RES_SHIFTER when "00001",
772                sig_RES_EXTEND when "00110",
773                sig_RES_FIND when "00111",
774                sig_RES_MUL when "00100",
775                sig_RES_SPECIAL when "01000",
776                "00000000000000000000000000000000" when others;
777        sig_EXECUTE_OUT_WRITE_RE <= reg_WRITE_RE_0;
778        sig_EXECUTE_OUT_NUM_REG_RE <= reg_NUM_REG_RE_0;
779        with reg_TYPE_0 select
780        sig_EXECUTE_OUT_DATA_RE <=
781                sig_COUT_ALU & sig_OVR_ALU when "00000",
782                sig_COUT_MUL & sig_OVR_MUL when "00100",
783                '0' & sig_FLAG_F when "00011",
784                "00" when others;
785        sig_EXECUTE_OUT_EXCEPTION <=
786                "01011" when (reg_TYPE_0 = "00000" and sig_OVR_ALU = '1') else
787                "01011" when (reg_TYPE_0 = "00100" and sig_OVR_MUL = '1') else
788--              "10011" when (reg_TYPE_1 = "01000" and reg_OPERATION_1 = "0000001" and sig_SPR_IS_HERE = '0') else
789--              "10100" when (reg_TYPE_1 = "01000" and reg_OPERATION_1 = "0000010" and sig_SPR_IS_HERE = '0') else
790                "00000";
791        with reg_TYPE_0 select
792        sig_EXECUTE_OUT_NO_SEQUENCE <=
793                sig_NOSQ_BRANCH when "01010",
794                '0'when others;
795        with reg_TYPE_0 select
796        sig_EXECUTE_OUT_ADDRESS <=
797                sig_ADDR_BRANCH when "01010",
798                sig_A_OR_B(29 downto 0) when "01000",
799                "000000000000000000000000000000" when others;
800       
801        --
802        -- -----------------------------------
803        -- -- Outputs                         
804        -- -----------------------------------
805        --
806       
807        out_EXECUTE_OUT_OOO_ENGINE_ID <= reg_EXECUTE_OUT_OOO_ENGINE_ID;
808        out_EXECUTE_OUT_PACKET_ID <= reg_EXECUTE_OUT_PACKET_ID;
809        out_EXECUTE_OUT_WRITE_RD <=  reg_EXECUTE_OUT_WRITE_RD;
810        out_EXECUTE_OUT_NUM_REG_RD <= reg_EXECUTE_OUT_NUM_REG_RD;
811        out_EXECUTE_OUT_DATA_RD <= reg_EXECUTE_OUT_DATA_RD;
812        out_EXECUTE_OUT_WRITE_RE <= reg_EXECUTE_OUT_WRITE_RE;
813        out_EXECUTE_OUT_NUM_REG_RE <= reg_EXECUTE_OUT_NUM_REG_RE;
814        out_EXECUTE_OUT_DATA_RE <= reg_EXECUTE_OUT_DATA_RE;
815        out_EXECUTE_OUT_EXCEPTION <= reg_EXECUTE_OUT_EXCEPTION;
816        out_EXECUTE_OUT_NO_SEQUENCE <= reg_EXECUTE_OUT_NO_SEQUENCE;
817        out_EXECUTE_OUT_ADDRESS <= reg_EXECUTE_OUT_ADDRESS;
818        out_EXECUTE_OUT_VAL <= sig_EXECUTE_OUT_VAL;
819        out_EXECUTE_IN_ACK <= sig_EXECUTE_IN_ACK;
820
821end behavioural;
822
Note: See TracBrowser for help on using the repository browser.