vertigo_vhdl 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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;