vertigo_vhdl 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. checksums.yaml +7 -0
  2. data/bin/vertigo +7 -0
  3. data/lib/vertigo.rb +4 -0
  4. data/lib/vertigo/ast.rb +87 -0
  5. data/lib/vertigo/ast_vertigo_rkgen.rb +607 -0
  6. data/lib/vertigo/code.rb +57 -0
  7. data/lib/vertigo/compiler.rb +61 -0
  8. data/lib/vertigo/generic_lexer.rb +61 -0
  9. data/lib/vertigo/generic_parser.rb +44 -0
  10. data/lib/vertigo/indent.rb +20 -0
  11. data/lib/vertigo/lexer.rb +172 -0
  12. data/lib/vertigo/parser.rb +1458 -0
  13. data/lib/vertigo/pretty_printer.rb +749 -0
  14. data/lib/vertigo/runner.rb +115 -0
  15. data/lib/vertigo/tb_generator.rb +81 -0
  16. data/lib/vertigo/template.tb.vhd +72 -0
  17. data/lib/vertigo/token.rb +67 -0
  18. data/lib/vertigo/version.rb +3 -0
  19. data/lib/vertigo/vertigo.rkg +354 -0
  20. data/lib/vertigo/visitor_vertigo_rkgen.rb +447 -0
  21. data/tests/ghdl_tests/fsm.vhd +98 -0
  22. data/tests/ghdl_tests/fsm_synth.vhd +248 -0
  23. data/tests/ghdl_tests/test_fsm.vhd +162 -0
  24. data/tests/parser_tests/else.vhd +64 -0
  25. data/tests/parser_tests/test_MUST_fail.vhd +1 -0
  26. data/tests/parser_tests/test_accelerator.vhd +160 -0
  27. data/tests/parser_tests/test_accelerator_pp.vhd +144 -0
  28. data/tests/parser_tests/test_aggregate.vhd +17 -0
  29. data/tests/parser_tests/test_aggregate_pp.vhd +15 -0
  30. data/tests/parser_tests/test_archi_1.vhd +45 -0
  31. data/tests/parser_tests/test_archi_1_pp.vhd +41 -0
  32. data/tests/parser_tests/test_array_array_00.vhd +25 -0
  33. data/tests/parser_tests/test_array_array_00_pp.vhd +25 -0
  34. data/tests/parser_tests/test_array_urange.vhd +25 -0
  35. data/tests/parser_tests/test_array_urange_pp.vhd +25 -0
  36. data/tests/parser_tests/test_chu-1.vhd +80 -0
  37. data/tests/parser_tests/test_chu-1_pp.vhd +104 -0
  38. data/tests/parser_tests/test_concat.vhd +11 -0
  39. data/tests/parser_tests/test_concat_pp.vhd +14 -0
  40. data/tests/parser_tests/test_counter.vhd +35 -0
  41. data/tests/parser_tests/test_counter_pp.vhd +35 -0
  42. data/tests/parser_tests/test_de2.vhd +358 -0
  43. data/tests/parser_tests/test_de2_pp.vhd +274 -0
  44. data/tests/parser_tests/test_encode.vhd +2679 -0
  45. data/tests/parser_tests/test_encode_pp.vhd +2549 -0
  46. data/tests/parser_tests/test_fsm.vhd +162 -0
  47. data/tests/parser_tests/test_fsm_pp.vhd +125 -0
  48. data/tests/parser_tests/test_fsm_synth.vhd +248 -0
  49. data/tests/parser_tests/test_fsm_synth_pp.vhd +197 -0
  50. data/tests/parser_tests/test_function-01.vhd +33 -0
  51. data/tests/parser_tests/test_function-01_pp.vhd +18 -0
  52. data/tests/parser_tests/test_lfsr.vhd +75 -0
  53. data/tests/parser_tests/test_lfsr_pp.vhd +44 -0
  54. data/tests/parser_tests/test_microwatt_cache_ram.vhd +1 -0
  55. data/tests/parser_tests/test_microwatt_cache_ram_pp.vhd +68 -0
  56. data/tests/parser_tests/test_microwatt_common.vhd +1 -0
  57. data/tests/parser_tests/test_microwatt_common_pp.vhd +336 -0
  58. data/tests/parser_tests/test_microwatt_control.vhd +1 -0
  59. data/tests/parser_tests/test_microwatt_control_pp.vhd +187 -0
  60. data/tests/parser_tests/test_microwatt_core.vhd +1 -0
  61. data/tests/parser_tests/test_microwatt_core_debug.vhd +1 -0
  62. data/tests/parser_tests/test_microwatt_core_debug_pp.vhd +104 -0
  63. data/tests/parser_tests/test_microwatt_core_pp.vhd +231 -0
  64. data/tests/parser_tests/test_microwatt_core_tb.vhd +1 -0
  65. data/tests/parser_tests/test_microwatt_core_tb_pp.vhd +43 -0
  66. data/tests/parser_tests/test_microwatt_countzero.vhd +1 -0
  67. data/tests/parser_tests/test_microwatt_countzero_pp.vhd +120 -0
  68. data/tests/parser_tests/test_microwatt_countzero_tb.vhd +1 -0
  69. data/tests/parser_tests/test_microwatt_countzero_tb_pp.vhd +70 -0
  70. data/tests/parser_tests/test_microwatt_cr_file.vhd +1 -0
  71. data/tests/parser_tests/test_microwatt_cr_file_pp.vhd +74 -0
  72. data/tests/parser_tests/test_microwatt_cr_hazard.vhd +1 -0
  73. data/tests/parser_tests/test_microwatt_cr_hazard_pp.vhd +51 -0
  74. data/tests/parser_tests/test_microwatt_crhelpers.vhd +1 -0
  75. data/tests/parser_tests/test_microwatt_crhelpers_pp.vhd +48 -0
  76. data/tests/parser_tests/test_microwatt_dcache.vhd +1 -0
  77. data/tests/parser_tests/test_microwatt_dcache_pp.vhd +481 -0
  78. data/tests/parser_tests/test_microwatt_dcache_tb.vhd +1 -0
  79. data/tests/parser_tests/test_microwatt_dcache_tb_pp.vhd +98 -0
  80. data/tests/parser_tests/test_microwatt_decode1.vhd +1 -0
  81. data/tests/parser_tests/test_microwatt_decode1_pp.vhd +138 -0
  82. data/tests/parser_tests/test_microwatt_decode2.vhd +1 -0
  83. data/tests/parser_tests/test_microwatt_decode2_pp.vhd +300 -0
  84. data/tests/parser_tests/test_microwatt_decode_types.vhd +1 -0
  85. data/tests/parser_tests/test_microwatt_decode_types_pp.vhd +67 -0
  86. data/tests/parser_tests/test_microwatt_divider.vhd +1 -0
  87. data/tests/parser_tests/test_microwatt_divider_pp.vhd +132 -0
  88. data/tests/parser_tests/test_microwatt_divider_tb.vhd +1 -0
  89. data/tests/parser_tests/test_microwatt_divider_tb_pp.vhd +95 -0
  90. data/tests/parser_tests/test_microwatt_dmi_dtm_dummy.vhd +1 -0
  91. data/tests/parser_tests/test_microwatt_dmi_dtm_dummy_pp.vhd +29 -0
  92. data/tests/parser_tests/test_microwatt_dmi_dtm_tb.vhd +1 -0
  93. data/tests/parser_tests/test_microwatt_dmi_dtm_tb_pp.vhd +197 -0
  94. data/tests/parser_tests/test_microwatt_dmi_dtm_xilinx.vhd +1 -0
  95. data/tests/parser_tests/test_microwatt_dmi_dtm_xilinx_pp.vhd +139 -0
  96. data/tests/parser_tests/test_microwatt_execute1.vhd +1 -0
  97. data/tests/parser_tests/test_microwatt_execute1_pp.vhd +689 -0
  98. data/tests/parser_tests/test_microwatt_fetch1.vhd +1 -0
  99. data/tests/parser_tests/test_microwatt_fetch1_pp.vhd +88 -0
  100. data/tests/parser_tests/test_microwatt_fetch2.vhd +1 -0
  101. data/tests/parser_tests/test_microwatt_fetch2_pp.vhd +79 -0
  102. data/tests/parser_tests/test_microwatt_glibc_random.vhd +1 -0
  103. data/tests/parser_tests/test_microwatt_glibc_random_helpers.vhd +1 -0
  104. data/tests/parser_tests/test_microwatt_glibc_random_helpers_pp.vhd +25 -0
  105. data/tests/parser_tests/test_microwatt_glibc_random_pp.vhd +41 -0
  106. data/tests/parser_tests/test_microwatt_gpr_hazard.vhd +1 -0
  107. data/tests/parser_tests/test_microwatt_gpr_hazard_pp.vhd +68 -0
  108. data/tests/parser_tests/test_microwatt_helpers.vhd +1 -0
  109. data/tests/parser_tests/test_microwatt_helpers_pp.vhd +153 -0
  110. data/tests/parser_tests/test_microwatt_icache.vhd +1 -0
  111. data/tests/parser_tests/test_microwatt_icache_pp.vhd +337 -0
  112. data/tests/parser_tests/test_microwatt_icache_tb.vhd +1 -0
  113. data/tests/parser_tests/test_microwatt_icache_tb_pp.vhd +104 -0
  114. data/tests/parser_tests/test_microwatt_insn_helpers.vhd +1 -0
  115. data/tests/parser_tests/test_microwatt_insn_helpers_pp.vhd +208 -0
  116. data/tests/parser_tests/test_microwatt_loadstore1.vhd +1 -0
  117. data/tests/parser_tests/test_microwatt_loadstore1_pp.vhd +222 -0
  118. data/tests/parser_tests/test_microwatt_logical.vhd +1 -0
  119. data/tests/parser_tests/test_microwatt_logical_pp.vhd +87 -0
  120. data/tests/parser_tests/test_microwatt_multiply.vhd +1 -0
  121. data/tests/parser_tests/test_microwatt_multiply_pp.vhd +84 -0
  122. data/tests/parser_tests/test_microwatt_multiply_tb.vhd +1 -0
  123. data/tests/parser_tests/test_microwatt_multiply_tb_pp.vhd +75 -0
  124. data/tests/parser_tests/test_microwatt_plru.vhd +1 -0
  125. data/tests/parser_tests/test_microwatt_plru_pp.vhd +46 -0
  126. data/tests/parser_tests/test_microwatt_plru_tb.vhd +1 -0
  127. data/tests/parser_tests/test_microwatt_plru_tb_pp.vhd +93 -0
  128. data/tests/parser_tests/test_microwatt_ppc_fx_insns.vhd +1 -0
  129. data/tests/parser_tests/test_microwatt_ppc_fx_insns_pp.vhd +665 -0
  130. data/tests/parser_tests/test_microwatt_register_file.vhd +1 -0
  131. data/tests/parser_tests/test_microwatt_register_file_pp.vhd +86 -0
  132. data/tests/parser_tests/test_microwatt_rotator.vhd +1 -0
  133. data/tests/parser_tests/test_microwatt_rotator_pp.vhd +149 -0
  134. data/tests/parser_tests/test_microwatt_rotator_tb.vhd +1 -0
  135. data/tests/parser_tests/test_microwatt_rotator_tb_pp.vhd +134 -0
  136. data/tests/parser_tests/test_microwatt_sim_bram.vhd +1 -0
  137. data/tests/parser_tests/test_microwatt_sim_bram_helpers.vhd +1 -0
  138. data/tests/parser_tests/test_microwatt_sim_bram_helpers_pp.vhd +52 -0
  139. data/tests/parser_tests/test_microwatt_sim_bram_pp.vhd +53 -0
  140. data/tests/parser_tests/test_microwatt_sim_console.vhd +1 -0
  141. data/tests/parser_tests/test_microwatt_sim_console_pp.vhd +43 -0
  142. data/tests/parser_tests/test_microwatt_sim_jtag.vhd +1 -0
  143. data/tests/parser_tests/test_microwatt_sim_jtag_pp.vhd +64 -0
  144. data/tests/parser_tests/test_microwatt_sim_jtag_socket.vhd +1 -0
  145. data/tests/parser_tests/test_microwatt_sim_jtag_socket_pp.vhd +36 -0
  146. data/tests/parser_tests/test_microwatt_sim_uart.vhd +1 -0
  147. data/tests/parser_tests/test_microwatt_sim_uart_pp.vhd +90 -0
  148. data/tests/parser_tests/test_microwatt_soc.vhd +1 -0
  149. data/tests/parser_tests/test_microwatt_soc_pp.vhd +195 -0
  150. data/tests/parser_tests/test_microwatt_utils.vhd +1 -0
  151. data/tests/parser_tests/test_microwatt_utils_pp.vhd +39 -0
  152. data/tests/parser_tests/test_microwatt_wishbone_arbiter.vhd +1 -0
  153. data/tests/parser_tests/test_microwatt_wishbone_arbiter_pp.vhd +54 -0
  154. data/tests/parser_tests/test_microwatt_wishbone_bram_tb.vhd +1 -0
  155. data/tests/parser_tests/test_microwatt_wishbone_bram_tb_pp.vhd +157 -0
  156. data/tests/parser_tests/test_microwatt_wishbone_bram_wrapper.vhd +1 -0
  157. data/tests/parser_tests/test_microwatt_wishbone_bram_wrapper_pp.vhd +62 -0
  158. data/tests/parser_tests/test_microwatt_wishbone_debug_master.vhd +1 -0
  159. data/tests/parser_tests/test_microwatt_wishbone_debug_master_pp.vhd +124 -0
  160. data/tests/parser_tests/test_microwatt_wishbone_types.vhd +1 -0
  161. data/tests/parser_tests/test_microwatt_wishbone_types_pp.vhd +38 -0
  162. data/tests/parser_tests/test_microwatt_writeback.vhd +1 -0
  163. data/tests/parser_tests/test_microwatt_writeback_pp.vhd +87 -0
  164. data/tests/parser_tests/test_package-1.vhd +68 -0
  165. data/tests/parser_tests/test_package-1_pp.vhd +53 -0
  166. data/tests/parser_tests/test_precedence.vhd +13 -0
  167. data/tests/parser_tests/test_precedence_pp.vhd +16 -0
  168. data/tests/parser_tests/test_selected_sig.vhd +14 -0
  169. data/tests/parser_tests/test_selected_sig_pp.vhd +10 -0
  170. data/tests/parser_tests/test_slice.vhd +15 -0
  171. data/tests/parser_tests/test_slice_pp.vhd +16 -0
  172. data/tests/parser_tests/test_tb-00.vhd +94 -0
  173. data/tests/parser_tests/test_tb-00_pp.vhd +71 -0
  174. data/tests/parser_tests/test_type_decl_02.vhd +9 -0
  175. data/tests/parser_tests/test_type_decl_02_pp.vhd +11 -0
  176. data/tests/parser_tests/test_use.vhd +7 -0
  177. data/tests/parser_tests/test_use_pp.vhd +10 -0
  178. data/tests/parser_tests/test_while_1.vhd +38 -0
  179. data/tests/parser_tests/test_while_1_pp.vhd +26 -0
  180. data/tests/parser_tests/test_with-00.vhd +21 -0
  181. data/tests/parser_tests/test_with-00_pp.vhd +12 -0
  182. data/tests/tb_gen_tests/test_accelerator.vhd +160 -0
  183. metadata +224 -0
@@ -0,0 +1 @@
1
+ ../microwatt/multiply.vhdl
@@ -0,0 +1,84 @@
1
+ -- generated by Vertigo VHDL tool
2
+ library ieee;
3
+ use ieee.std_logic_1164.all;
4
+ use ieee.numeric_std.all;
5
+ library work;
6
+ use work.common.all;
7
+ use work.decode_types.all;
8
+
9
+ entity multiply is
10
+ generic(
11
+ pipeline_depth : natural16 := 16);
12
+ port(
13
+ clk : in std_logic;
14
+ m_in : in execute1tomultiplytype;
15
+ m_out : out multiplytoexecute1type);
16
+ end entity multiply;
17
+
18
+ architecture behaviour of multiply is
19
+ signal m : execute1tomultiplytype;
20
+
21
+ type multiply_pipeline_stage is record
22
+ valid : std_ulogic;
23
+ insn_type : insn_type_t;
24
+ data : signed(129 downto 0);
25
+ is_32bit : std_ulogic;
26
+ end record;
27
+ constant multiplypipelinestageinit : multiply_pipeline_stage := (valid => '0',insn_type => op_illegal,is_32bit => '0',data => (others => '0'));
28
+
29
+ type multiply_pipeline_type is array(range 0 to pipeline_depth - 1) of multiply_pipeline_stage;
30
+ constant multiplypipelineinit : multiply_pipeline_type := (others => multiplypipelinestageinit);
31
+
32
+ type reg_type is record
33
+ multiply_pipeline : multiply_pipeline_type;
34
+ end record;
35
+ signal r : reg_type;
36
+ signal rin : reg_type := (multiply_pipeline => multiplypipelineinit);
37
+ begin
38
+
39
+
40
+ multiply_0 : process(clk)
41
+ begin
42
+ if rising_edge(clk) then
43
+ m <= m_in;
44
+ r <= rin;
45
+ end if;
46
+ end process;
47
+
48
+ multiply_1 : process(all)
49
+ variable v : reg_type;
50
+ variable d : std_ulogic_vector(129 downto 0);
51
+ variable d2 : std_ulogic_vector(63 downto 0);
52
+ variable ov : std_ulogic;
53
+ begin
54
+ v := r;
55
+ m_out <= multiplytoexecute1init;
56
+ v.multiply_pipeline(0).valid := m.valid;
57
+ v.multiply_pipeline(0).insn_type := m.insn_type;
58
+ v.multiply_pipeline(0).data := signed(m.data1) * signed(m.data2);
59
+ v.multiply_pipeline(0).is_32bit := m.is_32bit;
60
+ d := std_ulogic_vector(v.multiply_pipeline(pipeline_depth - 1).data);
61
+ ov := '0';
62
+ case v.multiply_pipeline(pipeline_depth - 1).insn_type is
63
+ when op_mul_l64 =>
64
+ d2 := d(63 downto 0);
65
+ if v.multiply_pipeline(pipeline_depth - 1).is_32bit = '1' then
66
+ ov := (or(d(63 downto 31))) and (and(d(63 downto 31)));
67
+ else
68
+ ov := (or(d(127 downto 63))) and (and(d(127 downto 63)));
69
+ end if;
70
+ when op_mul_h32 =>
71
+ d2 := d(63 downto 32) & d(63 downto 32);
72
+ when op_mul_h64 =>
73
+ d2 := d(127 downto 64);
74
+ when others =>
75
+ d2 := (others => '0');
76
+ end case;
77
+ m_out.write_reg_data <= d2;
78
+ m_out.overflow <= ov;
79
+ if v.multiply_pipeline(pipeline_depth - 1).valid = '1' then
80
+ m_out.valid <= '1';
81
+ end if;
82
+ rin <= v;
83
+ end process;
84
+ end behaviour;
@@ -0,0 +1 @@
1
+ ../microwatt/multiply_tb.vhdl
@@ -0,0 +1,75 @@
1
+ -- generated by Vertigo VHDL tool
2
+ library ieee;
3
+ use ieee.std_logic_1164.all;
4
+ use ieee.numeric_std.all;
5
+ library work;
6
+ use work.decode_types.all;
7
+ use work.common.all;
8
+ use work.glibc_random.all;
9
+ use work.ppc_fx_insns.all;
10
+
11
+ entity multiply_tb is
12
+ end entity multiply_tb;
13
+
14
+ architecture behave of multiply_tb is
15
+ signal clk : std_ulogic;
16
+ constant clk_period : time := 10 ns;
17
+ constant pipeline_depth : integer := 4;
18
+ signal m1 : execute1tomultiplytype;
19
+ signal m2 : multiplytoexecute1type;
20
+ begin
21
+
22
+ multiply_0 : entity work.multiply
23
+ port map(
24
+ clk => clk,
25
+ m_in => m1,
26
+ m_out => m2);
27
+
28
+
29
+ clk_process : process
30
+ begin
31
+ clk <= '0';
32
+ wait clk_period / 2;
33
+ clk <= '1';
34
+ wait clk_period / 2;
35
+ end process;
36
+
37
+ stim_process : process
38
+ variable ra : std_ulogic_vector(63 downto 0);
39
+ variable rb : std_ulogic_vector(63 downto 0);
40
+ variable rt : std_ulogic_vector(63 downto 0);
41
+ variable behave_rt : std_ulogic_vector(63 downto 0);
42
+ variable si : std_ulogic_vector(15 downto 0);
43
+ begin
44
+ wait clk_period;
45
+ m1.valid <= '1';
46
+ m1.insn_type <= op_mul_l64;
47
+ m1.data1 <= '0' & x"0000000000001000";
48
+ m1.data2 <= '0' & x"0000000000001111";
49
+ wait clk_period;
50
+ assert m2.valid = '0';
51
+ m1.valid <= '0';
52
+ wait clk_period;
53
+ assert m2.valid = '0';
54
+ wait clk_period;
55
+ assert m2.valid = '0';
56
+ wait clk_period;
57
+ assert m2.valid = '1';
58
+ assert m2.write_reg_data = x"0000000001111000";
59
+ wait clk_period;
60
+ assert m2.valid = '0';
61
+ m1.valid <= '1';
62
+ wait clk_period;
63
+ assert m2.valid = '0';
64
+ m1.valid <= '0';
65
+ wait clk_period * (pipeline_depth - 1);
66
+ assert m2.valid = '1';
67
+ assert m2.write_reg_data = x"0000000001111000";
68
+ ;
69
+ ;
70
+ ;
71
+ assert false
72
+ report "end of test" severity failure;
73
+ wait ;
74
+ end process;
75
+ end behave;
@@ -0,0 +1 @@
1
+ ../microwatt/plru.vhdl
@@ -0,0 +1,46 @@
1
+ -- generated by Vertigo VHDL tool
2
+ library ieee;
3
+ use ieee.std_logic_1164.all;
4
+ use ieee.numeric_std.all;
5
+ use ieee.math_real.all;
6
+
7
+ entity plru is
8
+ generic(
9
+ bits : positive2 := 2);
10
+ port(
11
+ clk : in std_ulogic;
12
+ rst : in std_ulogic;
13
+ acc : in std_ulogic_vector(bits - 1 downto 0);
14
+ acc_en : in std_ulogic;
15
+ lru : out std_ulogic_vector(bits - 1 downto 0));
16
+ end entity plru;
17
+
18
+ architecture rtl of plru is
19
+ constant count : positive := 2 ** bits - 1;
20
+
21
+ subtype node_t is integer range 0 to count;
22
+
23
+ type tree_t is array(range node_t) of std_ulogic;
24
+ signal tree : tree_t;
25
+ begin
26
+
27
+
28
+ get_lru : process(tree)
29
+ variable node : node_t;
30
+ begin
31
+ node := 0;
32
+ end process;
33
+
34
+ update_lru : process(clk)
35
+ variable node : node_t;
36
+ variable abit : std_ulogic;
37
+ begin
38
+ if rising_edge(clk) then
39
+ if rst = '1' then
40
+ tree <= (others => '0');
41
+ elsif acc_en = '1' then
42
+ node := 0;
43
+ end if;
44
+ end if;
45
+ end process;
46
+ end rtl;
@@ -0,0 +1 @@
1
+ ../microwatt/plru_tb.vhdl
@@ -0,0 +1,93 @@
1
+ -- generated by Vertigo VHDL tool
2
+ library ieee;
3
+ use ieee.std_logic_1164.all;
4
+ library work;
5
+ use work.common.all;
6
+ use work.wishbone_types.all;
7
+
8
+ entity plru_tb is
9
+ end entity plru_tb;
10
+
11
+ architecture behave of plru_tb is
12
+ signal clk : std_ulogic;
13
+ signal rst : std_ulogic;
14
+ constant clk_period : time := 10 ns;
15
+ signal acc_en : std_ulogic;
16
+ signal acc : std_ulogic_vector(2 downto 0);
17
+ signal lru : std_ulogic_vector(2 downto 0);
18
+ begin
19
+
20
+ plru0 : entity work.plru
21
+ port map(
22
+ clk => clk,
23
+ rst => rst,
24
+ acc => acc,
25
+ acc_en => acc_en,
26
+ lru => lru);
27
+
28
+
29
+ clk_process : process
30
+ begin
31
+ clk <= '0';
32
+ wait clk_period / 2;
33
+ clk <= '1';
34
+ wait clk_period / 2;
35
+ end process;
36
+
37
+ rst_process : process
38
+ begin
39
+ rst <= '1';
40
+ wait 2 * clk_period;
41
+ rst <= '0';
42
+ wait ;
43
+ end process;
44
+
45
+ stim : process
46
+ begin
47
+ wait 4 * clk_period;
48
+ report "accessing 1:";
49
+ acc <= "001";
50
+ acc_en <= '1';
51
+ wait clk_period;
52
+ report "lru:" & to_hstring(lru);
53
+ report "accessing 2:";
54
+ acc <= "010";
55
+ wait clk_period;
56
+ report "lru:" & to_hstring(lru);
57
+ report "accessing 7:";
58
+ acc <= "111";
59
+ wait clk_period;
60
+ report "lru:" & to_hstring(lru);
61
+ report "accessing 4:";
62
+ acc <= "100";
63
+ wait clk_period;
64
+ report "lru:" & to_hstring(lru);
65
+ report "accessing 3:";
66
+ acc <= "011";
67
+ wait clk_period;
68
+ report "lru:" & to_hstring(lru);
69
+ report "accessing 5:";
70
+ acc <= "101";
71
+ wait clk_period;
72
+ report "lru:" & to_hstring(lru);
73
+ report "accessing 3:";
74
+ acc <= "011";
75
+ wait clk_period;
76
+ report "lru:" & to_hstring(lru);
77
+ report "accessing 5:";
78
+ acc <= "101";
79
+ wait clk_period;
80
+ report "lru:" & to_hstring(lru);
81
+ report "accessing 6:";
82
+ acc <= "110";
83
+ wait clk_period;
84
+ report "lru:" & to_hstring(lru);
85
+ report "accessing 0:";
86
+ acc <= "000";
87
+ wait clk_period;
88
+ report "lru:" & to_hstring(lru);
89
+ assert false
90
+ report "end of test" severity failure;
91
+ wait ;
92
+ end process;
93
+ end behave;
@@ -0,0 +1 @@
1
+ ../microwatt/ppc_fx_insns.vhdl
@@ -0,0 +1,665 @@
1
+ -- generated by Vertigo VHDL tool
2
+ library ieee;
3
+ use ieee.std_logic_1164.all;
4
+ use ieee.numeric_std.all;
5
+ library work;
6
+ use work.helpers.all;
7
+
8
+ package ppc_fx_insns is
9
+ function ppc_addi(ra : std_ulogic_vector(63 downto 0);si : std_ulogic_vector(15 downto 0)) return std_ulogic_vector
10
+ function ppc_addis(ra : std_ulogic_vector(63 downto 0);si : std_ulogic_vector(15 downto 0)) return std_ulogic_vector
11
+ function ppc_add(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
12
+ function ppc_subf(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
13
+ function ppc_neg(ra : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
14
+ function ppc_addic(ra : std_ulogic_vector(63 downto 0);si : std_ulogic_vector(15 downto 0)) return std_ulogic_vector
15
+ function ppc_adde(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0);carry : std_ulogic) return std_ulogic_vector
16
+ function ppc_subfic(ra : std_ulogic_vector(63 downto 0);si : std_ulogic_vector(15 downto 0)) return std_ulogic_vector
17
+ function ppc_subfc(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
18
+ function ppc_subfe(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0);carry : std_ulogic) return std_ulogic_vector
19
+ function ppc_addze(ra : std_ulogic_vector(63 downto 0);carry : std_ulogic) return std_ulogic_vector
20
+ function ppc_andi(rs : std_ulogic_vector(63 downto 0);ui : std_ulogic_vector(15 downto 0)) return std_ulogic_vector
21
+ function ppc_andis(rs : std_ulogic_vector(63 downto 0);ui : std_ulogic_vector(15 downto 0)) return std_ulogic_vector
22
+ function ppc_ori(rs : std_ulogic_vector(63 downto 0);ui : std_ulogic_vector(15 downto 0)) return std_ulogic_vector
23
+ function ppc_oris(rs : std_ulogic_vector(63 downto 0);ui : std_ulogic_vector(15 downto 0)) return std_ulogic_vector
24
+ function ppc_xori(rs : std_ulogic_vector(63 downto 0);ui : std_ulogic_vector(15 downto 0)) return std_ulogic_vector
25
+ function ppc_xoris(rs : std_ulogic_vector(63 downto 0);ui : std_ulogic_vector(15 downto 0)) return std_ulogic_vector
26
+ function ppc_and(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
27
+ function ppc_xor(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
28
+ function ppc_nand(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
29
+ function ppc_or(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
30
+ function ppc_nor(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
31
+ function ppc_andc(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
32
+ function ppc_eqv(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
33
+ function ppc_orc(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
34
+ function ppc_extsb(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
35
+ function ppc_extsh(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
36
+ function ppc_extsw(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
37
+ function ppc_cntlzw(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
38
+ function ppc_cnttzw(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
39
+ function ppc_cntlzd(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
40
+ function ppc_cnttzd(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
41
+ function ppc_popcntb(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
42
+ function ppc_popcntw(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
43
+ function ppc_popcntd(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
44
+ function ppc_prtyd(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
45
+ function ppc_prtyw(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
46
+ function ppc_rlwinm(rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(4 downto 0);mb : std_ulogic_vector(4 downto 0);me : std_ulogic_vector(4 downto 0)) return std_ulogic_vector
47
+ function ppc_rlwnm(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0);mb : std_ulogic_vector(4 downto 0);me : std_ulogic_vector(4 downto 0)) return std_ulogic_vector
48
+ function ppc_rlwimi(ra : std_ulogic_vector(63 downto 0);rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(4 downto 0);mb : std_ulogic_vector(4 downto 0);me : std_ulogic_vector(4 downto 0)) return std_ulogic_vector
49
+ function ppc_rldicl(rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(5 downto 0);mb : std_ulogic_vector(5 downto 0)) return std_ulogic_vector
50
+ function ppc_rldicr(rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(5 downto 0);me : std_ulogic_vector(5 downto 0)) return std_ulogic_vector
51
+ function ppc_rldic(rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(5 downto 0);mb : std_ulogic_vector(5 downto 0)) return std_ulogic_vector
52
+ function ppc_rldcl(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0);mb : std_ulogic_vector(5 downto 0)) return std_ulogic_vector
53
+ function ppc_rldcr(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0);me : std_ulogic_vector(5 downto 0)) return std_ulogic_vector
54
+ function ppc_rldimi(ra : std_ulogic_vector(63 downto 0);rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(5 downto 0);mb : std_ulogic_vector(5 downto 0)) return std_ulogic_vector
55
+ function ppc_slw(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
56
+ function ppc_srw(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
57
+ function ppc_srawi(rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(5 downto 0)) return std_ulogic_vector
58
+ function ppc_sraw(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
59
+ function ppc_sld(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
60
+ function ppc_srd(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
61
+ function ppc_sradi(rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(5 downto 0)) return std_ulogic_vector
62
+ function ppc_srad(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
63
+ function ppc_mulld(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
64
+ function ppc_mulhd(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
65
+ function ppc_mulhdu(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
66
+ function ppc_mulli(ra : std_ulogic_vector(63 downto 0);si : std_ulogic_vector(15 downto 0)) return std_ulogic_vector
67
+ function ppc_mullw(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
68
+ function ppc_mulhw(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
69
+ function ppc_mulhwu(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
70
+ function ppc_cmpi(l : std_ulogic;ra : std_ulogic_vector(63 downto 0);si : std_ulogic_vector(15 downto 0);so : std_ulogic) return std_ulogic_vector
71
+ function ppc_cmp(l : std_ulogic;ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0);so : std_ulogic) return std_ulogic_vector
72
+ function ppc_cmpli(l : std_ulogic;ra : std_ulogic_vector(63 downto 0);si : std_ulogic_vector(15 downto 0);so : std_ulogic) return std_ulogic_vector
73
+ function ppc_cmpl(l : std_ulogic;ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0);so : std_ulogic) return std_ulogic_vector
74
+ function ppc_cmpb(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
75
+ function ppc_divw(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
76
+ function ppc_divdu(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
77
+ function ppc_divd(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
78
+ function ppc_divwu(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
79
+ function ppc_bc_taken(bo : std_ulogic_vector(4 downto 0);bi : std_ulogic_vector(4 downto 0);cr : std_ulogic_vector(31 downto 0);ctr : std_ulogic_vector(63 downto 0)) return integer
80
+
81
+ end ppc_fx_insns;
82
+
83
+ package body ppc_fx_insns is
84
+
85
+ function ppc_addi(ra : std_ulogic_vector(63 downto 0);si : std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
86
+ begin
87
+ return std_ulogic_vector(signed(ra) + signed(si));
88
+ end function ppc_addi;
89
+
90
+ function ppc_addic(ra : std_ulogic_vector(63 downto 0);si : std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
91
+ begin
92
+ return std_logic_vector(resize(unsigned(ra),65) + unsigned(resize(signed(si),64)));
93
+ end function ppc_addic;
94
+
95
+ function ppc_adde(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0);carry : std_ulogic) return std_ulogic_vector is
96
+ begin
97
+ return std_logic_vector(resize(unsigned(ra),65) + resize(unsigned(rb),65) + carry);
98
+ end function ppc_adde;
99
+
100
+ function ppc_subfic(ra : std_ulogic_vector(63 downto 0);si : std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
101
+ begin
102
+ return std_logic_vector(unsigned(resize(signed(si),64)) + resize(unsigned((ra)),65) + 1);
103
+ end function ppc_subfic;
104
+
105
+ function ppc_subfc(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
106
+ begin
107
+ return std_logic_vector(resize(unsigned(rb),65) + resize(unsigned((ra)),65) + 1);
108
+ end function ppc_subfc;
109
+
110
+ function ppc_subfe(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0);carry : std_ulogic) return std_ulogic_vector is
111
+ begin
112
+ return std_logic_vector(resize(unsigned(rb),65) + resize(unsigned((ra)),65) + carry);
113
+ end function ppc_subfe;
114
+
115
+ function ppc_addze(ra : std_ulogic_vector(63 downto 0);carry : std_ulogic) return std_ulogic_vector is
116
+ begin
117
+ return std_logic_vector(resize(unsigned(ra),65) + carry);
118
+ end function ppc_addze;
119
+
120
+ function ppc_addis(ra : std_ulogic_vector(63 downto 0);si : std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
121
+ begin
122
+ return std_ulogic_vector(signed(ra) + shift_left(resize(signed(si),32),16));
123
+ end function ppc_addis;
124
+
125
+ function ppc_add(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
126
+ begin
127
+ return std_ulogic_vector(signed(ra) + signed(rb));
128
+ end function ppc_add;
129
+
130
+ function ppc_subf(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
131
+ begin
132
+ return std_ulogic_vector(signed(rb) - signed(ra));
133
+ end function ppc_subf;
134
+
135
+ function ppc_neg(ra : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
136
+ begin
137
+ return std_ulogic_vector(signed(ra));
138
+ end function ppc_neg;
139
+
140
+ function ppc_andi(rs : std_ulogic_vector(63 downto 0);ui : std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
141
+ begin
142
+ return rs and std_ulogic_vector(resize(unsigned(ui),64));
143
+ end function ppc_andi;
144
+
145
+ function ppc_andis(rs : std_ulogic_vector(63 downto 0);ui : std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
146
+ begin
147
+ return rs and std_ulogic_vector(shift_left(resize(unsigned(ui),64),16));
148
+ end function ppc_andis;
149
+
150
+ function ppc_ori(rs : std_ulogic_vector(63 downto 0);ui : std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
151
+ begin
152
+ return rs or std_ulogic_vector(resize(unsigned(ui),64));
153
+ end function ppc_ori;
154
+
155
+ function ppc_oris(rs : std_ulogic_vector(63 downto 0);ui : std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
156
+ begin
157
+ return rs or std_ulogic_vector(shift_left(resize(unsigned(ui),64),16));
158
+ end function ppc_oris;
159
+
160
+ function ppc_xori(rs : std_ulogic_vector(63 downto 0);ui : std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
161
+ begin
162
+ return rs xor std_ulogic_vector(resize(unsigned(ui),64));
163
+ end function ppc_xori;
164
+
165
+ function ppc_xoris(rs : std_ulogic_vector(63 downto 0);ui : std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
166
+ begin
167
+ return rs xor std_ulogic_vector(shift_left(resize(unsigned(ui),64),16));
168
+ end function ppc_xoris;
169
+
170
+ function ppc_and(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
171
+ begin
172
+ return rs and rb;
173
+ end function ppc_and;
174
+
175
+ function ppc_xor(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
176
+ begin
177
+ return rs xor rb;
178
+ end function ppc_xor;
179
+
180
+ function ppc_nand(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
181
+ begin
182
+ return rs nand rb;
183
+ end function ppc_nand;
184
+
185
+ function ppc_or(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
186
+ begin
187
+ return rs or rb;
188
+ end function ppc_or;
189
+
190
+ function ppc_nor(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
191
+ begin
192
+ return rs nor rb;
193
+ end function ppc_nor;
194
+
195
+ function ppc_andc(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
196
+ begin
197
+ return rs and (rb);
198
+ end function ppc_andc;
199
+
200
+ function ppc_eqv(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
201
+ begin
202
+ return (rs xor rb);
203
+ end function ppc_eqv;
204
+
205
+ function ppc_orc(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
206
+ begin
207
+ return rs or (rb);
208
+ end function ppc_orc;
209
+
210
+ function ppc_extsb(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
211
+ begin
212
+ return std_ulogic_vector(resize(signed(rs(7 downto 0)),rs'length));
213
+ end function ppc_extsb;
214
+
215
+ function ppc_extsh(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
216
+ begin
217
+ return std_ulogic_vector(resize(signed(rs(15 downto 0)),rs'length));
218
+ end function ppc_extsh;
219
+
220
+ function ppc_extsw(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
221
+ begin
222
+ return std_ulogic_vector(resize(signed(rs(31 downto 0)),rs'length));
223
+ end function ppc_extsw;
224
+
225
+ function ppc_cntlzw(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
226
+ begin
227
+ return std_ulogic_vector(to_unsigned(fls_32(rs(31 downto 0)),rs'length));
228
+ end function ppc_cntlzw;
229
+
230
+ function ppc_cnttzw(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
231
+ begin
232
+ return std_ulogic_vector(to_unsigned(ffs_32(rs(31 downto 0)),rs'length));
233
+ end function ppc_cnttzw;
234
+
235
+ function ppc_cntlzd(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
236
+ begin
237
+ return std_ulogic_vector(to_unsigned(fls_64(rs),rs'length));
238
+ end function ppc_cntlzd;
239
+
240
+ function ppc_cnttzd(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
241
+ begin
242
+ return std_ulogic_vector(to_unsigned(ffs_64(rs),rs'length));
243
+ end function ppc_cnttzd;
244
+
245
+ function ppc_popcntb(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
246
+ variable ret : std_ulogic_vector(rs'range);
247
+ variable hi : integer;
248
+ variable lo : integer;
249
+ begin
250
+ ret := (others => '0');
251
+ return ret;
252
+ end function ppc_popcntb;
253
+
254
+ function ppc_popcntw(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
255
+ variable ret : std_ulogic_vector(rs'range);
256
+ variable hi : integer;
257
+ variable lo : integer;
258
+ begin
259
+ ret := (others => '0');
260
+ return ret;
261
+ end function ppc_popcntw;
262
+
263
+ function ppc_popcntd(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
264
+ begin
265
+ return popcnt64(rs);
266
+ end function ppc_popcntd;
267
+
268
+ function ppc_prtyd(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
269
+ variable tmp : std_ulogic;
270
+ variable ret : std_ulogic_vector(63 downto 0);
271
+ begin
272
+ ret := (others => '0');
273
+ tmp := '0';
274
+ ret(0) := tmp;
275
+ return ret;
276
+ end function ppc_prtyd;
277
+
278
+ function ppc_prtyw(rs : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
279
+ variable tmp : std_ulogic;
280
+ variable ret : std_ulogic_vector(63 downto 0);
281
+ begin
282
+ ret := (others => '0');
283
+ tmp := '0';
284
+ ret(0) := tmp;
285
+ tmp := '0';
286
+ ret(32) := tmp;
287
+ return ret;
288
+ end function ppc_prtyw;
289
+
290
+ function ppc_rlwinm(rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(4 downto 0);mb : std_ulogic_vector(4 downto 0);me : std_ulogic_vector(4 downto 0)) return std_ulogic_vector is
291
+ variable hi : integer;
292
+ variable lo : integer;
293
+ variable tmp1 : std_ulogic_vector(63 downto 0);
294
+ variable tmp2 : std_ulogic_vector(63 downto 0);
295
+ begin
296
+ hi := 31 - to_integer(unsigned(mb));
297
+ lo := 31 - to_integer(unsigned(me));
298
+ tmp1 := rs(31 downto 0) & rs(31 downto 0);
299
+ tmp1 := std_ulogic_vector(rotate_left(unsigned(tmp1),to_integer(unsigned(sh))));
300
+ tmp2 := (others => '0');
301
+ if hi < lo then
302
+ ;
303
+ else
304
+ ;
305
+ end if;
306
+ return tmp2;
307
+ end function ppc_rlwinm;
308
+
309
+ function ppc_rlwnm(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0);mb : std_ulogic_vector(4 downto 0);me : std_ulogic_vector(4 downto 0)) return std_ulogic_vector is
310
+ variable hi : integer;
311
+ variable lo : integer;
312
+ variable tmp1 : std_ulogic_vector(63 downto 0);
313
+ variable tmp2 : std_ulogic_vector(63 downto 0);
314
+ variable n : integer;
315
+ begin
316
+ hi := 31 - to_integer(unsigned(mb));
317
+ lo := 31 - to_integer(unsigned(me));
318
+ n := to_integer(unsigned(rb(4 downto 0)));
319
+ tmp1 := rs(31 downto 0) & rs(31 downto 0);
320
+ tmp1 := std_ulogic_vector(rotate_left(unsigned(tmp1),n));
321
+ tmp2 := (others => '0');
322
+ if hi < lo then
323
+ ;
324
+ else
325
+ ;
326
+ end if;
327
+ return tmp2;
328
+ end function ppc_rlwnm;
329
+
330
+ function ppc_rlwimi(ra : std_ulogic_vector(63 downto 0);rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(4 downto 0);mb : std_ulogic_vector(4 downto 0);me : std_ulogic_vector(4 downto 0)) return std_ulogic_vector is
331
+ variable hi : integer;
332
+ variable lo : integer;
333
+ variable tmp1 : std_ulogic_vector(63 downto 0);
334
+ variable tmp2 : std_ulogic_vector(63 downto 0);
335
+ begin
336
+ hi := 31 - to_integer(unsigned(mb));
337
+ lo := 31 - to_integer(unsigned(me));
338
+ tmp1 := rs(31 downto 0) & rs(31 downto 0);
339
+ tmp1 := std_ulogic_vector(rotate_left(unsigned(tmp1),to_integer(unsigned(sh))));
340
+ tmp2 := ra;
341
+ if hi < lo then
342
+ ;
343
+ else
344
+ ;
345
+ end if;
346
+ return tmp2;
347
+ end function ppc_rlwimi;
348
+
349
+ function ppc_rldicl(rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(5 downto 0);mb : std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
350
+ variable hi : integer;
351
+ variable tmp1 : std_ulogic_vector(63 downto 0);
352
+ variable tmp2 : std_ulogic_vector(63 downto 0);
353
+ begin
354
+ hi := 63 - to_integer(unsigned(mb));
355
+ tmp1 := std_ulogic_vector(rotate_left(unsigned(rs),to_integer(unsigned(sh))));
356
+ tmp2 := (others => '0');
357
+ return tmp2;
358
+ end function ppc_rldicl;
359
+
360
+ function ppc_rldicr(rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(5 downto 0);me : std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
361
+ variable lo : integer;
362
+ variable tmp1 : std_ulogic_vector(63 downto 0);
363
+ variable tmp2 : std_ulogic_vector(63 downto 0);
364
+ begin
365
+ lo := 63 - to_integer(unsigned(me));
366
+ tmp1 := std_ulogic_vector(rotate_left(unsigned(rs),to_integer(unsigned(sh))));
367
+ tmp2 := (others => '0');
368
+ return tmp2;
369
+ end function ppc_rldicr;
370
+
371
+ function ppc_rldic(rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(5 downto 0);mb : std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
372
+ variable hi : integer;
373
+ variable lo : integer;
374
+ variable tmp1 : std_ulogic_vector(63 downto 0);
375
+ variable tmp2 : std_ulogic_vector(63 downto 0);
376
+ begin
377
+ hi := 63 - to_integer(unsigned(mb));
378
+ lo := to_integer(unsigned(sh));
379
+ tmp1 := std_ulogic_vector(rotate_left(unsigned(rs),to_integer(unsigned(sh))));
380
+ tmp2 := (others => '0');
381
+ if hi < lo then
382
+ ;
383
+ else
384
+ ;
385
+ end if;
386
+ return tmp2;
387
+ end function ppc_rldic;
388
+
389
+ function ppc_rldcl(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0);mb : std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
390
+ variable hi : integer;
391
+ variable tmp1 : std_ulogic_vector(63 downto 0);
392
+ variable tmp2 : std_ulogic_vector(63 downto 0);
393
+ begin
394
+ hi := 63 - to_integer(unsigned(mb));
395
+ tmp1 := std_ulogic_vector(rotate_left(unsigned(rs),to_integer(unsigned(rb(5 downto 0)))));
396
+ tmp2 := (others => '0');
397
+ return tmp2;
398
+ end function ppc_rldcl;
399
+
400
+ function ppc_rldcr(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0);me : std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
401
+ variable lo : integer;
402
+ variable tmp1 : std_ulogic_vector(63 downto 0);
403
+ variable tmp2 : std_ulogic_vector(63 downto 0);
404
+ begin
405
+ lo := 63 - to_integer(unsigned(me));
406
+ tmp1 := std_ulogic_vector(rotate_left(unsigned(rs),to_integer(unsigned(rb(5 downto 0)))));
407
+ tmp2 := (others => '0');
408
+ return tmp2;
409
+ end function ppc_rldcr;
410
+
411
+ function ppc_rldimi(ra : std_ulogic_vector(63 downto 0);rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(5 downto 0);mb : std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
412
+ variable hi : integer;
413
+ variable lo : integer;
414
+ variable tmp1 : std_ulogic_vector(rs'range);
415
+ variable tmp2 : std_ulogic_vector(rs'range);
416
+ begin
417
+ hi := 63 - to_integer(unsigned(mb));
418
+ lo := to_integer(unsigned(sh));
419
+ tmp1 := std_ulogic_vector(rotate_left(unsigned(rs),lo));
420
+ tmp2 := ra;
421
+ if hi < lo then
422
+ ;
423
+ else
424
+ ;
425
+ end if;
426
+ return tmp2;
427
+ end function ppc_rldimi;
428
+
429
+ function ppc_slw(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
430
+ variable n : integer;
431
+ variable tmp : unsigned(31 downto 0);
432
+ begin
433
+ n := to_integer(unsigned(rb(5 downto 0)));
434
+ tmp := shift_left(unsigned(rs(31 downto 0)),n);
435
+ return (63 downto 32 => '0') & std_ulogic_vector(tmp);
436
+ end function ppc_slw;
437
+
438
+ function ppc_srw(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
439
+ variable n : integer;
440
+ variable tmp : unsigned(31 downto 0);
441
+ begin
442
+ n := to_integer(unsigned(rb(5 downto 0)));
443
+ tmp := shift_right(unsigned(rs(31 downto 0)),n);
444
+ return (63 downto 32 => '0') & std_ulogic_vector(tmp);
445
+ end function ppc_srw;
446
+
447
+ function ppc_srawi(rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
448
+ variable n : integer;
449
+ variable tmp : signed(31 downto 0);
450
+ variable mask : std_ulogic_vector(63 downto 0);
451
+ variable carry : std_ulogic;
452
+ begin
453
+ n := to_integer(unsigned(sh));
454
+ tmp := shift_right(signed(rs(31 downto 0)),n);
455
+ mask := (others => '0');
456
+ carry := '0' when (rs and mask) = (63 downto 0 => '0') else rs(31);
457
+ return carry & std_ulogic_vector(resize(tmp,rs'length));
458
+ end function ppc_srawi;
459
+
460
+ function ppc_sraw(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
461
+ variable n : natural;
462
+ variable tmp : signed(31 downto 0);
463
+ variable mask : std_ulogic_vector(63 downto 0);
464
+ variable carry : std_ulogic;
465
+ begin
466
+ n := to_integer(unsigned(rb(5 downto 0)));
467
+ tmp := shift_right(signed(rs(31 downto 0)),n);
468
+ mask := (others => '0');
469
+ carry := or((rs and mask) and rs(31));
470
+ return carry & std_ulogic_vector(resize(tmp,rs'length));
471
+ end function ppc_sraw;
472
+
473
+ function ppc_sld(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
474
+ variable n : integer;
475
+ begin
476
+ n := to_integer(unsigned(rb(6 downto 0)));
477
+ return std_ulogic_vector(shift_left(unsigned(rs),n));
478
+ end function ppc_sld;
479
+
480
+ function ppc_srd(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
481
+ variable n : integer;
482
+ begin
483
+ n := to_integer(unsigned(rb(6 downto 0)));
484
+ return std_ulogic_vector(shift_right(unsigned(rs),n));
485
+ end function ppc_srd;
486
+
487
+ function ppc_sradi(rs : std_ulogic_vector(63 downto 0);sh : std_ulogic_vector(5 downto 0)) return std_ulogic_vector is
488
+ variable n : integer;
489
+ variable carry : std_ulogic;
490
+ variable mask : std_ulogic_vector(63 downto 0);
491
+ begin
492
+ n := to_integer(unsigned(sh));
493
+ mask := (others => '0');
494
+ carry := '0' when (rs and mask) = (63 downto 0 => '0') else rs(63);
495
+ return carry & std_ulogic_vector(shift_right(signed(rs),n));
496
+ end function ppc_sradi;
497
+
498
+ function ppc_srad(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
499
+ variable n : integer;
500
+ variable carry : std_ulogic;
501
+ variable mask : std_ulogic_vector(63 downto 0);
502
+ begin
503
+ n := to_integer(unsigned(rb(6 downto 0)));
504
+ mask := (others => '0');
505
+ carry := '0' when (rs and mask) = (63 downto 0 => '0') else rs(63);
506
+ return carry & std_ulogic_vector(shift_right(signed(rs),n));
507
+ end function ppc_srad;
508
+
509
+ function ppc_mulld(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
510
+ variable tmp : signed(127 downto 0);
511
+ begin
512
+ tmp := signed(ra) * signed(rb);
513
+ return std_ulogic_vector(tmp(63 downto 0));
514
+ end function ppc_mulld;
515
+
516
+ function ppc_mulhd(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
517
+ variable tmp : signed(127 downto 0);
518
+ begin
519
+ tmp := signed(ra) * signed(rb);
520
+ return std_ulogic_vector(tmp(127 downto 64));
521
+ end function ppc_mulhd;
522
+
523
+ function ppc_mulhdu(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
524
+ variable tmp : unsigned(127 downto 0);
525
+ begin
526
+ tmp := unsigned(ra) * unsigned(rb);
527
+ return std_ulogic_vector(tmp(127 downto 64));
528
+ end function ppc_mulhdu;
529
+
530
+ function ppc_mulli(ra : std_ulogic_vector(63 downto 0);si : std_ulogic_vector(15 downto 0)) return std_ulogic_vector is
531
+ variable tmp : signed(79 downto 0);
532
+ begin
533
+ tmp := signed(ra) * signed(si);
534
+ return std_ulogic_vector(tmp(63 downto 0));
535
+ end function ppc_mulli;
536
+
537
+ function ppc_mullw(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
538
+ begin
539
+ return std_ulogic_vector(signed(ra(31 downto 0)) * signed(rb(31 downto 0)));
540
+ end function ppc_mullw;
541
+
542
+ function ppc_mulhw(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
543
+ variable tmp : signed(63 downto 0);
544
+ begin
545
+ tmp := signed(ra(31 downto 0)) * signed(rb(31 downto 0));
546
+ return std_ulogic_vector(tmp(63 downto 32)) & std_ulogic_vector(tmp(63 downto 32));
547
+ end function ppc_mulhw;
548
+
549
+ function ppc_mulhwu(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
550
+ variable tmp : unsigned(63 downto 0);
551
+ begin
552
+ tmp := unsigned(ra(31 downto 0)) * unsigned(rb(31 downto 0));
553
+ return std_ulogic_vector(tmp(63 downto 32)) & std_ulogic_vector(tmp(63 downto 32));
554
+ end function ppc_mulhwu;
555
+
556
+ function ppc_cmpi(l : std_ulogic;ra : std_ulogic_vector(63 downto 0);si : std_ulogic_vector(15 downto 0);so : std_ulogic) return std_ulogic_vector is
557
+ variable tmp : signed(ra'range);
558
+ begin
559
+ tmp := signed(ra);
560
+ if l = '0' then
561
+ tmp := resize(signed(ra(31 downto 0)),tmp'length);
562
+ end if;
563
+ return ppc_signed_compare(tmp,resize(signed(si),tmp'length),so);
564
+ end function ppc_cmpi;
565
+
566
+ function ppc_cmp(l : std_ulogic;ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0);so : std_ulogic) return std_ulogic_vector is
567
+ variable tmpa : signed(ra'range);
568
+ variable tmpb : signed(ra'range);
569
+ begin
570
+ tmpa := signed(ra);
571
+ tmpb := signed(rb);
572
+ if l = '0' then
573
+ tmpa := resize(signed(ra(31 downto 0)),ra'length);
574
+ tmpb := resize(signed(rb(31 downto 0)),ra'length);
575
+ end if;
576
+ return ppc_signed_compare(tmpa,tmpb,so);
577
+ end function ppc_cmp;
578
+
579
+ function ppc_cmpli(l : std_ulogic;ra : std_ulogic_vector(63 downto 0);si : std_ulogic_vector(15 downto 0);so : std_ulogic) return std_ulogic_vector is
580
+ variable tmp : unsigned(ra'range);
581
+ begin
582
+ tmp := unsigned(ra);
583
+ if l = '0' then
584
+ tmp := resize(unsigned(ra(31 downto 0)),tmp'length);
585
+ end if;
586
+ return ppc_unsigned_compare(tmp,resize(unsigned(si),tmp'length),so);
587
+ end function ppc_cmpli;
588
+
589
+ function ppc_cmpl(l : std_ulogic;ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0);so : std_ulogic) return std_ulogic_vector is
590
+ variable tmpa : unsigned(ra'range);
591
+ variable tmpb : unsigned(ra'range);
592
+ begin
593
+ tmpa := unsigned(ra);
594
+ tmpb := unsigned(rb);
595
+ if l = '0' then
596
+ tmpa := resize(unsigned(ra(31 downto 0)),ra'length);
597
+ tmpb := resize(unsigned(rb(31 downto 0)),ra'length);
598
+ end if;
599
+ return ppc_unsigned_compare(tmpa,tmpb,so);
600
+ end function ppc_cmpl;
601
+
602
+ function ppc_cmpb(rs : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
603
+ variable ret : std_ulogic_vector(rs'range);
604
+ variable hi : integer;
605
+ variable lo : integer;
606
+ begin
607
+ ;
608
+ return ret;
609
+ end function ppc_cmpb;
610
+
611
+ function ppc_divw(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
612
+ variable tmp : signed(31 downto 0);
613
+ begin
614
+ tmp := signed(ra(31 downto 0)) / signed(rb(31 downto 0));
615
+ return (63 downto 32 => '0') & std_ulogic_vector(tmp);
616
+ end function ppc_divw;
617
+
618
+ function ppc_divdu(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
619
+ variable tmp : unsigned(63 downto 0) := (others => '0');
620
+ begin
621
+ if unsigned(rb) /= 0 then
622
+ tmp := unsigned(ra) / unsigned(rb);
623
+ end if;
624
+ return std_ulogic_vector(tmp);
625
+ end function ppc_divdu;
626
+
627
+ function ppc_divd(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
628
+ variable tmp : signed(63 downto 0) := (others => '0');
629
+ begin
630
+ if signed(rb) /= 0 then
631
+ tmp := signed(ra) / signed(rb);
632
+ end if;
633
+ return std_ulogic_vector(tmp);
634
+ end function ppc_divd;
635
+
636
+ function ppc_divwu(ra : std_ulogic_vector(63 downto 0);rb : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
637
+ variable tmp : unsigned(31 downto 0) := (others => '0');
638
+ begin
639
+ if unsigned(rb(31 downto 0)) /= 0 then
640
+ tmp := unsigned(ra(31 downto 0)) / unsigned(rb(31 downto 0));
641
+ end if;
642
+ return std_ulogic_vector(resize(tmp,ra'length));
643
+ end function ppc_divwu;
644
+
645
+ function ppc_bc_taken(bo : std_ulogic_vector(4 downto 0);bi : std_ulogic_vector(4 downto 0);cr : std_ulogic_vector(31 downto 0);ctr : std_ulogic_vector(63 downto 0)) return integer is
646
+ variable crfield : integer;
647
+ variable crbit_match : std_ulogic;
648
+ variable ctr_not_zero : std_ulogic;
649
+ variable ctr_ok : std_ulogic;
650
+ variable cond_ok : std_ulogic;
651
+ variable ret : integer;
652
+ begin
653
+ crfield := to_integer(unsigned(bi));
654
+ crbit_match := '1' when cr(31 - crfield) = bo(4 - 1) else '0';
655
+ ctr_not_zero := '1' when ctr /= x"0000000000000001" else '0';
656
+ ctr_ok := bo(4 - 2) or (ctr_not_zero xor bo(4 - 3));
657
+ cond_ok := bo(4 - 0) or crbit_match;
658
+ if ctr_ok = '1' and cond_ok = '1' then
659
+ ret := 1;
660
+ else
661
+ ret := 0;
662
+ end if;
663
+ return ret;
664
+ end function ppc_bc_taken;
665
+ end ppc_fx_insns;