source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/save/Functionnal_unit_0_avec_mul_qui_marche.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.8 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                -- Pipeline
281                if (in_EXECUTE_IN_TYPE = "00100") then
282                  reg_VAL_6           <= in_EXECUTE_IN_VAL;
283                  reg_NUM_REG_RE_6    <= in_EXECUTE_IN_NUM_REG_RE;
284                  reg_WRITE_RE_6      <= in_EXECUTE_IN_WRITE_RE;
285                  reg_NUM_REG_RD_6    <= in_EXECUTE_IN_NUM_REG_RD;
286                  reg_WRITE_RD_6      <= in_EXECUTE_IN_WRITE_RD;
287                  reg_TYPE_6          <= in_EXECUTE_IN_TYPE;
288                  reg_PACKET_ID_6     <= in_EXECUTE_IN_PACKET_ID;
289                  reg_OOO_ENGINE_ID_6 <= in_EXECUTE_IN_OOO_ENGINE_ID;
290
291                  reg_VAL_0           <= reg_VAL_1;
292                  reg_NUM_REG_RE_0    <= reg_NUM_REG_RE_1;
293                  reg_WRITE_RE_0      <= reg_WRITE_RE_1;
294                  reg_NUM_REG_RD_0    <= reg_NUM_REG_RD_1;
295                  reg_WRITE_RD_0      <= reg_WRITE_RD_1;
296                  reg_TYPE_0          <= reg_TYPE_1;
297                  reg_PACKET_ID_0     <= reg_PACKET_ID_1;
298                  reg_OOO_ENGINE_ID_0 <= reg_OOO_ENGINE_ID_1;
299
300                else
301                  reg_VAL_0           <= in_EXECUTE_IN_VAL;
302                  reg_NUM_REG_RE_0    <= in_EXECUTE_IN_NUM_REG_RE;
303                  reg_WRITE_RE_0      <= in_EXECUTE_IN_WRITE_RE;
304                  reg_NUM_REG_RD_0    <= in_EXECUTE_IN_NUM_REG_RD;
305                  reg_WRITE_RD_0      <= in_EXECUTE_IN_WRITE_RD;
306                  reg_TYPE_0          <= in_EXECUTE_IN_TYPE;
307                  reg_PACKET_ID_0     <= in_EXECUTE_IN_PACKET_ID;
308                  reg_OOO_ENGINE_ID_0 <= in_EXECUTE_IN_OOO_ENGINE_ID;
309                end if;
310              end if;
311              if (sig_UPDATE = '1') then
312
313                reg_VAL_1           <= reg_VAL_2;
314                reg_NUM_REG_RE_1    <= reg_NUM_REG_RE_2;
315                reg_WRITE_RE_1      <= reg_WRITE_RE_2;
316                reg_NUM_REG_RD_1    <= reg_NUM_REG_RD_2;
317                reg_WRITE_RD_1      <= reg_WRITE_RD_2;
318                reg_TYPE_1          <= reg_TYPE_2;
319                reg_PACKET_ID_1     <= reg_PACKET_ID_2;
320                reg_OOO_ENGINE_ID_1 <= reg_OOO_ENGINE_ID_2;
321
322                reg_VAL_2           <= reg_VAL_3;
323                reg_NUM_REG_RE_2    <= reg_NUM_REG_RE_3;
324                reg_WRITE_RE_2      <= reg_WRITE_RE_3;
325                reg_NUM_REG_RD_2    <= reg_NUM_REG_RD_3;
326                reg_WRITE_RD_2      <= reg_WRITE_RD_3;
327                reg_TYPE_2          <= reg_TYPE_3;
328                reg_PACKET_ID_2     <= reg_PACKET_ID_3;
329                reg_OOO_ENGINE_ID_2 <= reg_OOO_ENGINE_ID_3;
330
331                reg_VAL_3           <= reg_VAL_4;
332                reg_NUM_REG_RE_3    <= reg_NUM_REG_RE_4;
333                reg_WRITE_RE_3      <= reg_WRITE_RE_4;
334                reg_NUM_REG_RD_3    <= reg_NUM_REG_RD_4;
335                reg_WRITE_RD_3      <= reg_WRITE_RD_4;
336                reg_TYPE_3          <= reg_TYPE_4;
337                reg_PACKET_ID_3     <= reg_PACKET_ID_4;
338                reg_OOO_ENGINE_ID_3 <= reg_OOO_ENGINE_ID_4;
339
340                reg_VAL_4           <= reg_VAL_5;
341                reg_NUM_REG_RE_4    <= reg_NUM_REG_RE_5;
342                reg_WRITE_RE_4      <= reg_WRITE_RE_5;
343                reg_NUM_REG_RD_4    <= reg_NUM_REG_RD_5;
344                reg_WRITE_RD_4      <= reg_WRITE_RD_5;
345                reg_TYPE_4          <= reg_TYPE_5;
346                reg_PACKET_ID_4     <= reg_PACKET_ID_5;
347                reg_OOO_ENGINE_ID_4 <= reg_OOO_ENGINE_ID_5;
348
349                reg_VAL_5           <= reg_VAL_6;
350                reg_NUM_REG_RE_5    <= reg_NUM_REG_RE_6;
351                reg_WRITE_RE_5      <= reg_WRITE_RE_6;
352                reg_NUM_REG_RD_5    <= reg_NUM_REG_RD_6;
353                reg_WRITE_RD_5      <= reg_WRITE_RD_6;
354                reg_TYPE_5          <= reg_TYPE_6;
355                reg_PACKET_ID_5     <= reg_PACKET_ID_6;
356                reg_OOO_ENGINE_ID_5 <= reg_OOO_ENGINE_ID_6;
357
358                -- Output
359                reg_EXECUTE_OUT_VAL <= reg_VAL_0;
360                reg_EXECUTE_OUT_OOO_ENGINE_ID <= sig_EXECUTE_OUT_OOO_ENGINE_ID;
361                reg_EXECUTE_OUT_PACKET_ID <= sig_EXECUTE_OUT_PACKET_ID;
362                reg_EXECUTE_OUT_WRITE_RD <=  sig_EXECUTE_OUT_WRITE_RD;
363                reg_EXECUTE_OUT_NUM_REG_RD <= sig_EXECUTE_OUT_NUM_REG_RD;
364                reg_EXECUTE_OUT_DATA_RD <= sig_EXECUTE_OUT_DATA_RD;
365                reg_EXECUTE_OUT_WRITE_RE <= sig_EXECUTE_OUT_WRITE_RE;
366                reg_EXECUTE_OUT_NUM_REG_RE <= sig_EXECUTE_OUT_NUM_REG_RE;
367                reg_EXECUTE_OUT_DATA_RE <= sig_EXECUTE_OUT_DATA_RE;
368                reg_EXECUTE_OUT_EXCEPTION <= sig_EXECUTE_OUT_EXCEPTION;
369                reg_EXECUTE_OUT_NO_SEQUENCE <= sig_EXECUTE_OUT_NO_SEQUENCE;
370                reg_EXECUTE_OUT_ADDRESS <= sig_EXECUTE_OUT_ADDRESS;
371              end if;
372            end if;
373          end if;
374        end process;
375       
376        --
377        -- -----------------------------------
378        -- -- Insides                         
379        -- -----------------------------------
380        --
381       
382--      sig_VAL_0 <= in_EXECUTE_IN_VAL when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
383--              reg_VAL_1;
384--      sig_NUM_REG_RE_0 <= in_EXECUTE_IN_NUM_REG_RE when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
385--              reg_NUM_REG_RE_1;
386--      sig_WRITE_RE_0 <= in_EXECUTE_IN_WRITE_RE when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
387--              reg_WRITE_RE_1;
388--      sig_NUM_REG_RD_0 <= in_EXECUTE_IN_NUM_REG_RD when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
389--              reg_NUM_REG_RD_1;
390--      sig_WRITE_RD_0 <= in_EXECUTE_IN_WRITE_RD when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
391--              reg_WRITE_RD_1;
392--      sig_TYPE_0 <= in_EXECUTE_IN_TYPE when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
393--              reg_TYPE_1;
394--      sig_PACKET_ID_0 <= in_EXECUTE_IN_PACKET_ID when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
395--              reg_PACKET_ID_1;
396--      sig_OOO_ENGINE_ID_0 <= in_EXECUTE_IN_OOO_ENGINE_ID when (sig_EXECUTE_IN_ACK = '1' and in_EXECUTE_IN_TYPE /= "00100") else
397--              reg_OOO_ENGINE_ID_1;
398
399--      sig_VAL_5 <= reg_EXECUTE_IN_VAL when (reg_EXECUTE_IN_TYPE = "00100") else
400--              '0';
401
402        sig_B_OPERAND <= reg_EXECUTE_IN_IMMEDIAT when (reg_EXECUTE_IN_HAS_IMMEDIAT = '1') else
403                reg_EXECUTE_IN_DATA_RB;
404        --
405        -- ALU
406        --
407        sig_IS_ARITH <= reg_EXECUTE_IN_OPERATION(0) or reg_EXECUTE_IN_OPERATION(1) or reg_EXECUTE_IN_OPERATION(2);
408        sig_IS_LOGIC <= reg_EXECUTE_IN_OPERATION(3) or reg_EXECUTE_IN_OPERATION(4) or reg_EXECUTE_IN_OPERATION(5);
409        sig_CIN_ARITH <= reg_EXECUTE_IN_DATA_RC(1) and reg_EXECUTE_IN_OPERATION(1);
410        sig_ARITH_B_OPERAND <= ((not sig_B_OPERAND) + 1) when (reg_EXECUTE_IN_OPERATION(2) = '1') else
411                sig_B_OPERAND;
412        sig_RES_ARITH <= ('0' & reg_EXECUTE_IN_DATA_RA) + ('0' & sig_ARITH_B_OPERAND) + ("000000000000000000000000000000" & sig_CIN_ARITH);
413       
414        sig_A_AND_B <= reg_EXECUTE_IN_DATA_RA and sig_B_OPERAND;
415        sig_A_OR_B <= reg_EXECUTE_IN_DATA_RA or sig_B_OPERAND;
416        sig_A_XOR_B <= reg_EXECUTE_IN_DATA_RA xor sig_B_OPERAND;
417       
418        with reg_EXECUTE_IN_OPERATION select
419        sig_RES_LOGIC <=
420                sig_A_AND_B when "0001000",
421                sig_A_OR_B  when "0010000",
422                sig_A_XOR_B when "0100000",
423                "00000000000000000000000000000000" when others;
424        sig_RES_ALU <=
425                sig_RES_ARITH (31 downto 0) when (sig_IS_ARITH = '1') else
426                sig_RES_LOGIC when (sig_IS_LOGIC = '1') else
427                "00000000000000000000000000000000";
428       
429        -- In ISA l.sub doesn't change carry flag.
430        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));
431        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;
432       
433        --
434        -- MOVE
435        --
436        sig_MOVHI <= reg_EXECUTE_IN_IMMEDIAT(15 downto 0) & "0000000000000000";
437        sig_CMOV <=
438                reg_EXECUTE_IN_DATA_RA when (reg_EXECUTE_IN_DATA_RC(0) = '1') else
439                reg_EXECUTE_IN_DATA_RB;
440        sig_RES_MOVE <=
441                sig_MOVHI when (reg_EXECUTE_IN_OPERATION(0) = '1') else
442                sig_CMOV when (reg_EXECUTE_IN_OPERATION(1) = '1') else
443                "00000000000000000000000000000000";
444       
445        --
446        -- TEST
447        --
448        sig_IS_LESS <= reg_EXECUTE_IN_OPERATION(3);
449        sig_A_COMPARE <=
450                sig_B_OPERAND when (sig_IS_LESS = '1') else
451                reg_EXECUTE_IN_DATA_RA;
452
453        sig_B_COMPARE <=
454                reg_EXECUTE_IN_DATA_RA when (sig_IS_LESS = '1') else
455                sig_B_OPERAND;
456
457        a_gt_b_s : c_compare_v9_0
458          generic map (
459            c_width      => 32,
460            c_data_type  => 0,                -- 0 = signed, 1 = unsigned
461            c_has_a_eq_b => 0,
462            c_has_a_gt_b => 1)
463          port map (
464            a => sig_A_COMPARE,
465            b => sig_B_COMPARE,
466            a_gt_b => sig_A_GT_B_S);
467
468        a_gt_b_u : c_compare_v9_0
469          generic map (
470            c_width      => 32,
471            c_data_type  => 1,                -- 0 = signed, 1 = unsigned
472            c_has_a_eq_b => 0,
473            c_has_a_gt_b => 1)
474          port map (
475            a => sig_A_COMPARE,
476            b => sig_B_COMPARE,
477            a_gt_b => sig_A_GT_B_U);
478
479        a_eq_b : c_compare_v9_0
480          generic map (                       -- sign doesn't matter for
481                                              -- equality test
482            c_width      => 32,
483            c_has_a_eq_b => 1,
484            c_has_a_gt_b => 0)
485          port map (
486            a => sig_A_COMPARE,
487            b => sig_B_COMPARE,
488            a_eq_b => sig_A_EQ_B);
489
490        sig_IS_SIGNED <= reg_EXECUTE_IN_OPERATION(6);
491        sig_A_GT_B <=
492                sig_A_GT_B_S when (sig_IS_SIGNED = '1') else
493                sig_A_GT_B_U;
494        sig_A_GE_B <= sig_A_GT_B or sig_A_EQ_B;
495        sig_A_NE_B <= not sig_A_EQ_B;
496       
497        sig_FLAG_F <=
498                (sig_A_EQ_B and reg_EXECUTE_IN_OPERATION(4)) or
499                (sig_A_NE_B and reg_EXECUTE_IN_OPERATION(5)) or
500                (sig_A_GE_B and reg_EXECUTE_IN_OPERATION(0)) or
501                (sig_A_GT_B and reg_EXECUTE_IN_OPERATION(1));
502       
503        --
504        -- MULT
505        --
506        signed_multiplier : mult_gen_v9_0
507          generic map (
508            c_xdevicefamily => "virtex4",  -- specifies target Xilinx FPGA name
509            c_a_width       => 32,         -- width of A port
510            c_a_type        => 0,          -- datatype of A port
511            c_b_width       => 32,         -- width of B port
512            c_b_type        => 0,          -- datatype of B port
513            c_out_high      => 63,         -- MSB of P output port (N-1 downto 0 convention)
514            c_mult_type     => 1,          -- Type of multiplier to implement
515            c_opt_goal      => 1,          -- Optimization of multiplier
516            c_has_ce        => 1,          -- Use clock enable on all registers
517            c_pipe_stages   => 6           -- Number of register stages required
518            )
519          port map (
520            clk => in_CLOCK,
521            a   => reg_EXECUTE_IN_DATA_RA,
522            b   => sig_B_OPERAND,
523            ce  => sig_UPDATE,
524            p   => sig_FULL_RES_MULS
525            );
526
527        unsigned_multiplier : mult_gen_v9_0
528          generic map (
529            c_xdevicefamily => "virtex4",  -- specifies target Xilinx FPGA name
530            c_a_width       => 32,         -- width of A port
531            c_a_type        => 1,          -- datatype of A port
532            c_b_width       => 32,         -- width of B port
533            c_b_type        => 1,          -- datatype of B port
534            c_out_high      => 63,         -- MSB of P output port (N-1 downto 0 convention)
535            c_mult_type     => 1,          -- Type of multiplier to implement
536            c_opt_goal      => 1,          -- Optimization of multiplier
537            c_has_ce        => 1,          -- Use clock enable on all registers
538            c_pipe_stages   => 6           -- Number of register stages required
539            )
540          port map (
541            clk => in_CLOCK,
542            a   => reg_EXECUTE_IN_DATA_RA,
543            b   => sig_B_OPERAND,
544            ce  => sig_UPDATE,
545            p   => sig_FULL_RES_MULU
546            );
547
548        sig_FULL_RES_MUL <=
549                sig_FULL_RES_MULS when (reg_EXECUTE_IN_OPERATION(0) = '1') else
550                sig_FULL_RES_MULU;
551
552        sig_RES_MUL <= sig_FULL_RES_MUL (31 downto 0);
553
554        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
555                        sig_FULL_RES_MUL(59) or sig_FULL_RES_MUL(58) or sig_FULL_RES_MUL(57) or sig_FULL_RES_MUL(56) or
556                        sig_FULL_RES_MUL(55) or sig_FULL_RES_MUL(54) or sig_FULL_RES_MUL(53) or sig_FULL_RES_MUL(52) or
557                        sig_FULL_RES_MUL(51) or sig_FULL_RES_MUL(50) or sig_FULL_RES_MUL(49) or sig_FULL_RES_MUL(48) or
558                        sig_FULL_RES_MUL(47) or sig_FULL_RES_MUL(46) or sig_FULL_RES_MUL(45) or sig_FULL_RES_MUL(44) or
559                        sig_FULL_RES_MUL(43) or sig_FULL_RES_MUL(42) or sig_FULL_RES_MUL(41) or sig_FULL_RES_MUL(40) or
560                        sig_FULL_RES_MUL(39) or sig_FULL_RES_MUL(38) or sig_FULL_RES_MUL(37) or sig_FULL_RES_MUL(36) or
561                        sig_FULL_RES_MUL(35) or sig_FULL_RES_MUL(34) or sig_FULL_RES_MUL(33) or sig_FULL_RES_MUL(32);
562
563        sig_OVR_MUL <= sig_COUT_MUL;
564
565        --
566        -- BRANCH
567        --
568        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);
569        sig_RES_BRANCH <=
570                reg_EXECUTE_IN_IMMEDIAT(29 downto 0) & "00"when (reg_EXECUTE_IN_OPERATION(3) = '1') else
571                "00000000000000000000000000000000";
572        sig_ADDR_BRANCH <=
573                reg_EXECUTE_IN_DATA_RB(31 downto 2) when (reg_EXECUTE_IN_OPERATION(3) = '1') else
574                reg_EXECUTE_IN_IMMEDIAT(29 downto 0);
575       
576        --
577        -- SHIFTER
578        --
579        -- Instance shifter
580        instance_Functionnal_unit_0_shifter : Functionnal_unit_0_shifter
581        port map (
582                  in_SHIFTER_0_DATA             =>      reg_EXECUTE_IN_DATA_RA
583                , in_SHIFTER_0_SHIFT            =>      sig_B_OPERAND(4 downto 0)
584                , in_SHIFTER_0_DIRECTION        =>      reg_EXECUTE_IN_OPERATION(0)
585                , in_SHIFTER_0_TYPE             =>      reg_EXECUTE_IN_OPERATION(1)
586                , in_SHIFTER_0_CARRY            =>      reg_EXECUTE_IN_OPERATION(2)
587                ,out_SHIFTER_0_DATA             =>      sig_RES_SHIFTER
588        );
589       
590       
591        --
592        -- EXTEND
593        --
594        sig_EXT_BYTE_S <=
595                "111111111111111111111111" & reg_EXECUTE_IN_DATA_RA (7 downto 0) when (reg_EXECUTE_IN_DATA_RA (7) = '1') else
596                "000000000000000000000000" & reg_EXECUTE_IN_DATA_RA (7 downto 0);
597       
598        sig_EXT_BYTE_Z <=
599                "000000000000000000000000" & reg_EXECUTE_IN_DATA_RA (7 downto 0);
600       
601        sig_EXT_HALF_WORD_S <=
602                "1111111111111111" & reg_EXECUTE_IN_DATA_RA (15 downto 0) when (reg_EXECUTE_IN_DATA_RA (15) = '1') else
603                "0000000000000000" & reg_EXECUTE_IN_DATA_RA (15 downto 0);
604       
605        sig_EXT_HALF_WORD_Z <=
606                "0000000000000000" & reg_EXECUTE_IN_DATA_RA (15 downto 0);
607       
608        sig_EXT_WORD_S <=
609                "" & reg_EXECUTE_IN_DATA_RA (31 downto 0) when (reg_EXECUTE_IN_DATA_RA (31) = '1') else
610                "" & reg_EXECUTE_IN_DATA_RA (31 downto 0);
611       
612        sig_EXT_WORD_Z <=
613                "" & reg_EXECUTE_IN_DATA_RA (31 downto 0);
614       
615        sig_EXT_S <=
616                sig_EXT_BYTE_S      when (reg_EXECUTE_IN_IMMEDIAT = 8)  else
617                sig_EXT_HALF_WORD_S when (reg_EXECUTE_IN_IMMEDIAT = 16) else
618                sig_EXT_WORD_S;
619       
620        sig_EXT_Z <=
621                sig_EXT_BYTE_Z      when (reg_EXECUTE_IN_IMMEDIAT = 8)  else
622                sig_EXT_HALF_WORD_Z when (reg_EXECUTE_IN_IMMEDIAT = 16) else
623                sig_EXT_WORD_Z;
624       
625        sig_RES_EXTEND <=
626                sig_EXT_Z      when (reg_EXECUTE_IN_OPERATION(0) = '1')  else
627                sig_EXT_S;
628       
629       
630        --
631        -- FIND
632        --
633        sig_FF1 <=
634                "000001"        when (reg_EXECUTE_IN_DATA_RA (0) = '1')         else
635                "000010"        when (reg_EXECUTE_IN_DATA_RA (1) = '1')         else
636                "000011"        when (reg_EXECUTE_IN_DATA_RA (2) = '1')         else
637                "000100"        when (reg_EXECUTE_IN_DATA_RA (3) = '1')         else
638                "000101"        when (reg_EXECUTE_IN_DATA_RA (4) = '1')         else
639                "000110"        when (reg_EXECUTE_IN_DATA_RA (5) = '1')         else
640                "000111"        when (reg_EXECUTE_IN_DATA_RA (6) = '1')         else
641                "001000"        when (reg_EXECUTE_IN_DATA_RA (7) = '1')         else
642                "001001"        when (reg_EXECUTE_IN_DATA_RA (8) = '1')         else
643                "001010"        when (reg_EXECUTE_IN_DATA_RA (9) = '1')         else
644                "001011"        when (reg_EXECUTE_IN_DATA_RA (10) = '1')        else
645                "001100"        when (reg_EXECUTE_IN_DATA_RA (11) = '1')        else
646                "001101"        when (reg_EXECUTE_IN_DATA_RA (12) = '1')        else
647                "001110"        when (reg_EXECUTE_IN_DATA_RA (13) = '1')        else
648                "001111"        when (reg_EXECUTE_IN_DATA_RA (14) = '1')        else
649                "010000"        when (reg_EXECUTE_IN_DATA_RA (15) = '1')        else
650                "010001"        when (reg_EXECUTE_IN_DATA_RA (16) = '1')        else
651                "010010"        when (reg_EXECUTE_IN_DATA_RA (17) = '1')        else
652                "010011"        when (reg_EXECUTE_IN_DATA_RA (18) = '1')        else
653                "010100"        when (reg_EXECUTE_IN_DATA_RA (19) = '1')        else
654                "010101"        when (reg_EXECUTE_IN_DATA_RA (20) = '1')        else
655                "010110"        when (reg_EXECUTE_IN_DATA_RA (21) = '1')        else
656                "010111"        when (reg_EXECUTE_IN_DATA_RA (22) = '1')        else
657                "011000"        when (reg_EXECUTE_IN_DATA_RA (23) = '1')        else
658                "011001"        when (reg_EXECUTE_IN_DATA_RA (24) = '1')        else
659                "011010"        when (reg_EXECUTE_IN_DATA_RA (25) = '1')        else
660                "011011"        when (reg_EXECUTE_IN_DATA_RA (26) = '1')        else
661                "011100"        when (reg_EXECUTE_IN_DATA_RA (27) = '1')        else
662                "011101"        when (reg_EXECUTE_IN_DATA_RA (28) = '1')        else
663                "011110"        when (reg_EXECUTE_IN_DATA_RA (29) = '1')        else
664                "011111"        when (reg_EXECUTE_IN_DATA_RA (30) = '1')        else
665                "100000"        when (reg_EXECUTE_IN_DATA_RA (31) = '1')        else
666                "000000";
667       
668        sig_FL1 <=
669                "100000"        when (reg_EXECUTE_IN_DATA_RA (31) = '1')        else
670                "011111"        when (reg_EXECUTE_IN_DATA_RA (30) = '1')        else
671                "011110"        when (reg_EXECUTE_IN_DATA_RA (29) = '1')        else
672                "011101"        when (reg_EXECUTE_IN_DATA_RA (28) = '1')        else
673                "011100"        when (reg_EXECUTE_IN_DATA_RA (27) = '1')        else
674                "011011"        when (reg_EXECUTE_IN_DATA_RA (26) = '1')        else
675                "011010"        when (reg_EXECUTE_IN_DATA_RA (25) = '1')        else
676                "011001"        when (reg_EXECUTE_IN_DATA_RA (24) = '1')        else
677                "011000"        when (reg_EXECUTE_IN_DATA_RA (23) = '1')        else
678                "010111"        when (reg_EXECUTE_IN_DATA_RA (22) = '1')        else
679                "010110"        when (reg_EXECUTE_IN_DATA_RA (21) = '1')        else
680                "010101"        when (reg_EXECUTE_IN_DATA_RA (20) = '1')        else
681                "010100"        when (reg_EXECUTE_IN_DATA_RA (19) = '1')        else
682                "010011"        when (reg_EXECUTE_IN_DATA_RA (18) = '1')        else
683                "010010"        when (reg_EXECUTE_IN_DATA_RA (17) = '1')        else
684                "010001"        when (reg_EXECUTE_IN_DATA_RA (16) = '1')        else
685                "010000"        when (reg_EXECUTE_IN_DATA_RA (15) = '1')        else
686                "001111"        when (reg_EXECUTE_IN_DATA_RA (14) = '1')        else
687                "001110"        when (reg_EXECUTE_IN_DATA_RA (13) = '1')        else
688                "001101"        when (reg_EXECUTE_IN_DATA_RA (12) = '1')        else
689                "001100"        when (reg_EXECUTE_IN_DATA_RA (11) = '1')        else
690                "001011"        when (reg_EXECUTE_IN_DATA_RA (10) = '1')        else
691                "001010"        when (reg_EXECUTE_IN_DATA_RA (9) = '1')         else
692                "001001"        when (reg_EXECUTE_IN_DATA_RA (8) = '1')         else
693                "001000"        when (reg_EXECUTE_IN_DATA_RA (7) = '1')         else
694                "000111"        when (reg_EXECUTE_IN_DATA_RA (6) = '1')         else
695                "000110"        when (reg_EXECUTE_IN_DATA_RA (5) = '1')         else
696                "000101"        when (reg_EXECUTE_IN_DATA_RA (4) = '1')         else
697                "000100"        when (reg_EXECUTE_IN_DATA_RA (3) = '1')         else
698                "000011"        when (reg_EXECUTE_IN_DATA_RA (2) = '1')         else
699                "000010"        when (reg_EXECUTE_IN_DATA_RA (1) = '1')         else
700                "000001"        when (reg_EXECUTE_IN_DATA_RA (0) = '1')         else
701                "000000";
702       
703        sig_RES_FIND <=
704                "00000000000000000000000000"&sig_FF1      when (reg_EXECUTE_IN_OPERATION(0) = '1')  else
705                "00000000000000000000000000"&sig_FL1;
706       
707       
708        --
709        -- SPECIAL
710        --
711        sig_SPR_IS_HERE <=
712                '1' when (sig_A_OR_B(15 downto 0) = "00101") else
713                '0';
714        -- MFSPR
715        sig_MFSPR <=
716                reg_MACLO(0) when (sig_SPR_IS_HERE = '1' and sig_A_OR_B(10 downto 0) = "00000000001") else
717                reg_MACHI(0) when (sig_SPR_IS_HERE = '1' and sig_A_OR_B(10 downto 0) = "00000000010") else
718                "00000000000000000000000000000000";
719       
720       
721        -- MTSPR
722        process (in_CLOCK)
723        begin
724                if in_CLOCK'event and in_CLOCK = '1' then
725                        if (sig_SPR_IS_HERE = '1') then
726                                if (sig_A_OR_B(10 downto 0) = "00000000001") then
727                                        reg_MACLO(0) <= reg_EXECUTE_IN_DATA_RB;
728                                end if;
729                                if (sig_A_OR_B(10 downto 0) = "00000000010") then
730                                        reg_MACHI(0) <= reg_EXECUTE_IN_DATA_RB;
731                                end if;
732                        end if;
733                end if;
734        end process;
735       
736        sig_RES_SPECIAL <=
737                sig_MFSPR when (reg_EXECUTE_IN_OPERATION = "0000001")  else
738                reg_EXECUTE_IN_DATA_RB when (reg_EXECUTE_IN_OPERATION = "0000010")  else
739                "00000000000000000000000000000000";
740       
741        --
742        -- TRANSACTION
743        --
744        sig_BUSY <=
745--              reg_FUNCTIONAL_QUEUE(34)(0) when in_EXECUTE_IN_OPERATION = "" else
746                reg_VAL_6  when in_EXECUTE_IN_TYPE = "00100" else
747                reg_VAL_0;
748        sig_EXECUTE_OUT_VAL <= reg_EXECUTE_OUT_VAL;
749        sig_UPDATE <= not reg_EXECUTE_OUT_VAL or in_EXECUTE_OUT_ACK;
750        sig_EXECUTE_IN_ACK <= not sig_BUSY or sig_UPDATE;
751       
752        --
753        -- -----------------------------------
754        -- -- Output Buffer Signals
755        -- -----------------------------------
756        --
757       
758        sig_EXECUTE_OUT_OOO_ENGINE_ID <= reg_OOO_ENGINE_ID_0;
759        sig_EXECUTE_OUT_PACKET_ID <= reg_PACKET_ID_0;
760        sig_EXECUTE_OUT_WRITE_RD <=  reg_WRITE_RD_0;
761        sig_EXECUTE_OUT_NUM_REG_RD <= reg_NUM_REG_RD_0;
762        with reg_TYPE_0 select
763        sig_EXECUTE_OUT_DATA_RD <=
764                sig_RES_ALU when "00000",
765                sig_RES_MOVE when "00010",
766                sig_RES_BRANCH when "01010",
767                sig_RES_SHIFTER when "00001",
768                sig_RES_EXTEND when "00110",
769                sig_RES_FIND when "00111",
770                sig_RES_MUL when "00100",
771                sig_RES_SPECIAL when "01000",
772                "00000000000000000000000000000000" when others;
773        sig_EXECUTE_OUT_WRITE_RE <= reg_WRITE_RE_0;
774        sig_EXECUTE_OUT_NUM_REG_RE <= reg_NUM_REG_RE_0;
775        with reg_TYPE_0 select
776        sig_EXECUTE_OUT_DATA_RE <=
777                sig_COUT_ALU & sig_OVR_ALU when "00000",
778                sig_COUT_MUL & sig_OVR_MUL when "00100",
779                '0' & sig_FLAG_F when "00011",
780                "00" when others;
781        sig_EXECUTE_OUT_EXCEPTION <=
782                "01011" when (reg_TYPE_0 = "00000" and sig_OVR_ALU = '1') else
783                "01011" when (reg_TYPE_0 = "00100" and sig_OVR_MUL = '1') else
784--              "10011" when (reg_TYPE_1 = "01000" and reg_OPERATION_1 = "0000001" and sig_SPR_IS_HERE = '0') else
785--              "10100" when (reg_TYPE_1 = "01000" and reg_OPERATION_1 = "0000010" and sig_SPR_IS_HERE = '0') else
786                "00000";
787        with reg_TYPE_0 select
788        sig_EXECUTE_OUT_NO_SEQUENCE <=
789                sig_NOSQ_BRANCH when "01010",
790                '0'when others;
791        with reg_TYPE_0 select
792        sig_EXECUTE_OUT_ADDRESS <=
793                sig_ADDR_BRANCH when "01010",
794                sig_A_OR_B(29 downto 0) when "01000",
795                "000000000000000000000000000000" when others;
796       
797        --
798        -- -----------------------------------
799        -- -- Outputs                         
800        -- -----------------------------------
801        --
802       
803        out_EXECUTE_OUT_OOO_ENGINE_ID <= reg_EXECUTE_OUT_OOO_ENGINE_ID;
804        out_EXECUTE_OUT_PACKET_ID <= reg_EXECUTE_OUT_PACKET_ID;
805        out_EXECUTE_OUT_WRITE_RD <=  reg_EXECUTE_OUT_WRITE_RD;
806        out_EXECUTE_OUT_NUM_REG_RD <= reg_EXECUTE_OUT_NUM_REG_RD;
807        out_EXECUTE_OUT_DATA_RD <= reg_EXECUTE_OUT_DATA_RD;
808        out_EXECUTE_OUT_WRITE_RE <= reg_EXECUTE_OUT_WRITE_RE;
809        out_EXECUTE_OUT_NUM_REG_RE <= reg_EXECUTE_OUT_NUM_REG_RE;
810        out_EXECUTE_OUT_DATA_RE <= reg_EXECUTE_OUT_DATA_RE;
811        out_EXECUTE_OUT_EXCEPTION <= reg_EXECUTE_OUT_EXCEPTION;
812        out_EXECUTE_OUT_NO_SEQUENCE <= reg_EXECUTE_OUT_NO_SEQUENCE;
813        out_EXECUTE_OUT_ADDRESS <= reg_EXECUTE_OUT_ADDRESS;
814        out_EXECUTE_OUT_VAL <= sig_EXECUTE_OUT_VAL;
815        out_EXECUTE_IN_ACK <= sig_EXECUTE_IN_ACK;
816
817end behavioural;
818
Note: See TracBrowser for help on using the repository browser.