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 @ 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: 34.6 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        signal sig_BUSY         : std_logic;
157
158        type TFQUEUE    is array (7 downto 0) of std_logic_vector(131 downto 0);
159        -- OOO_ENGINE_ID(1) + PACKET_ID(8) + OPERATION(7) + TYPE(5) +
160        -- HAS_IMMEDIAT(1) + IMMEDIAT(32) + DATA_RA(32) + DATA_RB(32) + DATA_RC(2) +
161        -- WRITE_RD(1) + NUM_REG_RD(5) + WRITE_RE(1) + NUM_REG_RE(4) + VALID(1)
162        -- = 132 BITS
163        signal reg_FUNCTIONAL_QUEUE             : TFQUEUE;
164
165
166
167        alias reg_OOO_ENGINE_ID_7       : std_logic     is reg_FUNCTIONAL_QUEUE(7)(131);
168        alias reg_OOO_ENGINE_ID_6       : std_logic     is reg_FUNCTIONAL_QUEUE(6)(131);
169        alias reg_OOO_ENGINE_ID_5       : std_logic     is reg_FUNCTIONAL_QUEUE(5)(131);
170        alias reg_OOO_ENGINE_ID_4       : std_logic     is reg_FUNCTIONAL_QUEUE(4)(131);
171        alias reg_OOO_ENGINE_ID_3       : std_logic     is reg_FUNCTIONAL_QUEUE(3)(131);
172        alias reg_OOO_ENGINE_ID_2       : std_logic     is reg_FUNCTIONAL_QUEUE(2)(131);
173        alias reg_OOO_ENGINE_ID_1       : std_logic     is reg_FUNCTIONAL_QUEUE(1)(131);
174        alias reg_OOO_ENGINE_ID_0       : std_logic     is reg_FUNCTIONAL_QUEUE(0)(131);
175        alias reg_PACKET_ID_7   : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(7)(130 downto 123);
176        alias reg_PACKET_ID_6   : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(6)(130 downto 123);
177        alias reg_PACKET_ID_5   : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(5)(130 downto 123);
178        alias reg_PACKET_ID_4   : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(4)(130 downto 123);
179        alias reg_PACKET_ID_3   : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(3)(130 downto 123);
180        alias reg_PACKET_ID_2   : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(2)(130 downto 123);
181        alias reg_PACKET_ID_1   : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(1)(130 downto 123);
182        alias reg_PACKET_ID_0   : std_logic_vector(7 downto 0)  is reg_FUNCTIONAL_QUEUE(0)(130 downto 123);
183        alias reg_OPERATION_7   : std_logic_vector(6 downto 0)  is reg_FUNCTIONAL_QUEUE(7)(122 downto 116);
184        alias reg_OPERATION_6   : std_logic_vector(6 downto 0)  is reg_FUNCTIONAL_QUEUE(6)(122 downto 116);
185        alias reg_OPERATION_5   : std_logic_vector(6 downto 0)  is reg_FUNCTIONAL_QUEUE(5)(122 downto 116);
186        alias reg_OPERATION_4   : std_logic_vector(6 downto 0)  is reg_FUNCTIONAL_QUEUE(4)(122 downto 116);
187        alias reg_OPERATION_3   : std_logic_vector(6 downto 0)  is reg_FUNCTIONAL_QUEUE(3)(122 downto 116);
188        alias reg_OPERATION_2   : std_logic_vector(6 downto 0)  is reg_FUNCTIONAL_QUEUE(2)(122 downto 116);
189        alias reg_OPERATION_1   : std_logic_vector(6 downto 0)  is reg_FUNCTIONAL_QUEUE(1)(122 downto 116);
190
191        alias reg_TYPE_7        : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(7)(115 downto 111);
192        alias reg_TYPE_6        : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(6)(115 downto 111);
193        alias reg_TYPE_5        : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(5)(115 downto 111);
194        alias reg_TYPE_4        : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(4)(115 downto 111);
195        alias reg_TYPE_3        : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(3)(115 downto 111);
196        alias reg_TYPE_2        : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(2)(115 downto 111);
197        alias reg_TYPE_1        : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(1)(115 downto 111);
198
199        alias reg_HAS_IMMEDIAT_7        : std_logic     is reg_FUNCTIONAL_QUEUE(7)(110);
200        alias reg_HAS_IMMEDIAT_6        : std_logic     is reg_FUNCTIONAL_QUEUE(6)(110);
201        alias reg_HAS_IMMEDIAT_5        : std_logic     is reg_FUNCTIONAL_QUEUE(5)(110);
202        alias reg_HAS_IMMEDIAT_4        : std_logic     is reg_FUNCTIONAL_QUEUE(4)(110);
203        alias reg_HAS_IMMEDIAT_3        : std_logic     is reg_FUNCTIONAL_QUEUE(3)(110);
204        alias reg_HAS_IMMEDIAT_2        : std_logic     is reg_FUNCTIONAL_QUEUE(2)(110);
205        alias reg_HAS_IMMEDIAT_1        : std_logic     is reg_FUNCTIONAL_QUEUE(1)(110);
206
207        alias reg_IMMEDIAT_7    : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(7)(109 downto 78);
208        alias reg_IMMEDIAT_6    : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(6)(109 downto 78);
209        alias reg_IMMEDIAT_5    : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(5)(109 downto 78);
210        alias reg_IMMEDIAT_4    : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(4)(109 downto 78);
211        alias reg_IMMEDIAT_3    : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(3)(109 downto 78);
212        alias reg_IMMEDIAT_2    : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(2)(109 downto 78);
213        alias reg_IMMEDIAT_1    : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(1)(109 downto 78);
214
215        alias reg_DATA_RA_7     : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(7)(77 downto 46);
216        alias reg_DATA_RA_6     : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(6)(77 downto 46);
217        alias reg_DATA_RA_5     : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(5)(77 downto 46);
218        alias reg_DATA_RA_4     : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(4)(77 downto 46);
219        alias reg_DATA_RA_3     : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(3)(77 downto 46);
220        alias reg_DATA_RA_2     : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(2)(77 downto 46);
221        alias reg_DATA_RA_1     : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(1)(77 downto 46);
222
223        alias reg_DATA_RB_7     : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(7)(45 downto 14);
224        alias reg_DATA_RB_6     : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(6)(45 downto 14);
225        alias reg_DATA_RB_5     : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(5)(45 downto 14);
226        alias reg_DATA_RB_4     : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(4)(45 downto 14);
227        alias reg_DATA_RB_3     : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(3)(45 downto 14);
228        alias reg_DATA_RB_2     : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(2)(45 downto 14);
229        alias reg_DATA_RB_1     : std_logic_vector(31 downto 0) is reg_FUNCTIONAL_QUEUE(1)(45 downto 14);
230
231        alias reg_DATA_RC_7     : std_logic_vector(1 downto 0)  is reg_FUNCTIONAL_QUEUE(7)(13 downto 12);
232        alias reg_DATA_RC_6     : std_logic_vector(1 downto 0)  is reg_FUNCTIONAL_QUEUE(6)(13 downto 12);
233        alias reg_DATA_RC_5     : std_logic_vector(1 downto 0)  is reg_FUNCTIONAL_QUEUE(5)(13 downto 12);
234        alias reg_DATA_RC_4     : std_logic_vector(1 downto 0)  is reg_FUNCTIONAL_QUEUE(4)(13 downto 12);
235        alias reg_DATA_RC_3     : std_logic_vector(1 downto 0)  is reg_FUNCTIONAL_QUEUE(3)(13 downto 12);
236        alias reg_DATA_RC_2     : std_logic_vector(1 downto 0)  is reg_FUNCTIONAL_QUEUE(2)(13 downto 12);
237        alias reg_DATA_RC_1     : std_logic_vector(1 downto 0)  is reg_FUNCTIONAL_QUEUE(1)(13 downto 12);
238
239        alias reg_WRITE_RD_7    : std_logic     is reg_FUNCTIONAL_QUEUE(7)(11);
240        alias reg_WRITE_RD_6    : std_logic     is reg_FUNCTIONAL_QUEUE(6)(11);
241        alias reg_WRITE_RD_5    : std_logic     is reg_FUNCTIONAL_QUEUE(5)(11);
242        alias reg_WRITE_RD_4    : std_logic     is reg_FUNCTIONAL_QUEUE(4)(11);
243        alias reg_WRITE_RD_3    : std_logic     is reg_FUNCTIONAL_QUEUE(3)(11);
244        alias reg_WRITE_RD_2    : std_logic     is reg_FUNCTIONAL_QUEUE(2)(11);
245        alias reg_WRITE_RD_1    : std_logic     is reg_FUNCTIONAL_QUEUE(1)(11);
246        alias reg_WRITE_RD_0    : std_logic     is reg_FUNCTIONAL_QUEUE(0)(11);
247        alias reg_NUM_REG_RD_7  : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(7)(10 downto 6);
248        alias reg_NUM_REG_RD_6  : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(6)(10 downto 6);
249        alias reg_NUM_REG_RD_5  : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(5)(10 downto 6);
250        alias reg_NUM_REG_RD_4  : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(4)(10 downto 6);
251        alias reg_NUM_REG_RD_3  : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(3)(10 downto 6);
252        alias reg_NUM_REG_RD_2  : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(2)(10 downto 6);
253        alias reg_NUM_REG_RD_1  : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(1)(10 downto 6);
254        alias reg_NUM_REG_RD_0  : std_logic_vector(4 downto 0)  is reg_FUNCTIONAL_QUEUE(0)(10 downto 6);
255        alias reg_WRITE_RE_7    : std_logic     is reg_FUNCTIONAL_QUEUE(7)(5);
256        alias reg_WRITE_RE_6    : std_logic     is reg_FUNCTIONAL_QUEUE(6)(5);
257        alias reg_WRITE_RE_5    : std_logic     is reg_FUNCTIONAL_QUEUE(5)(5);
258        alias reg_WRITE_RE_4    : std_logic     is reg_FUNCTIONAL_QUEUE(4)(5);
259        alias reg_WRITE_RE_3    : std_logic     is reg_FUNCTIONAL_QUEUE(3)(5);
260        alias reg_WRITE_RE_2    : std_logic     is reg_FUNCTIONAL_QUEUE(2)(5);
261        alias reg_WRITE_RE_1    : std_logic     is reg_FUNCTIONAL_QUEUE(1)(5);
262        alias reg_WRITE_RE_0    : std_logic     is reg_FUNCTIONAL_QUEUE(0)(5);
263        alias reg_NUM_REG_RE_7  : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(7)(4 downto 1);
264        alias reg_NUM_REG_RE_6  : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(6)(4 downto 1);
265        alias reg_NUM_REG_RE_5  : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(5)(4 downto 1);
266        alias reg_NUM_REG_RE_4  : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(4)(4 downto 1);
267        alias reg_NUM_REG_RE_3  : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(3)(4 downto 1);
268        alias reg_NUM_REG_RE_2  : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(2)(4 downto 1);
269        alias reg_NUM_REG_RE_1  : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(1)(4 downto 1);
270        alias reg_NUM_REG_RE_0  : std_logic_vector(3 downto 0)  is reg_FUNCTIONAL_QUEUE(0)(4 downto 1);
271        alias reg_VALID_7       : std_logic     is reg_FUNCTIONAL_QUEUE(7)(0);
272        alias reg_VALID_6       : std_logic     is reg_FUNCTIONAL_QUEUE(6)(0);
273        alias reg_VALID_5       : std_logic     is reg_FUNCTIONAL_QUEUE(5)(0);
274        alias reg_VALID_4       : std_logic     is reg_FUNCTIONAL_QUEUE(4)(0);
275        alias reg_VALID_3       : std_logic     is reg_FUNCTIONAL_QUEUE(3)(0);
276        alias reg_VALID_2       : std_logic     is reg_FUNCTIONAL_QUEUE(2)(0);
277        alias reg_VALID_1       : std_logic     is reg_FUNCTIONAL_QUEUE(1)(0);
278        alias reg_VALID_0       : std_logic     is reg_FUNCTIONAL_QUEUE(0)(0);
279
280        -- OOO_ENGINE_ID(1) + PACKET_ID(8) + OPERATION(7) + TYPE (5) +
281        -- HAS_IMMEDIAT (1) + DATA_RA (32) + DATA_RB (32) + DATA_RC (2) +
282        -- WRITE_RD(1) + NUM_REG_RD(5) + WRITE_RE(1) + NUM_REG_RE(4) + VALID(1)
283        -- = 100 BITS
284
285begin
286       
287        --
288        -- -----------------------------------
289        -- -- Registers                       
290        -- -----------------------------------
291        --
292
293        process (in_CLOCK)
294        begin
295                if in_CLOCK'event and in_CLOCK = '1' then
296                        if (in_NRESET = '0') then
297                                reg_BUSY_IN <= '0';
298                                reg_BUSY_OUT <= '0';
299                        else
300                                -- Input
301                                if (sig_EXECUTE_IN_ACK = '1') then
302                                        if (in_EXECUTE_IN_OPERATION = "00100") then
303                                                reg_VALID_7 <= in_EXECUTE_IN_VAL;
304                                                reg_NUM_REG_RE_7 <= in_EXECUTE_IN_NUM_REG_RE;
305                                                reg_WRITE_RE_7 <= in_EXECUTE_IN_WRITE_RE;
306                                                reg_NUM_REG_RD_7 <= in_EXECUTE_IN_NUM_REG_RD;
307                                                reg_WRITE_RD_7 <= in_EXECUTE_IN_WRITE_RD;
308                                                reg_DATA_RC_7 <= in_EXECUTE_IN_DATA_RC;
309                                                reg_DATA_RB_7 <= in_EXECUTE_IN_DATA_RB;
310                                                reg_DATA_RA_7 <= in_EXECUTE_IN_DATA_RA;
311                                                reg_IMMEDIAT_7 <= in_EXECUTE_IN_IMMEDIAT;
312                                                reg_HAS_IMMEDIAT_7 <= in_EXECUTE_IN_HAS_IMMEDIAT;
313                                                reg_TYPE_7 <= in_EXECUTE_IN_TYPE;
314                                                reg_OPERATION_7 <= in_EXECUTE_IN_OPERATION;
315                                                reg_PACKET_ID_7 <= in_EXECUTE_IN_PACKET_ID;
316                                                reg_OOO_ENGINE_ID_7 <= in_EXECUTE_IN_OOO_ENGINE_ID;
317                                        else
318                                                reg_VALID_1 <= in_EXECUTE_IN_VAL;
319                                                reg_NUM_REG_RE_1 <= in_EXECUTE_IN_NUM_REG_RE;
320                                                reg_WRITE_RE_1 <= in_EXECUTE_IN_WRITE_RE;
321                                                reg_NUM_REG_RD_1 <= in_EXECUTE_IN_NUM_REG_RD;
322                                                reg_WRITE_RD_1 <= in_EXECUTE_IN_WRITE_RD;
323                                                reg_DATA_RC_1 <= in_EXECUTE_IN_DATA_RC;
324                                                reg_DATA_RB_1 <= in_EXECUTE_IN_DATA_RB;
325                                                reg_DATA_RA_1 <= in_EXECUTE_IN_DATA_RA;
326                                                reg_IMMEDIAT_1 <= in_EXECUTE_IN_IMMEDIAT;
327                                                reg_HAS_IMMEDIAT_1 <= in_EXECUTE_IN_HAS_IMMEDIAT;
328                                                reg_TYPE_1 <= in_EXECUTE_IN_TYPE;
329                                                reg_OPERATION_1 <= in_EXECUTE_IN_OPERATION;
330                                                reg_PACKET_ID_1 <= in_EXECUTE_IN_PACKET_ID;
331                                                reg_OOO_ENGINE_ID_1 <= in_EXECUTE_IN_OOO_ENGINE_ID;
332
333                                        end if;
334                                end if;
335                                if (sig_EXECUTE_OUT_UPDATE = '1') then
336                                        reg_VALID_0         <= reg_VALID_1;
337                                        reg_NUM_REG_RE_0    <= reg_NUM_REG_RE_1;
338                                        reg_WRITE_RE_0      <= reg_WRITE_RE_1;
339                                        reg_NUM_REG_RD_0    <= reg_NUM_REG_RD_1;
340                                        reg_WRITE_RD_0      <= reg_WRITE_RD_1;
341                                        reg_DATA_RC_0       <= reg_DATA_RC_1;
342                                        reg_DATA_RB_0       <= reg_DATA_RB_1;
343                                        reg_DATA_RA_0       <= reg_DATA_RA_1;
344                                        reg_IMMEDIAT_0      <= reg_IMMEDIAT_1;
345                                        reg_HAS_IMMEDIAT_0  <= reg_HAS_IMMEDIAT_1;
346                                        reg_TYPE_0          <= reg_TYPE_1;
347                                        reg_OPERATION_0     <= reg_OPERATION_1;
348                                        reg_PACKET_ID_0     <= reg_PACKET_ID_1;
349                                        reg_OOO_ENGINE_ID_0 <= reg_OOO_ENGINE_ID_1;
350
351                                        reg_VALID_1         <= reg_VALID_2;
352                                        reg_NUM_REG_RE_1    <= reg_NUM_REG_RE_2;
353                                        reg_WRITE_RE_1      <= reg_WRITE_RE_2;
354                                        reg_NUM_REG_RD_1    <= reg_NUM_REG_RD_2;
355                                        reg_WRITE_RD_1      <= reg_WRITE_RD_2;
356                                        reg_DATA_RC_1       <= reg_DATA_RC_2;
357                                        reg_DATA_RB_1       <= reg_DATA_RB_2;
358                                        reg_DATA_RA_1       <= reg_DATA_RA_2;
359                                        reg_IMMEDIAT_1      <= reg_IMMEDIAT_2;
360                                        reg_HAS_IMMEDIAT_1  <= reg_HAS_IMMEDIAT_2;
361                                        reg_TYPE_1          <= reg_TYPE_2;
362                                        reg_OPERATION_1     <= reg_OPERATION_2;
363                                        reg_PACKET_ID_1     <= reg_PACKET_ID_2;
364                                        reg_OOO_ENGINE_ID_1 <= reg_OOO_ENGINE_ID_2;
365
366                                        reg_VALID_2         <= reg_VALID_3;
367                                        reg_NUM_REG_RE_2    <= reg_NUM_REG_RE_3;
368                                        reg_WRITE_RE_2      <= reg_WRITE_RE_3;
369                                        reg_NUM_REG_RD_2    <= reg_NUM_REG_RD_3;
370                                        reg_WRITE_RD_2      <= reg_WRITE_RD_3;
371                                        reg_DATA_RC_2       <= reg_DATA_RC_3;
372                                        reg_DATA_RB_2       <= reg_DATA_RB_3;
373                                        reg_DATA_RA_2       <= reg_DATA_RA_3;
374                                        reg_IMMEDIAT_2      <= reg_IMMEDIAT_3;
375                                        reg_HAS_IMMEDIAT_2  <= reg_HAS_IMMEDIAT_3;
376                                        reg_TYPE_2          <= reg_TYPE_3;
377                                        reg_OPERATION_2     <= reg_OPERATION_3;
378                                        reg_PACKET_ID_2     <= reg_PACKET_ID_3;
379                                        reg_OOO_ENGINE_ID_2 <= reg_OOO_ENGINE_ID_3;
380
381                                        reg_VALID_3         <= reg_VALID_4;
382                                        reg_NUM_REG_RE_3    <= reg_NUM_REG_RE_4;
383                                        reg_WRITE_RE_3      <= reg_WRITE_RE_4;
384                                        reg_NUM_REG_RD_3    <= reg_NUM_REG_RD_4;
385                                        reg_WRITE_RD_3      <= reg_WRITE_RD_4;
386                                        reg_DATA_RC_3       <= reg_DATA_RC_4;
387                                        reg_DATA_RB_3       <= reg_DATA_RB_4;
388                                        reg_DATA_RA_3       <= reg_DATA_RA_4;
389                                        reg_IMMEDIAT_3      <= reg_IMMEDIAT_4;
390                                        reg_HAS_IMMEDIAT_3  <= reg_HAS_IMMEDIAT_4;
391                                        reg_TYPE_3          <= reg_TYPE_4;
392                                        reg_OPERATION_3     <= reg_OPERATION_4;
393                                        reg_PACKET_ID_3     <= reg_PACKET_ID_4;
394                                        reg_OOO_ENGINE_ID_3 <= reg_OOO_ENGINE_ID_4;
395
396                                        reg_VALID_4         <= reg_VALID_5;
397                                        reg_NUM_REG_RE_4    <= reg_NUM_REG_RE_5;
398                                        reg_WRITE_RE_4      <= reg_WRITE_RE_5;
399                                        reg_NUM_REG_RD_4    <= reg_NUM_REG_RD_5;
400                                        reg_WRITE_RD_4      <= reg_WRITE_RD_5;
401                                        reg_DATA_RC_4       <= reg_DATA_RC_5;
402                                        reg_DATA_RB_4       <= reg_DATA_RB_5;
403                                        reg_DATA_RA_4       <= reg_DATA_RA_5;
404                                        reg_IMMEDIAT_4      <= reg_IMMEDIAT_5;
405                                        reg_HAS_IMMEDIAT_4  <= reg_HAS_IMMEDIAT_5;
406                                        reg_TYPE_4          <= reg_TYPE_5;
407                                        reg_OPERATION_4     <= reg_OPERATION_5;
408                                        reg_PACKET_ID_4     <= reg_PACKET_ID_5;
409                                        reg_OOO_ENGINE_ID_4 <= reg_OOO_ENGINE_ID_5;
410
411                                        reg_VALID_5         <= reg_VALID_6;
412                                        reg_NUM_REG_RE_5    <= reg_NUM_REG_RE_6;
413                                        reg_WRITE_RE_5      <= reg_WRITE_RE_6;
414                                        reg_NUM_REG_RD_5    <= reg_NUM_REG_RD_6;
415                                        reg_WRITE_RD_5      <= reg_WRITE_RD_6;
416                                        reg_DATA_RC_5       <= reg_DATA_RC_6;
417                                        reg_DATA_RB_5       <= reg_DATA_RB_6;
418                                        reg_DATA_RA_5       <= reg_DATA_RA_6;
419                                        reg_IMMEDIAT_5      <= reg_IMMEDIAT_6;
420                                        reg_HAS_IMMEDIAT_5  <= reg_HAS_IMMEDIAT_6;
421                                        reg_TYPE_5          <= reg_TYPE_6;
422                                        reg_OPERATION_5     <= reg_OPERATION_6;
423                                        reg_PACKET_ID_5     <= reg_PACKET_ID_6;
424                                        reg_OOO_ENGINE_ID_5 <= reg_OOO_ENGINE_ID_6;
425
426                                        reg_VALID_6         <= reg_VALID_7;
427                                        reg_NUM_REG_RE_6    <= reg_NUM_REG_RE_7;
428                                        reg_WRITE_RE_6      <= reg_WRITE_RE_7;
429                                        reg_NUM_REG_RD_6    <= reg_NUM_REG_RD_7;
430                                        reg_WRITE_RD_6      <= reg_WRITE_RD_7;
431                                        reg_DATA_RC_6       <= reg_DATA_RC_7;
432                                        reg_DATA_RB_6       <= reg_DATA_RB_7;
433                                        reg_DATA_RA_6       <= reg_DATA_RA_7;
434                                        reg_IMMEDIAT_6      <= reg_IMMEDIAT_7;
435                                        reg_HAS_IMMEDIAT_6  <= reg_HAS_IMMEDIAT_7;
436                                        reg_TYPE_6          <= reg_TYPE_7;
437                                        reg_OPERATION_6     <= reg_OPERATION_7;
438                                        reg_PACKET_ID_6     <= reg_PACKET_ID_7;
439                                        reg_OOO_ENGINE_ID_6 <= reg_OOO_ENGINE_ID_7;
440                                end if;
441                        end if;
442                end if;
443        end process;
444       
445        --
446        -- -----------------------------------
447        -- -- Insides                         
448        -- -----------------------------------
449        --
450       
451        sig_B_OPERAND <= reg_IMMEDIAT_1 when (reg_HAS_IMMEDIAT_1 = '1') else
452                reg_DATA_RB_1;
453        --
454        -- ALU
455        --
456        sig_IS_ARITH <= reg_OPERATION_1(0) or reg_OPERATION_1(1) or reg_OPERATION_1(2);
457        sig_IS_LOGIC <= reg_OPERATION_1(3) or reg_OPERATION_1(4) or reg_OPERATION_1(5);
458        sig_CIN_ARITH <= reg_DATA_RC_1(1) and reg_OPERATION_1(1);
459        sig_ARITH_B_OPERAND <= ((not sig_B_OPERAND) + 1) when (reg_OPERATION_1(2) = '1') else
460                sig_B_OPERAND;
461        sig_RES_ARITH <= ('0' & reg_DATA_RA_1) + ('0' & sig_ARITH_B_OPERAND) + ("000000000000000000000000000000" & sig_CIN_ARITH);
462       
463        sig_A_AND_B <= reg_DATA_RA_1 and sig_B_OPERAND;
464        sig_A_OR_B <= reg_DATA_RA_1 or sig_B_OPERAND;
465        sig_A_XOR_B <= reg_DATA_RA_1 xor sig_B_OPERAND;
466       
467        with reg_OPERATION_1 select
468        sig_RES_LOGIC <=
469                sig_A_AND_B when "0001000",
470                sig_A_OR_B  when "0010000",
471                sig_A_XOR_B when "0100000",
472                "00000000000000000000000000000000" when others;
473        sig_RES_ALU <=
474                sig_RES_ARITH (31 downto 0) when (sig_IS_ARITH = '1') else
475                sig_RES_LOGIC when (sig_IS_LOGIC = '1') else
476                "00000000000000000000000000000000";
477       
478        -- In ISA l.sub doesn't change carry flag.
479        sig_COUT_ALU <= (sig_RES_ARITH(32) and (reg_OPERATION_1(0) or reg_OPERATION_1(1))) or (reg_OPERATION_1(2) and reg_DATA_RC_1(1));
480        sig_OVR_ALU <= ((sig_ARITH_B_OPERAND(31) and reg_DATA_RA_1(31) and not sig_RES_ARITH(31)) or (not sig_ARITH_B_OPERAND(31) and not reg_DATA_RA_1(31) and sig_RES_ARITH(31))) and sig_IS_ARITH;
481       
482        --
483        -- MOVE
484        --
485        sig_MOVHI <= reg_IMMEDIAT_1(15 downto 0) & "0000000000000000";
486        sig_CMOV <=
487                reg_DATA_RA_1 when (reg_DATA_RC_1(0) = '1') else
488                reg_DATA_RB_1;
489        sig_RES_MOVE <=
490                sig_MOVHI when (reg_OPERATION_1(0) = '1') else
491                sig_CMOV when (reg_OPERATION_1(1) = '1') else
492                "00000000000000000000000000000000";
493       
494        --
495        -- TEST
496        --
497        sig_IS_LESS <= reg_OPERATION_1(3);
498        sig_A_COMPARE <=
499                sig_B_OPERAND when (sig_IS_LESS = '1') else
500                reg_DATA_RA_1;
501
502        sig_B_COMPARE <=
503                reg_DATA_RA_1 when (sig_IS_LESS = '1') else
504                sig_B_OPERAND;
505
506        a_gt_b_s : c_compare_v9_0
507          generic map (
508            c_width      => 32,
509            c_data_type  => 0,                -- 0 = signed, 1 = unsigned
510            c_has_a_eq_b => 0,
511            c_has_a_gt_b => 1)
512          port map (
513            a => sig_A_COMPARE,
514            b => sig_B_COMPARE,
515            a_gt_b => sig_A_GT_B_S);
516
517        a_gt_b_u : c_compare_v9_0
518          generic map (
519            c_width      => 32,
520            c_data_type  => 1,                -- 0 = signed, 1 = unsigned
521            c_has_a_eq_b => 0,
522            c_has_a_gt_b => 1)
523          port map (
524            a => sig_A_COMPARE,
525            b => sig_B_COMPARE,
526            a_gt_b => sig_A_GT_B_U);
527
528        a_eq_b : c_compare_v9_0
529          generic map (                       -- sign doesn't matter for
530                                              -- equality test
531            c_width      => 32,
532            c_has_a_eq_b => 1,
533            c_has_a_gt_b => 0)
534          port map (
535            a => sig_A_COMPARE,
536            b => sig_B_COMPARE,
537            a_eq_b => sig_A_EQ_B);
538
539        sig_IS_SIGNED <= reg_OPERATION_1(6);
540        sig_A_GT_B <=
541                sig_A_GT_B_S when (sig_IS_SIGNED = '1') else
542                sig_A_GT_B_U;
543        sig_A_GE_B <= sig_A_GT_B or sig_A_EQ_B;
544        sig_A_NE_B <= not sig_A_EQ_B;
545       
546        sig_FLAG_F <=
547                (sig_A_EQ_B and reg_OPERATION_1(4)) or
548                (sig_A_NE_B and reg_OPERATION_1(5)) or
549                (sig_A_GE_B and reg_OPERATION_1(0)) or
550                (sig_A_GT_B and reg_OPERATION_1(1));
551       
552       
553        --
554        -- BRANCH
555        --
556        sig_NOSQ_BRANCH <= (reg_DATA_RC_1(0) and reg_OPERATION_1(2)) or (not reg_DATA_RC_1(0) and reg_OPERATION_1(1)) or reg_OPERATION_1(3);
557        sig_RES_BRANCH <=
558                reg_IMMEDIAT_1(29 downto 0) & "00"when (reg_OPERATION_1(3) = '1') else
559                "00000000000000000000000000000000";
560        sig_ADDR_BRANCH <=
561                reg_DATA_RB_1(31 downto 2) when (reg_OPERATION_1(3) = '1') else
562                reg_IMMEDIAT_1(29 downto 0);
563       
564        --
565        -- SHIFTER
566        --
567        -- Instance shifter
568        instance_Functionnal_unit_0_shifter : Functionnal_unit_0_shifter
569        port map (
570                  in_SHIFTER_0_DATA             =>      reg_DATA_RA_1
571                , in_SHIFTER_0_SHIFT            =>      sig_B_OPERAND(4 downto 0)
572                , in_SHIFTER_0_DIRECTION        =>      reg_OPERATION_1(0)
573                , in_SHIFTER_0_TYPE             =>      reg_OPERATION_1(1)
574                , in_SHIFTER_0_CARRY            =>      reg_OPERATION_1(2)
575                ,out_SHIFTER_0_DATA             =>      sig_RES_SHIFTER
576        );
577       
578       
579        --
580        -- EXTEND
581        --
582        sig_EXT_BYTE_S <=
583                "111111111111111111111111" & reg_DATA_RA_1 (7 downto 0) when (reg_DATA_RA_1 (7) = '1') else
584                "000000000000000000000000" & reg_DATA_RA_1 (7 downto 0);
585       
586        sig_EXT_BYTE_Z <=
587                "000000000000000000000000" & reg_DATA_RA_1 (7 downto 0);
588       
589        sig_EXT_HALF_WORD_S <=
590                "1111111111111111" & reg_DATA_RA_1 (15 downto 0) when (reg_DATA_RA_1 (15) = '1') else
591                "0000000000000000" & reg_DATA_RA_1 (15 downto 0);
592       
593        sig_EXT_HALF_WORD_Z <=
594                "0000000000000000" & reg_DATA_RA_1 (15 downto 0);
595       
596        sig_EXT_WORD_S <=
597                "" & reg_DATA_RA_1 (31 downto 0) when (reg_DATA_RA_1 (31) = '1') else
598                "" & reg_DATA_RA_1 (31 downto 0);
599       
600        sig_EXT_WORD_Z <=
601                "" & reg_DATA_RA_1 (31 downto 0);
602       
603        sig_EXT_S <=
604                sig_EXT_BYTE_S      when (reg_IMMEDIAT_1 = 8)  else
605                sig_EXT_HALF_WORD_S when (reg_IMMEDIAT_1 = 16) else
606                sig_EXT_WORD_S;
607       
608        sig_EXT_Z <=
609                sig_EXT_BYTE_Z      when (reg_IMMEDIAT_1 = 8)  else
610                sig_EXT_HALF_WORD_Z when (reg_IMMEDIAT_1 = 16) else
611                sig_EXT_WORD_Z;
612       
613        sig_RES_EXTEND <=
614                sig_EXT_Z      when (reg_OPERATION_1(0) = '1')  else
615                sig_EXT_S;
616       
617       
618        --
619        -- FIND
620        --
621        sig_FF1 <=
622                "000001"        when (reg_DATA_RA_1 (0) = '1')  else
623                "000010"        when (reg_DATA_RA_1 (1) = '1')  else
624                "000011"        when (reg_DATA_RA_1 (2) = '1')  else
625                "000100"        when (reg_DATA_RA_1 (3) = '1')  else
626                "000101"        when (reg_DATA_RA_1 (4) = '1')  else
627                "000110"        when (reg_DATA_RA_1 (5) = '1')  else
628                "000111"        when (reg_DATA_RA_1 (6) = '1')  else
629                "001000"        when (reg_DATA_RA_1 (7) = '1')  else
630                "001001"        when (reg_DATA_RA_1 (8) = '1')  else
631                "001010"        when (reg_DATA_RA_1 (9) = '1')  else
632                "001011"        when (reg_DATA_RA_1 (10) = '1')         else
633                "001100"        when (reg_DATA_RA_1 (11) = '1')         else
634                "001101"        when (reg_DATA_RA_1 (12) = '1')         else
635                "001110"        when (reg_DATA_RA_1 (13) = '1')         else
636                "001111"        when (reg_DATA_RA_1 (14) = '1')         else
637                "010000"        when (reg_DATA_RA_1 (15) = '1')         else
638                "010001"        when (reg_DATA_RA_1 (16) = '1')         else
639                "010010"        when (reg_DATA_RA_1 (17) = '1')         else
640                "010011"        when (reg_DATA_RA_1 (18) = '1')         else
641                "010100"        when (reg_DATA_RA_1 (19) = '1')         else
642                "010101"        when (reg_DATA_RA_1 (20) = '1')         else
643                "010110"        when (reg_DATA_RA_1 (21) = '1')         else
644                "010111"        when (reg_DATA_RA_1 (22) = '1')         else
645                "011000"        when (reg_DATA_RA_1 (23) = '1')         else
646                "011001"        when (reg_DATA_RA_1 (24) = '1')         else
647                "011010"        when (reg_DATA_RA_1 (25) = '1')         else
648                "011011"        when (reg_DATA_RA_1 (26) = '1')         else
649                "011100"        when (reg_DATA_RA_1 (27) = '1')         else
650                "011101"        when (reg_DATA_RA_1 (28) = '1')         else
651                "011110"        when (reg_DATA_RA_1 (29) = '1')         else
652                "011111"        when (reg_DATA_RA_1 (30) = '1')         else
653                "100000"        when (reg_DATA_RA_1 (31) = '1')         else
654                "000000";
655       
656        sig_FL1 <=
657                "100000"        when (reg_DATA_RA_1 (31) = '1')         else
658                "011111"        when (reg_DATA_RA_1 (30) = '1')         else
659                "011110"        when (reg_DATA_RA_1 (29) = '1')         else
660                "011101"        when (reg_DATA_RA_1 (28) = '1')         else
661                "011100"        when (reg_DATA_RA_1 (27) = '1')         else
662                "011011"        when (reg_DATA_RA_1 (26) = '1')         else
663                "011010"        when (reg_DATA_RA_1 (25) = '1')         else
664                "011001"        when (reg_DATA_RA_1 (24) = '1')         else
665                "011000"        when (reg_DATA_RA_1 (23) = '1')         else
666                "010111"        when (reg_DATA_RA_1 (22) = '1')         else
667                "010110"        when (reg_DATA_RA_1 (21) = '1')         else
668                "010101"        when (reg_DATA_RA_1 (20) = '1')         else
669                "010100"        when (reg_DATA_RA_1 (19) = '1')         else
670                "010011"        when (reg_DATA_RA_1 (18) = '1')         else
671                "010010"        when (reg_DATA_RA_1 (17) = '1')         else
672                "010001"        when (reg_DATA_RA_1 (16) = '1')         else
673                "010000"        when (reg_DATA_RA_1 (15) = '1')         else
674                "001111"        when (reg_DATA_RA_1 (14) = '1')         else
675                "001110"        when (reg_DATA_RA_1 (13) = '1')         else
676                "001101"        when (reg_DATA_RA_1 (12) = '1')         else
677                "001100"        when (reg_DATA_RA_1 (11) = '1')         else
678                "001011"        when (reg_DATA_RA_1 (10) = '1')         else
679                "001010"        when (reg_DATA_RA_1 (9) = '1')  else
680                "001001"        when (reg_DATA_RA_1 (8) = '1')  else
681                "001000"        when (reg_DATA_RA_1 (7) = '1')  else
682                "000111"        when (reg_DATA_RA_1 (6) = '1')  else
683                "000110"        when (reg_DATA_RA_1 (5) = '1')  else
684                "000101"        when (reg_DATA_RA_1 (4) = '1')  else
685                "000100"        when (reg_DATA_RA_1 (3) = '1')  else
686                "000011"        when (reg_DATA_RA_1 (2) = '1')  else
687                "000010"        when (reg_DATA_RA_1 (1) = '1')  else
688                "000001"        when (reg_DATA_RA_1 (0) = '1')  else
689                "000000";
690       
691        sig_RES_FIND <=
692                "00000000000000000000000000"&sig_FF1      when (reg_OPERATION_1(0) = '1')  else
693                "00000000000000000000000000"&sig_FL1;
694       
695       
696        --
697        -- SPECIAL
698        --
699        sig_SPR_IS_HERE <=
700                '1' when (sig_A_OR_B(15 downto 0) = "00101") else
701                '0';
702        -- MFSPR
703        sig_MFSPR <=
704                reg_MACLO(0) when (sig_SPR_IS_HERE = '1' and sig_A_OR_B(10 downto 0) = "00000000001") else
705                reg_MACHI(0) when (sig_SPR_IS_HERE = '1' and sig_A_OR_B(10 downto 0) = "00000000010") else
706                "00000000000000000000000000000000";
707       
708       
709        -- MTSPR
710        process (in_CLOCK)
711        begin
712                if in_CLOCK'event and in_CLOCK = '1' then
713                        if (sig_SPR_IS_HERE = '1') then
714                                if (sig_A_OR_B(10 downto 0) = "00000000001") then
715                                        reg_MACLO(0) <= reg_DATA_RB_1;
716                                end if;
717                                if (sig_A_OR_B(10 downto 0) = "00000000010") then
718                                        reg_MACHI(0) <= reg_DATA_RB_1;
719                                end if;
720                        end if;
721                end if;
722        end process;
723       
724        sig_RES_SPECIAL <=
725                sig_MFSPR when (reg_OPERATION_1 = "0000001")  else
726                reg_DATA_RB_1 when (reg_OPERATION_1 = "0000010")  else
727                "00000000000000000000000000000000";
728       
729        --
730        -- TRANSACTION
731        --
732        sig_BUSY <=
733--              reg_FUNCTIONAL_QUEUE(34)(0) when in_EXECUTE_IN_OPERATION = "" else
734                reg_FUNCTIONAL_QUEUE(7)(0)  when in_EXECUTE_IN_OPERATION = "" else
735                reg_FUNCTIONAL_QUEUE(1)(0);
736        sig_EXECUTE_OUT_VAL <= reg_FUNCTIONAL_QUEUE(0)(0);
737        sig_EXECUTE_OUT_UPDATE <= not reg_FUNCTIONAL_QUEUE(0)(0) or in_EXECUTE_OUT_ACK;
738        sig_EXECUTE_IN_ACK <= not sig_BUSY or sig_EXECUTE_OUT_UPDATE;
739       
740        --
741        -- -----------------------------------
742        -- --                                 
743        -- -----------------------------------
744        --
745       
746        sig_EXECUTE_OUT_OOO_ENGINE_ID <= reg_OOO_ENGINE_ID_1;
747        sig_EXECUTE_OUT_PACKET_ID <= reg_EXECUTE_IN_PACKET_ID;
748        sig_EXECUTE_OUT_WRITE_RD <=  reg_WRITE_RD_1;
749        sig_EXECUTE_OUT_NUM_REG_RD <= reg_NUM_REG_RD_1;
750        with reg_TYPE_1 select
751        sig_EXECUTE_OUT_DATA_RD <=
752                sig_RES_ALU when "00000",
753                sig_RES_MOVE when "00010",
754                sig_RES_BRANCH when "01010",
755                sig_RES_SHIFTER when "00001",
756                sig_RES_EXTEND when "00110",
757                sig_RES_FIND when "00111",
758                sig_RES_SPECIAL when "01000",
759                "00000000000000000000000000000000" when others;
760        sig_EXECUTE_OUT_WRITE_RE <= reg_WRITE_RE_1;
761        sig_EXECUTE_OUT_NUM_REG_RE <= reg_NUM_REG_RE_1;
762        with reg_TYPE_1 select
763        sig_EXECUTE_OUT_DATA_RE <=
764                sig_COUT_ALU & sig_OVR_ALU when "00000",
765                '0' & sig_FLAG_F when "00011",
766                "00" when others;
767        sig_EXECUTE_OUT_EXCEPTION <=
768                "01011" when (reg_TYPE_1 = "00000" and sig_OVR_ALU = '1') else
769                "10011" when (reg_TYPE_1 = "01000" and reg_OPERATION_1 = "0000001" and sig_SPR_IS_HERE = '0') else
770                "10100" when (reg_TYPE_1 = "01000" and reg_OPERATION_1 = "0000010" and sig_SPR_IS_HERE = '0') else
771                "00000";
772        with reg_TYPE_1 select
773        sig_EXECUTE_OUT_NO_SEQUENCE <=
774                sig_NOSQ_BRANCH when "01010",
775                '0'when others;
776        with reg_TYPE_1 select
777        sig_EXECUTE_OUT_ADDRESS <=
778                sig_ADDR_BRANCH when "01010",
779                sig_A_OR_B(29 downto 0) when "01000",
780                "000000000000000000000000000000" when others;
781       
782        --
783        -- -----------------------------------
784        -- -- Outputs                         
785        -- -----------------------------------
786        --
787       
788        out_EXECUTE_OUT_OOO_ENGINE_ID <= reg_EXECUTE_OUT_OOO_ENGINE_ID;
789        out_EXECUTE_OUT_PACKET_ID <= reg_EXECUTE_OUT_PACKET_ID;
790        out_EXECUTE_OUT_WRITE_RD <=  reg_EXECUTE_OUT_WRITE_RD;
791        out_EXECUTE_OUT_NUM_REG_RD <= reg_EXECUTE_OUT_NUM_REG_RD;
792        out_EXECUTE_OUT_DATA_RD <= reg_EXECUTE_OUT_DATA_RD;
793        out_EXECUTE_OUT_WRITE_RE <= reg_EXECUTE_OUT_WRITE_RE;
794        out_EXECUTE_OUT_NUM_REG_RE <= reg_EXECUTE_OUT_NUM_REG_RE;
795        out_EXECUTE_OUT_DATA_RE <= reg_EXECUTE_OUT_DATA_RE;
796        out_EXECUTE_OUT_EXCEPTION <= reg_EXECUTE_OUT_EXCEPTION;
797        out_EXECUTE_OUT_NO_SEQUENCE <= reg_EXECUTE_OUT_NO_SEQUENCE;
798        out_EXECUTE_OUT_ADDRESS <= reg_EXECUTE_OUT_ADDRESS;
799        out_EXECUTE_OUT_VAL <= sig_EXECUTE_OUT_VAL;
800        out_EXECUTE_IN_ACK <= sig_EXECUTE_IN_ACK;
801
802end behavioural;
803
Note: See TracBrowser for help on using the repository browser.