You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			270 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			VHDL
		
	
			
		
		
	
	
			270 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			VHDL
		
	
library ieee;
 | 
						|
use ieee.std_logic_1164.all;
 | 
						|
use ieee.numeric_std.all;
 | 
						|
 | 
						|
library work;
 | 
						|
use work.common.all;
 | 
						|
use work.glibc_random.all;
 | 
						|
use work.ppc_fx_insns.all;
 | 
						|
use work.insn_helpers.all;
 | 
						|
 | 
						|
entity rotator_tb is
 | 
						|
end rotator_tb;
 | 
						|
 | 
						|
architecture behave of rotator_tb is
 | 
						|
    constant clk_period: time := 10 ns;
 | 
						|
    signal ra, rs: std_ulogic_vector(63 downto 0);
 | 
						|
    signal shift: std_ulogic_vector(6 downto 0) := (others => '0');
 | 
						|
    signal insn: std_ulogic_vector(31 downto 0) := (others => '0');
 | 
						|
    signal is_32bit, right_shift, arith, clear_left, clear_right: std_ulogic := '0';
 | 
						|
    signal result: std_ulogic_vector(63 downto 0);
 | 
						|
    signal carry_out: std_ulogic;
 | 
						|
 | 
						|
begin
 | 
						|
    rotator_0: entity work.rotator
 | 
						|
	port map (
 | 
						|
	    rs => rs,
 | 
						|
	    ra => ra,
 | 
						|
	    shift => shift,
 | 
						|
	    insn => insn,
 | 
						|
	    is_32bit => is_32bit,
 | 
						|
	    right_shift => right_shift,
 | 
						|
	    arith => arith,
 | 
						|
	    clear_left => clear_left,
 | 
						|
	    clear_right => clear_right,
 | 
						|
	    result => result,
 | 
						|
	    carry_out => carry_out
 | 
						|
	);
 | 
						|
 | 
						|
    stim_process: process
 | 
						|
        variable behave_ra: std_ulogic_vector(63 downto 0);
 | 
						|
	variable behave_ca_ra: std_ulogic_vector(64 downto 0);
 | 
						|
    begin
 | 
						|
	-- rlwinm, rlwnm
 | 
						|
        report "test rlw[i]nm";
 | 
						|
	ra <= (others => '0');
 | 
						|
	is_32bit <= '1';
 | 
						|
	right_shift <= '0';
 | 
						|
	arith <= '0';
 | 
						|
	clear_left <= '1';
 | 
						|
	clear_right <= '1';
 | 
						|
        rlwnm_loop : for i in 0 to 1000 loop
 | 
						|
	    rs <= pseudorand(64);
 | 
						|
	    shift <= pseudorand(7);
 | 
						|
	    insn <= x"00000" & '0' & pseudorand(10) & '0';
 | 
						|
	    wait for clk_period;
 | 
						|
	    behave_ra := ppc_rlwinm(rs, shift(4 downto 0), insn_mb32(insn), insn_me32(insn));
 | 
						|
	    assert behave_ra = result
 | 
						|
		report "bad rlwnm expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
 | 
						|
        end loop;
 | 
						|
 | 
						|
	-- rlwimi
 | 
						|
        report "test rlwimi";
 | 
						|
	is_32bit <= '1';
 | 
						|
	right_shift <= '0';
 | 
						|
	arith <= '0';
 | 
						|
	clear_left <= '1';
 | 
						|
	clear_right <= '1';
 | 
						|
        rlwimi_loop : for i in 0 to 1000 loop
 | 
						|
	    rs <= pseudorand(64);
 | 
						|
	    ra <= pseudorand(64);
 | 
						|
	    shift <= "00" & pseudorand(5);
 | 
						|
	    insn <= x"00000" & '0' & pseudorand(10) & '0';
 | 
						|
	    wait for clk_period;
 | 
						|
	    behave_ra := ppc_rlwimi(ra, rs, shift(4 downto 0), insn_mb32(insn), insn_me32(insn));
 | 
						|
	    assert behave_ra = result
 | 
						|
		report "bad rlwimi expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
 | 
						|
        end loop;
 | 
						|
 | 
						|
	-- rldicl, rldcl
 | 
						|
        report "test rld[i]cl";
 | 
						|
	ra <= (others => '0');
 | 
						|
	is_32bit <= '0';
 | 
						|
	right_shift <= '0';
 | 
						|
	arith <= '0';
 | 
						|
	clear_left <= '1';
 | 
						|
	clear_right <= '0';
 | 
						|
        rldicl_loop : for i in 0 to 1000 loop
 | 
						|
	    rs <= pseudorand(64);
 | 
						|
	    shift <= pseudorand(7);
 | 
						|
	    insn <= x"00000" & '0' & pseudorand(10) & '0';
 | 
						|
	    wait for clk_period;
 | 
						|
	    behave_ra := ppc_rldicl(rs, shift(5 downto 0), insn_mb(insn));
 | 
						|
	    assert behave_ra = result
 | 
						|
		report "bad rldicl expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
 | 
						|
        end loop;
 | 
						|
 | 
						|
	-- rldicr, rldcr
 | 
						|
        report "test rld[i]cr";
 | 
						|
	ra <= (others => '0');
 | 
						|
	is_32bit <= '0';
 | 
						|
	right_shift <= '0';
 | 
						|
	arith <= '0';
 | 
						|
	clear_left <= '0';
 | 
						|
	clear_right <= '1';
 | 
						|
        rldicr_loop : for i in 0 to 1000 loop
 | 
						|
	    rs <= pseudorand(64);
 | 
						|
	    shift <= pseudorand(7);
 | 
						|
	    insn <= x"00000" & '0' & pseudorand(10) & '0';
 | 
						|
	    wait for clk_period;
 | 
						|
	    behave_ra := ppc_rldicr(rs, shift(5 downto 0), insn_me(insn));
 | 
						|
	    --report "rs = " & to_hstring(rs);
 | 
						|
	    --report "ra = " & to_hstring(ra);
 | 
						|
	    --report "shift = " & to_hstring(shift);
 | 
						|
	    --report "insn me = " & to_hstring(insn_me(insn));
 | 
						|
	    --report "result = " & to_hstring(result);
 | 
						|
	    assert behave_ra = result
 | 
						|
		report "bad rldicr expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
 | 
						|
        end loop;
 | 
						|
 | 
						|
	-- rldic
 | 
						|
        report "test rldic";
 | 
						|
	ra <= (others => '0');
 | 
						|
	is_32bit <= '0';
 | 
						|
	right_shift <= '0';
 | 
						|
	arith <= '0';
 | 
						|
	clear_left <= '1';
 | 
						|
	clear_right <= '1';
 | 
						|
        rldic_loop : for i in 0 to 1000 loop
 | 
						|
	    rs <= pseudorand(64);
 | 
						|
	    shift <= '0' & pseudorand(6);
 | 
						|
	    insn <= x"00000" & '0' & pseudorand(10) & '0';
 | 
						|
	    wait for clk_period;
 | 
						|
	    behave_ra := ppc_rldic(rs, shift(5 downto 0), insn_mb(insn));
 | 
						|
	    assert behave_ra = result
 | 
						|
		report "bad rldic expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
 | 
						|
        end loop;
 | 
						|
 | 
						|
	-- rldimi
 | 
						|
        report "test rldimi";
 | 
						|
	is_32bit <= '0';
 | 
						|
	right_shift <= '0';
 | 
						|
	arith <= '0';
 | 
						|
	clear_left <= '1';
 | 
						|
	clear_right <= '1';
 | 
						|
        rldimi_loop : for i in 0 to 1000 loop
 | 
						|
	    rs <= pseudorand(64);
 | 
						|
	    ra <= pseudorand(64);
 | 
						|
	    shift <= '0' & pseudorand(6);
 | 
						|
	    insn <= x"00000" & '0' & pseudorand(10) & '0';
 | 
						|
	    wait for clk_period;
 | 
						|
	    behave_ra := ppc_rldimi(ra, rs, shift(5 downto 0), insn_mb(insn));
 | 
						|
	    assert behave_ra = result
 | 
						|
		report "bad rldimi expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
 | 
						|
        end loop;
 | 
						|
 | 
						|
	-- slw
 | 
						|
        report "test slw";
 | 
						|
	ra <= (others => '0');
 | 
						|
	is_32bit <= '1';
 | 
						|
	right_shift <= '0';
 | 
						|
	arith <= '0';
 | 
						|
	clear_left <= '0';
 | 
						|
	clear_right <= '0';
 | 
						|
        slw_loop : for i in 0 to 1000 loop
 | 
						|
	    rs <= pseudorand(64);
 | 
						|
	    shift <= pseudorand(7);
 | 
						|
	    wait for clk_period;
 | 
						|
	    behave_ra := ppc_slw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
 | 
						|
	    assert behave_ra = result
 | 
						|
		report "bad slw expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
 | 
						|
        end loop;
 | 
						|
 | 
						|
	-- sld
 | 
						|
        report "test sld";
 | 
						|
	ra <= (others => '0');
 | 
						|
	is_32bit <= '0';
 | 
						|
	right_shift <= '0';
 | 
						|
	arith <= '0';
 | 
						|
	clear_left <= '0';
 | 
						|
	clear_right <= '0';
 | 
						|
        sld_loop : for i in 0 to 1000 loop
 | 
						|
	    rs <= pseudorand(64);
 | 
						|
	    shift <= pseudorand(7);
 | 
						|
	    wait for clk_period;
 | 
						|
	    behave_ra := ppc_sld(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
 | 
						|
	    assert behave_ra = result
 | 
						|
		report "bad sld expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
 | 
						|
        end loop;
 | 
						|
 | 
						|
	-- srw
 | 
						|
        report "test srw";
 | 
						|
	ra <= (others => '0');
 | 
						|
	is_32bit <= '1';
 | 
						|
	right_shift <= '1';
 | 
						|
	arith <= '0';
 | 
						|
	clear_left <= '0';
 | 
						|
	clear_right <= '0';
 | 
						|
        srw_loop : for i in 0 to 1000 loop
 | 
						|
	    rs <= pseudorand(64);
 | 
						|
	    shift <= pseudorand(7);
 | 
						|
	    wait for clk_period;
 | 
						|
	    behave_ra := ppc_srw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
 | 
						|
	    assert behave_ra = result
 | 
						|
		report "bad srw expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
 | 
						|
        end loop;
 | 
						|
 | 
						|
	-- srd
 | 
						|
        report "test srd";
 | 
						|
	ra <= (others => '0');
 | 
						|
	is_32bit <= '0';
 | 
						|
	right_shift <= '1';
 | 
						|
	arith <= '0';
 | 
						|
	clear_left <= '0';
 | 
						|
	clear_right <= '0';
 | 
						|
        srd_loop : for i in 0 to 1000 loop
 | 
						|
	    rs <= pseudorand(64);
 | 
						|
	    shift <= pseudorand(7);
 | 
						|
	    wait for clk_period;
 | 
						|
	    behave_ra := ppc_srd(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
 | 
						|
	    assert behave_ra = result
 | 
						|
		report "bad srd expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
 | 
						|
        end loop;
 | 
						|
 | 
						|
	-- sraw[i]
 | 
						|
        report "test sraw[i]";
 | 
						|
	ra <= (others => '0');
 | 
						|
	is_32bit <= '1';
 | 
						|
	right_shift <= '1';
 | 
						|
	arith <= '1';
 | 
						|
	clear_left <= '0';
 | 
						|
	clear_right <= '0';
 | 
						|
        sraw_loop : for i in 0 to 1000 loop
 | 
						|
	    rs <= pseudorand(64);
 | 
						|
	    shift <= '0' & pseudorand(6);
 | 
						|
	    wait for clk_period;
 | 
						|
	    behave_ca_ra := ppc_sraw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
 | 
						|
	    --report "rs = " & to_hstring(rs);
 | 
						|
	    --report "ra = " & to_hstring(ra);
 | 
						|
	    --report "shift = " & to_hstring(shift);
 | 
						|
	    --report "result = " & to_hstring(carry_out & result);
 | 
						|
	    assert behave_ca_ra(63 downto 0) = result and behave_ca_ra(64) = carry_out
 | 
						|
		report "bad sraw expected " & to_hstring(behave_ca_ra) & " got " & to_hstring(carry_out & result);
 | 
						|
        end loop;
 | 
						|
 | 
						|
	-- srad[i]
 | 
						|
        report "test srad[i]";
 | 
						|
	ra <= (others => '0');
 | 
						|
	is_32bit <= '0';
 | 
						|
	right_shift <= '1';
 | 
						|
	arith <= '1';
 | 
						|
	clear_left <= '0';
 | 
						|
	clear_right <= '0';
 | 
						|
        srad_loop : for i in 0 to 1000 loop
 | 
						|
	    rs <= pseudorand(64);
 | 
						|
	    shift <= pseudorand(7);
 | 
						|
	    wait for clk_period;
 | 
						|
	    behave_ca_ra := ppc_srad(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
 | 
						|
	    --report "rs = " & to_hstring(rs);
 | 
						|
	    --report "ra = " & to_hstring(ra);
 | 
						|
	    --report "shift = " & to_hstring(shift);
 | 
						|
	    --report "result = " & to_hstring(carry_out & result);
 | 
						|
	    assert behave_ca_ra(63 downto 0) = result and behave_ca_ra(64) = carry_out
 | 
						|
		report "bad srad expected " & to_hstring(behave_ca_ra) & " got " & to_hstring(carry_out & result);
 | 
						|
        end loop;
 | 
						|
 | 
						|
        assert false report "end of test" severity failure;
 | 
						|
        wait;
 | 
						|
    end process;
 | 
						|
end behave;
 |