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.
- checksums.yaml +7 -0
- data/bin/vertigo +7 -0
- data/lib/vertigo.rb +4 -0
- data/lib/vertigo/ast.rb +87 -0
- data/lib/vertigo/ast_vertigo_rkgen.rb +607 -0
- data/lib/vertigo/code.rb +57 -0
- data/lib/vertigo/compiler.rb +61 -0
- data/lib/vertigo/generic_lexer.rb +61 -0
- data/lib/vertigo/generic_parser.rb +44 -0
- data/lib/vertigo/indent.rb +20 -0
- data/lib/vertigo/lexer.rb +172 -0
- data/lib/vertigo/parser.rb +1458 -0
- data/lib/vertigo/pretty_printer.rb +749 -0
- data/lib/vertigo/runner.rb +115 -0
- data/lib/vertigo/tb_generator.rb +81 -0
- data/lib/vertigo/template.tb.vhd +72 -0
- data/lib/vertigo/token.rb +67 -0
- data/lib/vertigo/version.rb +3 -0
- data/lib/vertigo/vertigo.rkg +354 -0
- data/lib/vertigo/visitor_vertigo_rkgen.rb +447 -0
- data/tests/ghdl_tests/fsm.vhd +98 -0
- data/tests/ghdl_tests/fsm_synth.vhd +248 -0
- data/tests/ghdl_tests/test_fsm.vhd +162 -0
- data/tests/parser_tests/else.vhd +64 -0
- data/tests/parser_tests/test_MUST_fail.vhd +1 -0
- data/tests/parser_tests/test_accelerator.vhd +160 -0
- data/tests/parser_tests/test_accelerator_pp.vhd +144 -0
- data/tests/parser_tests/test_aggregate.vhd +17 -0
- data/tests/parser_tests/test_aggregate_pp.vhd +15 -0
- data/tests/parser_tests/test_archi_1.vhd +45 -0
- data/tests/parser_tests/test_archi_1_pp.vhd +41 -0
- data/tests/parser_tests/test_array_array_00.vhd +25 -0
- data/tests/parser_tests/test_array_array_00_pp.vhd +25 -0
- data/tests/parser_tests/test_array_urange.vhd +25 -0
- data/tests/parser_tests/test_array_urange_pp.vhd +25 -0
- data/tests/parser_tests/test_chu-1.vhd +80 -0
- data/tests/parser_tests/test_chu-1_pp.vhd +104 -0
- data/tests/parser_tests/test_concat.vhd +11 -0
- data/tests/parser_tests/test_concat_pp.vhd +14 -0
- data/tests/parser_tests/test_counter.vhd +35 -0
- data/tests/parser_tests/test_counter_pp.vhd +35 -0
- data/tests/parser_tests/test_de2.vhd +358 -0
- data/tests/parser_tests/test_de2_pp.vhd +274 -0
- data/tests/parser_tests/test_encode.vhd +2679 -0
- data/tests/parser_tests/test_encode_pp.vhd +2549 -0
- data/tests/parser_tests/test_fsm.vhd +162 -0
- data/tests/parser_tests/test_fsm_pp.vhd +125 -0
- data/tests/parser_tests/test_fsm_synth.vhd +248 -0
- data/tests/parser_tests/test_fsm_synth_pp.vhd +197 -0
- data/tests/parser_tests/test_function-01.vhd +33 -0
- data/tests/parser_tests/test_function-01_pp.vhd +18 -0
- data/tests/parser_tests/test_lfsr.vhd +75 -0
- data/tests/parser_tests/test_lfsr_pp.vhd +44 -0
- data/tests/parser_tests/test_microwatt_cache_ram.vhd +1 -0
- data/tests/parser_tests/test_microwatt_cache_ram_pp.vhd +68 -0
- data/tests/parser_tests/test_microwatt_common.vhd +1 -0
- data/tests/parser_tests/test_microwatt_common_pp.vhd +336 -0
- data/tests/parser_tests/test_microwatt_control.vhd +1 -0
- data/tests/parser_tests/test_microwatt_control_pp.vhd +187 -0
- data/tests/parser_tests/test_microwatt_core.vhd +1 -0
- data/tests/parser_tests/test_microwatt_core_debug.vhd +1 -0
- data/tests/parser_tests/test_microwatt_core_debug_pp.vhd +104 -0
- data/tests/parser_tests/test_microwatt_core_pp.vhd +231 -0
- data/tests/parser_tests/test_microwatt_core_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_core_tb_pp.vhd +43 -0
- data/tests/parser_tests/test_microwatt_countzero.vhd +1 -0
- data/tests/parser_tests/test_microwatt_countzero_pp.vhd +120 -0
- data/tests/parser_tests/test_microwatt_countzero_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_countzero_tb_pp.vhd +70 -0
- data/tests/parser_tests/test_microwatt_cr_file.vhd +1 -0
- data/tests/parser_tests/test_microwatt_cr_file_pp.vhd +74 -0
- data/tests/parser_tests/test_microwatt_cr_hazard.vhd +1 -0
- data/tests/parser_tests/test_microwatt_cr_hazard_pp.vhd +51 -0
- data/tests/parser_tests/test_microwatt_crhelpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_crhelpers_pp.vhd +48 -0
- data/tests/parser_tests/test_microwatt_dcache.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dcache_pp.vhd +481 -0
- data/tests/parser_tests/test_microwatt_dcache_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dcache_tb_pp.vhd +98 -0
- data/tests/parser_tests/test_microwatt_decode1.vhd +1 -0
- data/tests/parser_tests/test_microwatt_decode1_pp.vhd +138 -0
- data/tests/parser_tests/test_microwatt_decode2.vhd +1 -0
- data/tests/parser_tests/test_microwatt_decode2_pp.vhd +300 -0
- data/tests/parser_tests/test_microwatt_decode_types.vhd +1 -0
- data/tests/parser_tests/test_microwatt_decode_types_pp.vhd +67 -0
- data/tests/parser_tests/test_microwatt_divider.vhd +1 -0
- data/tests/parser_tests/test_microwatt_divider_pp.vhd +132 -0
- data/tests/parser_tests/test_microwatt_divider_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_divider_tb_pp.vhd +95 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_dummy.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_dummy_pp.vhd +29 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_tb_pp.vhd +197 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_xilinx.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_xilinx_pp.vhd +139 -0
- data/tests/parser_tests/test_microwatt_execute1.vhd +1 -0
- data/tests/parser_tests/test_microwatt_execute1_pp.vhd +689 -0
- data/tests/parser_tests/test_microwatt_fetch1.vhd +1 -0
- data/tests/parser_tests/test_microwatt_fetch1_pp.vhd +88 -0
- data/tests/parser_tests/test_microwatt_fetch2.vhd +1 -0
- data/tests/parser_tests/test_microwatt_fetch2_pp.vhd +79 -0
- data/tests/parser_tests/test_microwatt_glibc_random.vhd +1 -0
- data/tests/parser_tests/test_microwatt_glibc_random_helpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_glibc_random_helpers_pp.vhd +25 -0
- data/tests/parser_tests/test_microwatt_glibc_random_pp.vhd +41 -0
- data/tests/parser_tests/test_microwatt_gpr_hazard.vhd +1 -0
- data/tests/parser_tests/test_microwatt_gpr_hazard_pp.vhd +68 -0
- data/tests/parser_tests/test_microwatt_helpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_helpers_pp.vhd +153 -0
- data/tests/parser_tests/test_microwatt_icache.vhd +1 -0
- data/tests/parser_tests/test_microwatt_icache_pp.vhd +337 -0
- data/tests/parser_tests/test_microwatt_icache_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_icache_tb_pp.vhd +104 -0
- data/tests/parser_tests/test_microwatt_insn_helpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_insn_helpers_pp.vhd +208 -0
- data/tests/parser_tests/test_microwatt_loadstore1.vhd +1 -0
- data/tests/parser_tests/test_microwatt_loadstore1_pp.vhd +222 -0
- data/tests/parser_tests/test_microwatt_logical.vhd +1 -0
- data/tests/parser_tests/test_microwatt_logical_pp.vhd +87 -0
- data/tests/parser_tests/test_microwatt_multiply.vhd +1 -0
- data/tests/parser_tests/test_microwatt_multiply_pp.vhd +84 -0
- data/tests/parser_tests/test_microwatt_multiply_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_multiply_tb_pp.vhd +75 -0
- data/tests/parser_tests/test_microwatt_plru.vhd +1 -0
- data/tests/parser_tests/test_microwatt_plru_pp.vhd +46 -0
- data/tests/parser_tests/test_microwatt_plru_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_plru_tb_pp.vhd +93 -0
- data/tests/parser_tests/test_microwatt_ppc_fx_insns.vhd +1 -0
- data/tests/parser_tests/test_microwatt_ppc_fx_insns_pp.vhd +665 -0
- data/tests/parser_tests/test_microwatt_register_file.vhd +1 -0
- data/tests/parser_tests/test_microwatt_register_file_pp.vhd +86 -0
- data/tests/parser_tests/test_microwatt_rotator.vhd +1 -0
- data/tests/parser_tests/test_microwatt_rotator_pp.vhd +149 -0
- data/tests/parser_tests/test_microwatt_rotator_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_rotator_tb_pp.vhd +134 -0
- data/tests/parser_tests/test_microwatt_sim_bram.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_bram_helpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_bram_helpers_pp.vhd +52 -0
- data/tests/parser_tests/test_microwatt_sim_bram_pp.vhd +53 -0
- data/tests/parser_tests/test_microwatt_sim_console.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_console_pp.vhd +43 -0
- data/tests/parser_tests/test_microwatt_sim_jtag.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_jtag_pp.vhd +64 -0
- data/tests/parser_tests/test_microwatt_sim_jtag_socket.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_jtag_socket_pp.vhd +36 -0
- data/tests/parser_tests/test_microwatt_sim_uart.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_uart_pp.vhd +90 -0
- data/tests/parser_tests/test_microwatt_soc.vhd +1 -0
- data/tests/parser_tests/test_microwatt_soc_pp.vhd +195 -0
- data/tests/parser_tests/test_microwatt_utils.vhd +1 -0
- data/tests/parser_tests/test_microwatt_utils_pp.vhd +39 -0
- data/tests/parser_tests/test_microwatt_wishbone_arbiter.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_arbiter_pp.vhd +54 -0
- data/tests/parser_tests/test_microwatt_wishbone_bram_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_bram_tb_pp.vhd +157 -0
- data/tests/parser_tests/test_microwatt_wishbone_bram_wrapper.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_bram_wrapper_pp.vhd +62 -0
- data/tests/parser_tests/test_microwatt_wishbone_debug_master.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_debug_master_pp.vhd +124 -0
- data/tests/parser_tests/test_microwatt_wishbone_types.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_types_pp.vhd +38 -0
- data/tests/parser_tests/test_microwatt_writeback.vhd +1 -0
- data/tests/parser_tests/test_microwatt_writeback_pp.vhd +87 -0
- data/tests/parser_tests/test_package-1.vhd +68 -0
- data/tests/parser_tests/test_package-1_pp.vhd +53 -0
- data/tests/parser_tests/test_precedence.vhd +13 -0
- data/tests/parser_tests/test_precedence_pp.vhd +16 -0
- data/tests/parser_tests/test_selected_sig.vhd +14 -0
- data/tests/parser_tests/test_selected_sig_pp.vhd +10 -0
- data/tests/parser_tests/test_slice.vhd +15 -0
- data/tests/parser_tests/test_slice_pp.vhd +16 -0
- data/tests/parser_tests/test_tb-00.vhd +94 -0
- data/tests/parser_tests/test_tb-00_pp.vhd +71 -0
- data/tests/parser_tests/test_type_decl_02.vhd +9 -0
- data/tests/parser_tests/test_type_decl_02_pp.vhd +11 -0
- data/tests/parser_tests/test_use.vhd +7 -0
- data/tests/parser_tests/test_use_pp.vhd +10 -0
- data/tests/parser_tests/test_while_1.vhd +38 -0
- data/tests/parser_tests/test_while_1_pp.vhd +26 -0
- data/tests/parser_tests/test_with-00.vhd +21 -0
- data/tests/parser_tests/test_with-00_pp.vhd +12 -0
- data/tests/tb_gen_tests/test_accelerator.vhd +160 -0
- 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;
|