28use ieee.std_logic_1164.
all;
29use ieee.numeric_std.
all;
39 STAT : out decode_stat_type
47 proc_idecode:
process (
IREG)
49 alias OPCODE : slv4 is IREG(15 downto 12);
50 alias OPPRIM : slv3 is IREG(14 downto 12);
52 alias OPEXT1 : slv3 is IREG(11 downto 9);
53 alias OPEXT2 : slv3 is IREG(8 downto 6);
54 alias OPEXT3 : slv3 is IREG(5 downto 3);
55 alias OPEXT4 : slv3 is IREG(2 downto 0);
57 alias SRCMODF : slv3 is IREG(11 downto 9);
58 alias DSTMODF : slv3 is IREG(5 downto 3);
60 alias SRCMOD : slv2 is IREG(11 downto 10);
62 alias SRCREG : slv3 is IREG(8 downto 6);
63 alias DSTMOD : slv2 is IREG(5 downto 4);
65 alias DSTREG : slv3 is IREG(2 downto 0);
67 variable nstat : decode_stat_type;
69 variable is_srcr : slbit := '0';
70 variable is_dstr : slbit := '0';
71 variable is_dstm : slbit := '0';
72 variable is_dstw : slbit := '0';
74 variable is_srcmode0 : slbit := '0';
75 variable is_dstmode0notpc : slbit := '0';
85 is_dstmode0notpc := '0';
87 nstat.is_dstmode0 := '0';
88 nstat.is_srcpc := '0';
89 nstat.is_srcpcmode1 := '0';
90 nstat.is_dstpc := '0';
91 nstat.is_dstpcmode1 := '0';
92 nstat.is_dstw_reg := '0';
93 nstat.is_dstw_pc := '0';
94 nstat.is_rmwop := '0';
95 nstat.is_bytop := '0';
99 nstat.trap_vec := "000";
100 nstat.force_srcsp := '0';
101 nstat.updt_dstadsrc := '0';
103 nstat.aunit_srcmod := c_aunit_mod_pass;
104 nstat.aunit_dstmod := c_aunit_mod_pass;
105 nstat.aunit_cimod := c_aunit_mod_pass;
106 nstat.aunit_cc1op := '0';
107 nstat.aunit_ccmode := IREG(8 downto 6);
108 nstat.lunit_func := (others=>'0');
109 nstat.munit_func := (others=>'0');
110 nstat.res_sel := c_dpath_res_ounit;
112 nstat.fork_op := (others=>'0');
113 nstat.fork_srcr := (others=>'0');
114 nstat.fork_dstr := (others=>'0');
115 nstat.fork_dsta := (others=>'0');
116 nstat.fork_opg := (others=>'0');
117 nstat.fork_opa := (others=>'0');
119 nstat.do_fork_op := '0';
120 nstat.do_fork_srcr := '0';
121 nstat.do_fork_dstr := '0';
122 nstat.do_fork_dsta := '0';
123 nstat.do_fork_opg := '0';
125 nstat.do_pref_dec := '0';
127 if SRCMODF = "000" then
131 if DSTMODF = "000" then
132 nstat.is_dstmode0 := '1';
133 if DSTREG /= c_gr_pc then
134 is_dstmode0notpc := '1';
138 if SRCREG = c_gr_pc then
139 nstat.is_srcpc := '1';
140 if SRCMODF = "001" then
141 nstat.is_srcpcmode1 := '1';
145 if DSTREG = c_gr_pc then
146 nstat.is_dstpc := '1';
147 if DSTMODF = "001" then
148 nstat.is_dstpcmode1 := '1';
152 if OPPRIM = "000" then
154 if OPBYTE='0' and OPEXT1="000" then
156 if OPEXT2="000" and OPEXT3="000" then
161 nstat.fork_op := c_fork_op_halt;
162 nstat.do_fork_op := '1';
165 nstat.fork_op := c_fork_op_wait;
166 nstat.do_fork_op := '1';
170 nstat.force_srcsp := '1';
171 nstat.fork_op := c_fork_op_rtti;
172 nstat.do_fork_op := '1';
175 nstat.trap_vec := "011";
176 nstat.fork_op := c_fork_op_trap;
177 nstat.do_fork_op := '1';
180 nstat.trap_vec := "100";
181 nstat.fork_op := c_fork_op_trap;
182 nstat.do_fork_op := '1';
185 nstat.fork_op := c_fork_op_reset;
186 nstat.do_fork_op := '1';
189 nstat.force_srcsp := '1';
190 nstat.fork_op := c_fork_op_rtti;
191 nstat.do_fork_op := '1';
199 if OPEXT2 = "001" then
201 nstat.fork_opa := c_fork_opa_jmp;
202 nstat.do_fork_dsta := '1';
205 if OPEXT2 = "010" then
206 if OPEXT3 = "000" then
208 nstat.force_srcsp := '1';
209 nstat.fork_op := c_fork_op_rts;
210 nstat.do_fork_op := '1';
212 if OPEXT3 = "011" then
214 nstat.fork_op := c_fork_op_spl;
215 nstat.do_fork_op := '1';
219 if OPEXT2 = "010" then
220 if OPEXT3(2) = '1' then
222 nstat.fork_op := c_fork_op_mcc;
223 nstat.do_fork_op := '1';
228 if OPEXT2 = "011" then
231 nstat.fork_opg := c_fork_opg_gen;
232 nstat.do_fork_opg := '1';
233 nstat.do_pref_dec := is_dstmode0notpc;
234 nstat.lunit_func := c_lunit_func_swap;
235 nstat.res_sel := c_dpath_res_lunit;
241 ((OPBYTE='0' and OPEXT2(2)='1') or
242 (OPBYTE='0' and (OPEXT1(0)='1' or OPEXT1(1)='1')) or
245 nstat.fork_op := c_fork_op_br;
246 nstat.do_fork_op := '1';
249 if OPBYTE='0' and OPEXT1="100" then
251 nstat.fork_opa := c_fork_opa_jsr;
252 nstat.do_fork_dsta := '1';
255 if OPBYTE='1' and OPEXT1="100" then
257 if OPEXT2(2) = '0' then
258 nstat.trap_vec := "110";
260 nstat.trap_vec := "111";
262 nstat.fork_op := c_fork_op_trap;
263 nstat.do_fork_op := '1';
266 if OPEXT1 = "101" then
268 nstat.res_sel := c_dpath_res_aunit;
270 nstat.is_bytop := '1';
273 nstat.aunit_cc1op := '1';
278 nstat.aunit_srcmod := c_aunit_mod_zero;
279 nstat.aunit_dstmod := c_aunit_mod_zero;
280 nstat.aunit_cimod := c_aunit_mod_zero;
283 nstat.aunit_srcmod := c_aunit_mod_zero;
284 nstat.aunit_dstmod := c_aunit_mod_inv;
285 nstat.aunit_cimod := c_aunit_mod_zero;
288 nstat.aunit_srcmod := c_aunit_mod_zero;
289 nstat.aunit_dstmod := c_aunit_mod_pass;
290 nstat.aunit_cimod := c_aunit_mod_one;
293 nstat.aunit_srcmod := c_aunit_mod_one;
294 nstat.aunit_dstmod := c_aunit_mod_pass;
295 nstat.aunit_cimod := c_aunit_mod_zero;
298 nstat.aunit_srcmod := c_aunit_mod_zero;
299 nstat.aunit_dstmod := c_aunit_mod_inv;
300 nstat.aunit_cimod := c_aunit_mod_one;
303 nstat.aunit_srcmod := c_aunit_mod_zero;
304 nstat.aunit_dstmod := c_aunit_mod_pass;
305 nstat.aunit_cimod := c_aunit_mod_pass;
308 nstat.aunit_srcmod := c_aunit_mod_one;
309 nstat.aunit_dstmod := c_aunit_mod_pass;
310 nstat.aunit_cimod := c_aunit_mod_inv;
313 nstat.aunit_srcmod := c_aunit_mod_zero;
314 nstat.aunit_dstmod := c_aunit_mod_pass;
315 nstat.aunit_cimod := c_aunit_mod_zero;
319 nstat.fork_opg := c_fork_opg_gen;
320 nstat.do_fork_opg := '1';
321 nstat.do_pref_dec := is_dstmode0notpc;
325 if OPEXT1 = "110" then
326 if OPEXT2(2) = '0' then
329 nstat.fork_opg := c_fork_opg_gen;
330 nstat.do_fork_opg := '1';
331 nstat.do_pref_dec := is_dstmode0notpc;
333 nstat.is_bytop := '1';
335 nstat.res_sel := c_dpath_res_lunit;
336 case OPEXT2(1 downto 0) is
338 nstat.lunit_func := c_lunit_func_ror;
340 nstat.lunit_func := c_lunit_func_rol;
342 nstat.lunit_func := c_lunit_func_asr;
344 nstat.lunit_func := c_lunit_func_asl;
349 if OPBYTE='0' and OPEXT2="100" then
351 nstat.fork_op := c_fork_op_mark;
352 nstat.do_fork_op := '1';
355 if OPEXT2 = "101" then
357 nstat.force_srcsp := '1';
358 if DSTREG = c_gr_sp then
359 nstat.updt_dstadsrc := '1';
361 nstat.res_sel := c_dpath_res_ounit;
362 if nstat.is_dstmode0 = '1' then
363 nstat.fork_opa := c_fork_opa_mfp_reg;
365 nstat.fork_opa := c_fork_opa_mfp_mem;
367 nstat.do_fork_dsta := '1';
370 if OPEXT2 = "110" then
372 nstat.force_srcsp := '1';
373 nstat.res_sel := c_dpath_res_ounit;
374 nstat.fork_opa := c_fork_opa_mtp;
375 nstat.fork_op := c_fork_op_mtp;
376 nstat.do_fork_op := '1';
379 if OPBYTE='0' and OPEXT2="111" then
382 nstat.fork_opg := c_fork_opg_gen;
383 nstat.do_fork_opg := '1';
384 nstat.do_pref_dec := is_dstmode0notpc;
385 nstat.lunit_func := c_lunit_func_sxt;
386 nstat.res_sel := c_dpath_res_lunit;
392 if OPPRIM/="000" and OPPRIM/="111" then
399 nstat.lunit_func := c_lunit_func_mov;
400 nstat.res_sel := c_dpath_res_lunit;
401 nstat.is_bytop := OPBYTE;
405 nstat.res_sel := c_dpath_res_aunit;
406 nstat.aunit_srcmod := c_aunit_mod_pass;
407 nstat.aunit_dstmod := c_aunit_mod_inv;
408 nstat.aunit_cimod := c_aunit_mod_one;
409 nstat.is_bytop := OPBYTE;
413 nstat.lunit_func := c_lunit_func_bit;
414 nstat.res_sel := c_dpath_res_lunit;
415 nstat.is_bytop := OPBYTE;
419 nstat.lunit_func := c_lunit_func_bic;
420 nstat.res_sel := c_dpath_res_lunit;
421 nstat.is_bytop := OPBYTE;
425 nstat.lunit_func := c_lunit_func_bis;
426 nstat.res_sel := c_dpath_res_lunit;
427 nstat.is_bytop := OPBYTE;
431 nstat.res_sel := c_dpath_res_aunit;
433 nstat.aunit_srcmod := c_aunit_mod_pass;
434 nstat.aunit_dstmod := c_aunit_mod_pass;
435 nstat.aunit_cimod := c_aunit_mod_zero;
437 nstat.aunit_srcmod := c_aunit_mod_inv;
438 nstat.aunit_dstmod := c_aunit_mod_pass;
439 nstat.aunit_cimod := c_aunit_mod_one;
444 nstat.fork_opg := c_fork_opg_gen;
445 nstat.do_fork_opg := '1';
446 nstat.do_pref_dec := is_srcmode0 and is_dstmode0notpc;
450 if OPBYTE='0' and OPPRIM="111" then
455 nstat.munit_func := c_munit_func_mul;
456 nstat.res_sel := c_dpath_res_munit;
457 nstat.fork_opg := c_fork_opg_mul;
458 nstat.do_fork_opg := '1';
462 nstat.munit_func := c_munit_func_div;
463 nstat.res_sel := c_dpath_res_munit;
464 nstat.fork_opg := c_fork_opg_div;
465 nstat.do_fork_opg := '1';
469 nstat.munit_func := c_munit_func_ash;
470 nstat.res_sel := c_dpath_res_munit;
471 nstat.fork_opg := c_fork_opg_ash;
472 nstat.do_fork_opg := '1';
476 nstat.munit_func := c_munit_func_ashc;
477 nstat.res_sel := c_dpath_res_munit;
478 nstat.fork_opg := c_fork_opg_ashc;
479 nstat.do_fork_opg := '1';
483 nstat.lunit_func := c_lunit_func_xor;
484 nstat.res_sel := c_dpath_res_lunit;
485 nstat.fork_opg := c_fork_opg_gen;
486 nstat.do_fork_opg := '1';
487 nstat.do_pref_dec := is_dstmode0notpc;
490 nstat.aunit_srcmod := c_aunit_mod_pass;
491 nstat.aunit_dstmod := c_aunit_mod_one;
492 nstat.aunit_cimod := c_aunit_mod_zero;
493 nstat.res_sel := c_dpath_res_aunit;
494 nstat.fork_op := c_fork_op_sob;
495 nstat.do_fork_op := '1';
501 if OPBYTE='1' and OPPRIM="111" then
506 when "00" => nstat.fork_srcr := c_fork_srcr_def;
507 when "01" => nstat.fork_srcr := c_fork_srcr_inc;
508 when "10" => nstat.fork_srcr := c_fork_srcr_dec;
509 when "11" => nstat.fork_srcr := c_fork_srcr_ind;
513 if is_srcr='1' and SRCMODF /="000" then
514 nstat.do_fork_srcr := '1';
518 when "00" => nstat.fork_dstr := c_fork_dstr_def;
519 when "01" => nstat.fork_dstr := c_fork_dstr_inc;
520 when "10" => nstat.fork_dstr := c_fork_dstr_dec;
521 when "11" => nstat.fork_dstr := c_fork_dstr_ind;
525 if (is_dstr or is_dstm)='1' and nstat.is_dstmode0='0' then
526 nstat.do_fork_dstr := '1';
529 if is_dstw='1' and nstat.is_dstmode0='0' then
531 when "00" => nstat.fork_opg := c_fork_opg_wdef;
532 when "01" => nstat.fork_opg := c_fork_opg_winc;
533 when "10" => nstat.fork_opg := c_fork_opg_wdec;
534 when "11" => nstat.fork_opg := c_fork_opg_wind;
539 if is_dstm='1' and nstat.is_dstmode0='0' then
540 nstat.is_rmwop := '1';
544 when "00" => nstat.fork_dsta := c_fork_dsta_def;
545 when "01" => nstat.fork_dsta := c_fork_dsta_inc;
546 when "10" => nstat.fork_dsta := c_fork_dsta_dec;
547 when "11" => nstat.fork_dsta := c_fork_dsta_ind;
551 if (is_dstw or is_dstm)='1' and nstat.is_dstmode0='1' then
552 nstat.is_dstw_reg := '1';
553 if DSTREG = c_gr_pc then
554 nstat.is_dstw_pc := '1';
560 end process proc_idecode;
out STAT decode_stat_type
std_logic_vector( 3 downto 0) slv4
std_logic_vector( 2 downto 0) slv3
std_logic_vector( 15 downto 0) slv16
std_logic_vector( 1 downto 0) slv2