source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/save/Functionnal_unit_0.vhdl.bak @ 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: 22.4 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;
26
27entity Functionnal_unit_0 is
28        port (
29        in_CLOCK        : in     std_logic;
30        in_NRESET       : in     std_logic;
31        in_EXECUTE_IN_VAL       : in     std_logic;
32        out_EXECUTE_IN_ACK      : out    std_logic;
33        in_EXECUTE_IN_OOO_ENGINE_ID     : in     std_logic;
34        in_EXECUTE_IN_PACKET_ID : in     std_logic_vector(7 downto 0);
35        in_EXECUTE_IN_OPERATION : in     std_logic_vector(6 downto 0);
36        in_EXECUTE_IN_TYPE      : in     std_logic_vector(4 downto 0);
37        in_EXECUTE_IN_STORE_QUEUE_PTR_WRITE     : in     std_logic_vector(1 downto 0);
38        in_EXECUTE_IN_HAS_IMMEDIAT      : in     std_logic;
39        in_EXECUTE_IN_IMMEDIAT  : in     std_logic_vector(31 downto 0);
40        in_EXECUTE_IN_DATA_RA   : in     std_logic_vector(31 downto 0);
41        in_EXECUTE_IN_DATA_RB   : in     std_logic_vector(31 downto 0);
42        in_EXECUTE_IN_DATA_RC   : in     std_logic_vector(1 downto 0);
43        in_EXECUTE_IN_WRITE_RD  : in     std_logic;
44        in_EXECUTE_IN_NUM_REG_RD        : in     std_logic_vector(4 downto 0);
45        in_EXECUTE_IN_WRITE_RE  : in     std_logic;
46        in_EXECUTE_IN_NUM_REG_RE        : in     std_logic_vector(3 downto 0);
47        out_EXECUTE_OUT_VAL     : out    std_logic;
48        in_EXECUTE_OUT_ACK      : in     std_logic;
49        out_EXECUTE_OUT_OOO_ENGINE_ID   : out    std_logic;
50        out_EXECUTE_OUT_PACKET_ID       : out    std_logic_vector(7 downto 0);
51        out_EXECUTE_OUT_WRITE_RD        : out    std_logic;
52        out_EXECUTE_OUT_NUM_REG_RD      : out    std_logic_vector(4 downto 0);
53        out_EXECUTE_OUT_DATA_RD : out    std_logic_vector(31 downto 0);
54        out_EXECUTE_OUT_WRITE_RE        : out    std_logic;
55        out_EXECUTE_OUT_NUM_REG_RE      : out    std_logic_vector(3 downto 0);
56        out_EXECUTE_OUT_DATA_RE : out    std_logic_vector(1 downto 0);
57        out_EXECUTE_OUT_EXCEPTION       : out    std_logic_vector(4 downto 0);
58        out_EXECUTE_OUT_NO_SEQUENCE     : out    std_logic;
59        out_EXECUTE_OUT_ADDRESS : out    std_logic_vector(29 downto 0)
60             );
61end Functionnal_unit_0;
62
63architecture behavioural of Functionnal_unit_0 is
64        type Tmac       is array (1 downto 0) of std_logic_vector(31 downto 0);
65
66        signal sig_EXECUTE_IN_ACK       : std_logic;
67        signal reg_BUSY_IN      : std_logic;
68        signal reg_EXECUTE_IN_OOO_ENGINE_ID     : std_logic;
69        signal reg_EXECUTE_IN_PACKET_ID : std_logic_vector(7 downto 0);
70        signal reg_EXECUTE_IN_OPERATION : std_logic_vector(6 downto 0);
71        signal reg_EXECUTE_IN_TYPE      : std_logic_vector(4 downto 0);
72        signal reg_EXECUTE_IN_HAS_IMMEDIAT      : std_logic;
73        signal reg_EXECUTE_IN_IMMEDIAT  : std_logic_vector(31 downto 0);
74        signal reg_EXECUTE_IN_DATA_RA   : std_logic_vector(31 downto 0);
75        signal reg_EXECUTE_IN_DATA_RB   : std_logic_vector(31 downto 0);
76        signal reg_EXECUTE_IN_DATA_RC   : std_logic_vector(1 downto 0);
77        signal reg_EXECUTE_IN_WRITE_RD  : std_logic;
78        signal reg_EXECUTE_IN_NUM_REG_RD        : std_logic_vector(4 downto 0);
79        signal reg_EXECUTE_IN_WRITE_RE  : std_logic;
80        signal reg_EXECUTE_IN_NUM_REG_RE        : std_logic_vector(3 downto 0);
81        signal sig_B_OPERAND    : std_logic_vector(31 downto 0);
82        signal sig_IS_ARITH     : std_logic;
83        signal sig_IS_LOGIC     : std_logic;
84        signal sig_CIN_ARITH    : std_logic;
85        signal sig_ARITH_B_OPERAND      : std_logic_vector(31 downto 0);
86        signal sig_RES_ARITH    : std_logic_vector(32 downto 0);
87        signal sig_A_AND_B      : std_logic_vector(31 downto 0);
88        signal sig_A_OR_B       : std_logic_vector(31 downto 0);
89        signal sig_A_XOR_B      : std_logic_vector(31 downto 0);
90        signal sig_RES_LOGIC    : std_logic_vector(31 downto 0);
91        signal sig_RES_ALU      : std_logic_vector(31 downto 0);
92        signal sig_OVR_ALU      : std_logic;
93        signal sig_COUT_ALU     : std_logic;
94        signal sig_RES_MOVE     : std_logic_vector(31 downto 0);
95        signal sig_CMOV : std_logic_vector(31 downto 0);
96        signal sig_MOVHI        : std_logic_vector(31 downto 0);
97        signal sig_RES_BRANCH   : std_logic_vector(31 downto 0);
98        signal sig_ADDR_BRANCH  : std_logic_vector(29 downto 0);
99        signal sig_NOSQ_BRANCH  : std_logic;
100        signal sig_RES_SHIFTER  : std_logic_vector(31 downto 0);
101        signal sig_EXT_BYTE_S   : std_logic_vector(31 downto 0);
102        signal sig_EXT_BYTE_Z   : std_logic_vector(31 downto 0);
103        signal sig_EXT_HALF_WORD_S      : std_logic_vector(31 downto 0);
104        signal sig_EXT_HALF_WORD_Z      : std_logic_vector(31 downto 0);
105        signal sig_EXT_WORD_S   : std_logic_vector(31 downto 0);
106        signal sig_EXT_WORD_Z   : std_logic_vector(31 downto 0);
107        signal sig_EXT_S        : std_logic_vector(31 downto 0);
108        signal sig_EXT_Z        : std_logic_vector(31 downto 0);
109        signal sig_RES_EXTEND   : std_logic_vector(31 downto 0);
110        signal sig_FF1  : std_logic_vector(5 downto 0);
111        signal sig_FL1  : std_logic_vector(5 downto 0);
112        signal sig_RES_FIND     : std_logic_vector(31 downto 0);
113        signal sig_SPR_IS_HERE  : std_logic;
114        signal sig_MFSPR        : std_logic_vector(31 downto 0);
115        signal sig_MTSPR        : std_logic_vector(31 downto 0);
116        signal sig_RES_SPECIAL  : std_logic_vector(31 downto 0);
117        signal sig_EXECUTE_OUT_VAL      : std_logic;
118        signal sig_EXECUTE_OUT_UPDATE   : std_logic;
119        signal reg_BUSY_OUT     : std_logic;
120        signal reg_EXECUTE_OUT_OOO_ENGINE_ID    : std_logic;
121        signal sig_EXECUTE_OUT_OOO_ENGINE_ID    : std_logic;
122        signal reg_EXECUTE_OUT_PACKET_ID        : std_logic_vector(7 downto 0);
123        signal sig_EXECUTE_OUT_PACKET_ID        : std_logic_vector(7 downto 0);
124        signal reg_EXECUTE_OUT_WRITE_RD : std_logic;
125        signal sig_EXECUTE_OUT_WRITE_RD : std_logic;
126        signal reg_EXECUTE_OUT_NUM_REG_RD       : std_logic_vector(4 downto 0);
127        signal sig_EXECUTE_OUT_NUM_REG_RD       : std_logic_vector(4 downto 0);
128        signal reg_EXECUTE_OUT_DATA_RD  : std_logic_vector(31 downto 0);
129        signal sig_EXECUTE_OUT_DATA_RD  : std_logic_vector(31 downto 0);
130        signal reg_EXECUTE_OUT_WRITE_RE : std_logic;
131        signal sig_EXECUTE_OUT_WRITE_RE : std_logic;
132        signal reg_EXECUTE_OUT_NUM_REG_RE       : std_logic_vector(3 downto 0);
133        signal sig_EXECUTE_OUT_NUM_REG_RE       : std_logic_vector(3 downto 0);
134        signal reg_EXECUTE_OUT_DATA_RE  : std_logic_vector(1 downto 0);
135        signal sig_EXECUTE_OUT_DATA_RE  : std_logic_vector(1 downto 0);
136        signal reg_EXECUTE_OUT_EXCEPTION        : std_logic_vector(4 downto 0);
137        signal sig_EXECUTE_OUT_EXCEPTION        : std_logic_vector(4 downto 0);
138        signal reg_EXECUTE_OUT_NO_SEQUENCE      : std_logic;
139        signal sig_EXECUTE_OUT_NO_SEQUENCE      : std_logic;
140        signal reg_EXECUTE_OUT_ADDRESS  : std_logic_vector(29 downto 0);
141        signal sig_EXECUTE_OUT_ADDRESS  : std_logic_vector(29 downto 0);
142        signal reg_MACLO                : Tmac;
143        signal reg_MACHI                : Tmac;
144
145        signal sig_IS_LESS      : std_logic;
146        signal sig_A_COMPARE    : std_logic_vector(31 downto 0);
147        signal sig_B_COMPARE    : std_logic_vector(31 downto 0);
148        signal sig_A_GT_B_S     : std_logic;
149        signal sig_A_GT_B_U     : std_logic;
150        signal sig_A_EQ_B       : std_logic;
151        signal sig_A_GT_B       : std_logic;
152        signal sig_A_GE_B       : std_logic;
153        signal sig_A_NE_B       : std_logic;
154        signal sig_IS_SIGNED    : std_logic;
155        signal sig_FLAG_F       : std_logic;
156
157--      type TFQUEUE    is array (5 downto 0) of std_logic_vector(27 downto 0);
158        -- OOO_ENGINE_ID(1) + PACKET_ID(8) + WRITE_RD(1) + NUM_REG_RD(5) + WRITE_RE(1) +
159        -- NUM_REG_RE(4) + OPERATION (7) + VALID(1) = 28 bits
160
161begin
162       
163        --
164        -- -----------------------------------
165        -- -- Registers                       
166        -- -----------------------------------
167        --
168
169        process (in_CLOCK)
170        begin
171                if in_CLOCK'event and in_CLOCK = '1' then
172                        if (in_NRESET = '0') then
173                                reg_BUSY_IN <= '0';
174                                reg_BUSY_OUT <= '0';
175                        else
176                                -- Input Buffer
177                                if (sig_EXECUTE_IN_ACK = '1') then
178                                        reg_BUSY_IN <= in_EXECUTE_IN_VAL;
179                                        reg_EXECUTE_IN_OOO_ENGINE_ID <= in_EXECUTE_IN_OOO_ENGINE_ID;
180                                        reg_EXECUTE_IN_PACKET_ID <= in_EXECUTE_IN_PACKET_ID;
181                                        reg_EXECUTE_IN_OPERATION <= in_EXECUTE_IN_OPERATION;
182                                        reg_EXECUTE_IN_TYPE <= in_EXECUTE_IN_TYPE;
183                                        reg_EXECUTE_IN_DATA_RA <= in_EXECUTE_IN_DATA_RA;
184                                        reg_EXECUTE_IN_DATA_RB <= in_EXECUTE_IN_DATA_RB;
185                                        reg_EXECUTE_IN_DATA_RC <= in_EXECUTE_IN_DATA_RC;
186                                        reg_EXECUTE_IN_HAS_IMMEDIAT <= in_EXECUTE_IN_HAS_IMMEDIAT;
187                                        reg_EXECUTE_IN_IMMEDIAT <= in_EXECUTE_IN_IMMEDIAT;
188                                        reg_EXECUTE_IN_WRITE_RD <= in_EXECUTE_IN_WRITE_RD;
189                                        reg_EXECUTE_IN_NUM_REG_RD <= in_EXECUTE_IN_NUM_REG_RD;
190                                        reg_EXECUTE_IN_WRITE_RE <= in_EXECUTE_IN_WRITE_RE;
191                                        reg_EXECUTE_IN_NUM_REG_RE <= in_EXECUTE_IN_NUM_REG_RE;
192                                end if;
193                                -- Output Buffer
194                                if (sig_EXECUTE_OUT_UPDATE = '1') then
195                                        reg_BUSY_OUT <= reg_BUSY_IN;
196                                        reg_EXECUTE_OUT_OOO_ENGINE_ID <= sig_EXECUTE_OUT_OOO_ENGINE_ID;
197                                        reg_EXECUTE_OUT_PACKET_ID <= sig_EXECUTE_OUT_PACKET_ID;
198                                        reg_EXECUTE_OUT_WRITE_RD <= sig_EXECUTE_OUT_WRITE_RD;
199                                        reg_EXECUTE_OUT_NUM_REG_RD <= sig_EXECUTE_OUT_NUM_REG_RD;
200                                        reg_EXECUTE_OUT_DATA_RD <= sig_EXECUTE_OUT_DATA_RD;
201                                        reg_EXECUTE_OUT_WRITE_RE <= sig_EXECUTE_OUT_WRITE_RE;
202                                        reg_EXECUTE_OUT_NUM_REG_RE <= sig_EXECUTE_OUT_NUM_REG_RE;
203                                        reg_EXECUTE_OUT_DATA_RE <= sig_EXECUTE_OUT_DATA_RE;
204                                        reg_EXECUTE_OUT_EXCEPTION <= sig_EXECUTE_OUT_EXCEPTION;
205                                        reg_EXECUTE_OUT_NO_SEQUENCE <= sig_EXECUTE_OUT_NO_SEQUENCE;
206                                        reg_EXECUTE_OUT_ADDRESS <= sig_EXECUTE_OUT_ADDRESS;
207                                end if;
208                        end if;
209                end if;
210        end process;
211       
212        --
213        -- -----------------------------------
214        -- -- Insides                         
215        -- -----------------------------------
216        --
217       
218        sig_B_OPERAND <= reg_EXECUTE_IN_IMMEDIAT when (reg_EXECUTE_IN_HAS_IMMEDIAT = '1') else
219                reg_EXECUTE_IN_DATA_RB;
220        --
221        -- ALU
222        --
223        sig_IS_ARITH <= reg_EXECUTE_IN_OPERATION(0) or reg_EXECUTE_IN_OPERATION(1) or reg_EXECUTE_IN_OPERATION(2);
224        sig_IS_LOGIC <= reg_EXECUTE_IN_OPERATION(3) or reg_EXECUTE_IN_OPERATION(4) or reg_EXECUTE_IN_OPERATION(5);
225        sig_CIN_ARITH <= reg_EXECUTE_IN_DATA_RC(1) and reg_EXECUTE_IN_OPERATION(1);
226        sig_ARITH_B_OPERAND <= ((not sig_B_OPERAND) + 1) when (reg_EXECUTE_IN_OPERATION(2) = '1') else
227                sig_B_OPERAND;
228        sig_RES_ARITH <= ('0' & reg_EXECUTE_IN_DATA_RA) + ('0' & sig_ARITH_B_OPERAND) + ("000000000000000000000000000000" & sig_CIN_ARITH);
229       
230        sig_A_AND_B <= reg_EXECUTE_IN_DATA_RA and sig_B_OPERAND;
231        sig_A_OR_B <= reg_EXECUTE_IN_DATA_RA or sig_B_OPERAND;
232        sig_A_XOR_B <= reg_EXECUTE_IN_DATA_RA xor sig_B_OPERAND;
233       
234        with reg_EXECUTE_IN_OPERATION select
235        sig_RES_LOGIC <=
236                sig_A_AND_B when "0001000",
237                sig_A_OR_B  when "0010000",
238                sig_A_XOR_B when "0100000",
239                "00000000000000000000000000000000" when others;
240        sig_RES_ALU <=
241                sig_RES_ARITH (31 downto 0) when (sig_IS_ARITH = '1') else
242                sig_RES_LOGIC when (sig_IS_LOGIC = '1') else
243                "00000000000000000000000000000000";
244       
245        -- In ISA l.sub doesn't change carry flag.
246        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));
247        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;
248       
249        --
250        -- MOVE
251        --
252        sig_MOVHI <= reg_EXECUTE_IN_IMMEDIAT(15 downto 0) & "0000000000000000";
253        sig_CMOV <=
254                reg_EXECUTE_IN_DATA_RA when (reg_EXECUTE_IN_DATA_RC(0) = '1') else
255                reg_EXECUTE_IN_DATA_RB;
256        sig_RES_MOVE <=
257                sig_MOVHI when (reg_EXECUTE_IN_OPERATION(0) = '1') else
258                sig_CMOV when (reg_EXECUTE_IN_OPERATION(1) = '1') else
259                "00000000000000000000000000000000";
260       
261        --
262        -- TEST
263        --
264        sig_IS_LESS <= reg_EXECUTE_IN_OPERATION(3);
265        sig_A_COMPARE <=
266                sig_B_OPERAND when (sig_IS_LESS = '1') else
267                reg_EXECUTE_IN_DATA_RA;
268
269        sig_B_COMPARE <=
270                reg_EXECUTE_IN_DATA_RA when (sig_IS_LESS = '1') else
271                sig_B_OPERAND;
272
273        a_gt_b_s : c_compare_v9_0
274          generic map (
275            c_width      => 32,
276            c_data_type  => 0,                -- 0 = signed, 1 = unsigned
277            c_has_a_eq_b => 0,
278            c_has_a_gt_b => 1)
279          port map (
280            a => sig_A_COMPARE,
281            b => sig_B_COMPARE,
282            a_gt_b => sig_A_GT_B_S);
283
284        a_gt_b_u : c_compare_v9_0
285          generic map (
286            c_width      => 32,
287            c_data_type  => 1,                -- 0 = signed, 1 = unsigned
288            c_has_a_eq_b => 0,
289            c_has_a_gt_b => 1)
290          port map (
291            a => sig_A_COMPARE,
292            b => sig_B_COMPARE,
293            a_gt_b => sig_A_GT_B_U);
294
295        a_eq_b : c_compare_v9_0
296          generic map (                       -- sign doesn't matter for equality
297            c_width      => 32,
298            c_has_a_eq_b => 1,
299            c_has_a_gt_b => 0)
300          port map (
301            a => sig_A_COMPARE,
302            b => sig_B_COMPARE,
303            a_eq_b => sig_A_EQ_B);
304
305        sig_IS_SIGNED <= reg_EXECUTE_IN_OPERATION(6);
306        sig_A_GT_B <=
307                sig_A_GT_B_S when (sig_IS_SIGNED = '1') else
308                sig_A_GT_B_U;
309        sig_A_GE_B <= sig_A_GT_B or sig_A_EQ_B;
310        sig_A_NE_B <= not sig_A_EQ_B;
311       
312        sig_FLAG_F <=
313                (sig_A_EQ_B and reg_EXECUTE_IN_OPERATION(4)) or
314                (sig_A_NE_B and reg_EXECUTE_IN_OPERATION(5)) or
315                (sig_A_GE_B and reg_EXECUTE_IN_OPERATION(0)) or
316                (sig_A_GT_B and reg_EXECUTE_IN_OPERATION(1));
317       
318       
319        --
320        -- BRANCH
321        --
322        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);
323        sig_RES_BRANCH <=
324                reg_EXECUTE_IN_IMMEDIAT(29 downto 0) & "00"when (reg_EXECUTE_IN_OPERATION(3) = '1') else
325                "00000000000000000000000000000000";
326        sig_ADDR_BRANCH <=
327                reg_EXECUTE_IN_DATA_RB(31 downto 2) when (reg_EXECUTE_IN_OPERATION(3) = '1') else
328                reg_EXECUTE_IN_IMMEDIAT(29 downto 0);
329       
330        --
331        -- SHIFTER
332        --
333        -- Instance shifter
334        instance_Functionnal_unit_0_shifter : Functionnal_unit_0_shifter
335        port map (
336                  in_SHIFTER_0_DATA             =>      reg_EXECUTE_IN_DATA_RA
337                , in_SHIFTER_0_SHIFT            =>      sig_B_OPERAND(4 downto 0)
338                , in_SHIFTER_0_DIRECTION        =>      reg_EXECUTE_IN_OPERATION(0)
339                , in_SHIFTER_0_TYPE             =>      reg_EXECUTE_IN_OPERATION(1)
340                , in_SHIFTER_0_CARRY            =>      reg_EXECUTE_IN_OPERATION(2)
341                ,out_SHIFTER_0_DATA             =>      sig_RES_SHIFTER
342        );
343       
344       
345        --
346        -- EXTEND
347        --
348        sig_EXT_BYTE_S <=
349                "111111111111111111111111" & reg_EXECUTE_IN_DATA_RA (7 downto 0) when (reg_EXECUTE_IN_DATA_RA (7) = '1') else
350                "000000000000000000000000" & reg_EXECUTE_IN_DATA_RA (7 downto 0);
351       
352        sig_EXT_BYTE_Z <=
353                "000000000000000000000000" & reg_EXECUTE_IN_DATA_RA (7 downto 0);
354       
355        sig_EXT_HALF_WORD_S <=
356                "1111111111111111" & reg_EXECUTE_IN_DATA_RA (15 downto 0) when (reg_EXECUTE_IN_DATA_RA (15) = '1') else
357                "0000000000000000" & reg_EXECUTE_IN_DATA_RA (15 downto 0);
358       
359        sig_EXT_HALF_WORD_Z <=
360                "0000000000000000" & reg_EXECUTE_IN_DATA_RA (15 downto 0);
361       
362        sig_EXT_WORD_S <=
363                "" & reg_EXECUTE_IN_DATA_RA (31 downto 0) when (reg_EXECUTE_IN_DATA_RA (31) = '1') else
364                "" & reg_EXECUTE_IN_DATA_RA (31 downto 0);
365       
366        sig_EXT_WORD_Z <=
367                "" & reg_EXECUTE_IN_DATA_RA (31 downto 0);
368       
369        sig_EXT_S <=
370                sig_EXT_BYTE_S      when (reg_EXECUTE_IN_IMMEDIAT = 8)  else
371                sig_EXT_HALF_WORD_S when (reg_EXECUTE_IN_IMMEDIAT = 16) else
372                sig_EXT_WORD_S;
373       
374        sig_EXT_Z <=
375                sig_EXT_BYTE_Z      when (reg_EXECUTE_IN_IMMEDIAT = 8)  else
376                sig_EXT_HALF_WORD_Z when (reg_EXECUTE_IN_IMMEDIAT = 16) else
377                sig_EXT_WORD_Z;
378       
379        sig_RES_EXTEND <=
380                sig_EXT_Z      when (reg_EXECUTE_IN_OPERATION(0) = '1')  else
381                sig_EXT_S;
382       
383       
384        --
385        -- FIND
386        --
387        sig_FF1 <=
388                "000001"        when (reg_EXECUTE_IN_DATA_RA (0) = '1')         else
389                "000010"        when (reg_EXECUTE_IN_DATA_RA (1) = '1')         else
390                "000011"        when (reg_EXECUTE_IN_DATA_RA (2) = '1')         else
391                "000100"        when (reg_EXECUTE_IN_DATA_RA (3) = '1')         else
392                "000101"        when (reg_EXECUTE_IN_DATA_RA (4) = '1')         else
393                "000110"        when (reg_EXECUTE_IN_DATA_RA (5) = '1')         else
394                "000111"        when (reg_EXECUTE_IN_DATA_RA (6) = '1')         else
395                "001000"        when (reg_EXECUTE_IN_DATA_RA (7) = '1')         else
396                "001001"        when (reg_EXECUTE_IN_DATA_RA (8) = '1')         else
397                "001010"        when (reg_EXECUTE_IN_DATA_RA (9) = '1')         else
398                "001011"        when (reg_EXECUTE_IN_DATA_RA (10) = '1')        else
399                "001100"        when (reg_EXECUTE_IN_DATA_RA (11) = '1')        else
400                "001101"        when (reg_EXECUTE_IN_DATA_RA (12) = '1')        else
401                "001110"        when (reg_EXECUTE_IN_DATA_RA (13) = '1')        else
402                "001111"        when (reg_EXECUTE_IN_DATA_RA (14) = '1')        else
403                "010000"        when (reg_EXECUTE_IN_DATA_RA (15) = '1')        else
404                "010001"        when (reg_EXECUTE_IN_DATA_RA (16) = '1')        else
405                "010010"        when (reg_EXECUTE_IN_DATA_RA (17) = '1')        else
406                "010011"        when (reg_EXECUTE_IN_DATA_RA (18) = '1')        else
407                "010100"        when (reg_EXECUTE_IN_DATA_RA (19) = '1')        else
408                "010101"        when (reg_EXECUTE_IN_DATA_RA (20) = '1')        else
409                "010110"        when (reg_EXECUTE_IN_DATA_RA (21) = '1')        else
410                "010111"        when (reg_EXECUTE_IN_DATA_RA (22) = '1')        else
411                "011000"        when (reg_EXECUTE_IN_DATA_RA (23) = '1')        else
412                "011001"        when (reg_EXECUTE_IN_DATA_RA (24) = '1')        else
413                "011010"        when (reg_EXECUTE_IN_DATA_RA (25) = '1')        else
414                "011011"        when (reg_EXECUTE_IN_DATA_RA (26) = '1')        else
415                "011100"        when (reg_EXECUTE_IN_DATA_RA (27) = '1')        else
416                "011101"        when (reg_EXECUTE_IN_DATA_RA (28) = '1')        else
417                "011110"        when (reg_EXECUTE_IN_DATA_RA (29) = '1')        else
418                "011111"        when (reg_EXECUTE_IN_DATA_RA (30) = '1')        else
419                "100000"        when (reg_EXECUTE_IN_DATA_RA (31) = '1')        else
420                "000000";
421       
422        sig_FL1 <=
423                "100000"        when (reg_EXECUTE_IN_DATA_RA (31) = '1')        else
424                "011111"        when (reg_EXECUTE_IN_DATA_RA (30) = '1')        else
425                "011110"        when (reg_EXECUTE_IN_DATA_RA (29) = '1')        else
426                "011101"        when (reg_EXECUTE_IN_DATA_RA (28) = '1')        else
427                "011100"        when (reg_EXECUTE_IN_DATA_RA (27) = '1')        else
428                "011011"        when (reg_EXECUTE_IN_DATA_RA (26) = '1')        else
429                "011010"        when (reg_EXECUTE_IN_DATA_RA (25) = '1')        else
430                "011001"        when (reg_EXECUTE_IN_DATA_RA (24) = '1')        else
431                "011000"        when (reg_EXECUTE_IN_DATA_RA (23) = '1')        else
432                "010111"        when (reg_EXECUTE_IN_DATA_RA (22) = '1')        else
433                "010110"        when (reg_EXECUTE_IN_DATA_RA (21) = '1')        else
434                "010101"        when (reg_EXECUTE_IN_DATA_RA (20) = '1')        else
435                "010100"        when (reg_EXECUTE_IN_DATA_RA (19) = '1')        else
436                "010011"        when (reg_EXECUTE_IN_DATA_RA (18) = '1')        else
437                "010010"        when (reg_EXECUTE_IN_DATA_RA (17) = '1')        else
438                "010001"        when (reg_EXECUTE_IN_DATA_RA (16) = '1')        else
439                "010000"        when (reg_EXECUTE_IN_DATA_RA (15) = '1')        else
440                "001111"        when (reg_EXECUTE_IN_DATA_RA (14) = '1')        else
441                "001110"        when (reg_EXECUTE_IN_DATA_RA (13) = '1')        else
442                "001101"        when (reg_EXECUTE_IN_DATA_RA (12) = '1')        else
443                "001100"        when (reg_EXECUTE_IN_DATA_RA (11) = '1')        else
444                "001011"        when (reg_EXECUTE_IN_DATA_RA (10) = '1')        else
445                "001010"        when (reg_EXECUTE_IN_DATA_RA (9) = '1')         else
446                "001001"        when (reg_EXECUTE_IN_DATA_RA (8) = '1')         else
447                "001000"        when (reg_EXECUTE_IN_DATA_RA (7) = '1')         else
448                "000111"        when (reg_EXECUTE_IN_DATA_RA (6) = '1')         else
449                "000110"        when (reg_EXECUTE_IN_DATA_RA (5) = '1')         else
450                "000101"        when (reg_EXECUTE_IN_DATA_RA (4) = '1')         else
451                "000100"        when (reg_EXECUTE_IN_DATA_RA (3) = '1')         else
452                "000011"        when (reg_EXECUTE_IN_DATA_RA (2) = '1')         else
453                "000010"        when (reg_EXECUTE_IN_DATA_RA (1) = '1')         else
454                "000001"        when (reg_EXECUTE_IN_DATA_RA (0) = '1')         else
455                "000000";
456       
457        sig_RES_FIND <=
458                "00000000000000000000000000"&sig_FF1      when (reg_EXECUTE_IN_OPERATION(0) = '1')  else
459                "00000000000000000000000000"&sig_FL1;
460       
461       
462        --
463        -- SPECIAL
464        --
465        sig_SPR_IS_HERE <=
466                '1' when (sig_A_OR_B(15 downto 0) = "00101") else
467                '0';
468        -- MFSPR
469        sig_MFSPR <=
470                reg_MACLO(0) when (sig_SPR_IS_HERE = '1' and sig_A_OR_B(10 downto 0) = "00000000001") else
471                reg_MACHI(0) when (sig_SPR_IS_HERE = '1' and sig_A_OR_B(10 downto 0) = "00000000010") else
472                "00000000000000000000000000000000";
473       
474       
475        -- MTSPR
476        process (in_CLOCK)
477        begin
478                if in_CLOCK'event and in_CLOCK = '1' then
479                        if (sig_SPR_IS_HERE = '1') then
480                                if (sig_A_OR_B(10 downto 0) = "00000000001") then
481                                        reg_MACLO(0) <= reg_EXECUTE_IN_DATA_RB;
482                                end if;
483                                if (sig_A_OR_B(10 downto 0) = "00000000010") then
484                                        reg_MACHI(0) <= reg_EXECUTE_IN_DATA_RB;
485                                end if;
486                        end if;
487                end if;
488        end process;
489       
490        sig_RES_SPECIAL <=
491                sig_MFSPR when (reg_EXECUTE_IN_OPERATION = "0000001")  else
492                reg_EXECUTE_IN_DATA_RB when (reg_EXECUTE_IN_OPERATION = "0000010")  else
493                "00000000000000000000000000000000";
494       
495       
496        --
497        -- TRANSACTION
498        --
499        sig_EXECUTE_OUT_VAL <= reg_BUSY_OUT;
500        sig_EXECUTE_OUT_UPDATE <= not reg_BUSY_OUT or (in_EXECUTE_OUT_ACK);
501--      sig_EXECUTE_OUT_UPDATE <= not reg_BUSY_OUT or (reg_BUSY_OUT and in_EXECUTE_OUT_ACK);
502        sig_EXECUTE_IN_ACK <= not reg_BUSY_IN or (reg_BUSY_IN and sig_EXECUTE_OUT_UPDATE);
503       
504        --
505        -- -----------------------------------
506        -- --                                 
507        -- -----------------------------------
508        --
509       
510        sig_EXECUTE_OUT_OOO_ENGINE_ID <= reg_EXECUTE_IN_OOO_ENGINE_ID;
511        sig_EXECUTE_OUT_PACKET_ID <= reg_EXECUTE_IN_PACKET_ID;
512        sig_EXECUTE_OUT_WRITE_RD <=  reg_EXECUTE_IN_WRITE_RD;
513        sig_EXECUTE_OUT_NUM_REG_RD <= reg_EXECUTE_IN_NUM_REG_RD;
514        with reg_EXECUTE_IN_TYPE select
515        sig_EXECUTE_OUT_DATA_RD <=
516                sig_RES_ALU when "00000",
517                sig_RES_MOVE when "00010",
518                sig_RES_BRANCH when "01010",
519                sig_RES_SHIFTER when "00001",
520                sig_RES_EXTEND when "00110",
521                sig_RES_FIND when "00111",
522                sig_RES_SPECIAL when "01000",
523                "00000000000000000000000000000000" when others;
524        sig_EXECUTE_OUT_WRITE_RE <= reg_EXECUTE_IN_WRITE_RE;
525        sig_EXECUTE_OUT_NUM_REG_RE <= reg_EXECUTE_IN_NUM_REG_RE;
526        with reg_EXECUTE_IN_TYPE select
527        sig_EXECUTE_OUT_DATA_RE <=
528                sig_COUT_ALU & sig_OVR_ALU when "00000",
529                '0' & sig_FLAG_F when "00011",
530                "00" when others;
531        sig_EXECUTE_OUT_EXCEPTION <=
532                "01011" when (reg_EXECUTE_IN_TYPE = "00000" and sig_OVR_ALU = '1') else
533                "10011" when (reg_EXECUTE_IN_TYPE = "01000" and reg_EXECUTE_IN_OPERATION = "0000001" and sig_SPR_IS_HERE = '0') else
534                "10100" when (reg_EXECUTE_IN_TYPE = "01000" and reg_EXECUTE_IN_OPERATION = "0000010" and sig_SPR_IS_HERE = '0') else
535                "00000";
536        with reg_EXECUTE_IN_TYPE select
537        sig_EXECUTE_OUT_NO_SEQUENCE <=
538                sig_NOSQ_BRANCH when "01010",
539                '0'when others;
540        with reg_EXECUTE_IN_TYPE select
541        sig_EXECUTE_OUT_ADDRESS <=
542                sig_ADDR_BRANCH when "01010",
543                sig_A_OR_B(29 downto 0) when "01000",
544                "000000000000000000000000000000" when others;
545       
546        --
547        -- -----------------------------------
548        -- -- Outputs                         
549        -- -----------------------------------
550        --
551       
552        out_EXECUTE_OUT_OOO_ENGINE_ID <= reg_EXECUTE_OUT_OOO_ENGINE_ID;
553        out_EXECUTE_OUT_PACKET_ID <= reg_EXECUTE_OUT_PACKET_ID;
554        out_EXECUTE_OUT_WRITE_RD <=  reg_EXECUTE_OUT_WRITE_RD;
555        out_EXECUTE_OUT_NUM_REG_RD <= reg_EXECUTE_OUT_NUM_REG_RD;
556        out_EXECUTE_OUT_DATA_RD <= reg_EXECUTE_OUT_DATA_RD;
557        out_EXECUTE_OUT_WRITE_RE <= reg_EXECUTE_OUT_WRITE_RE;
558        out_EXECUTE_OUT_NUM_REG_RE <= reg_EXECUTE_OUT_NUM_REG_RE;
559        out_EXECUTE_OUT_DATA_RE <= reg_EXECUTE_OUT_DATA_RE;
560        out_EXECUTE_OUT_EXCEPTION <= reg_EXECUTE_OUT_EXCEPTION;
561        out_EXECUTE_OUT_NO_SEQUENCE <= reg_EXECUTE_OUT_NO_SEQUENCE;
562        out_EXECUTE_OUT_ADDRESS <= reg_EXECUTE_OUT_ADDRESS;
563        out_EXECUTE_OUT_VAL <= sig_EXECUTE_OUT_VAL;
564        out_EXECUTE_IN_ACK <= sig_EXECUTE_IN_ACK;
565
566end behavioural;
567
Note: See TracBrowser for help on using the repository browser.