end multiply_tb;
architecture behave of multiply_tb is
- signal clk : std_ulogic;
- constant clk_period : time := 10 ns;
+ signal clk : std_ulogic;
+ constant clk_period : time := 10 ns;
- constant pipeline_depth: integer := 4;
+ constant pipeline_depth : integer := 4;
- signal m1 : Decode2ToMultiplyType;
- signal m2 : MultiplyToWritebackType;
+ signal m1 : Decode2ToMultiplyType;
+ signal m2 : MultiplyToWritebackType;
begin
- multiply_0: entity work.multiply
- generic map (PIPELINE_DEPTH => pipeline_depth)
- port map (clk => clk, m_in => m1, m_out => m2);
+ multiply_0: entity work.multiply
+ generic map (PIPELINE_DEPTH => pipeline_depth)
+ port map (clk => clk, m_in => m1, m_out => m2);
- clk_process: process
- begin
- clk <= '0';
- wait for clk_period/2;
- clk <= '1';
- wait for clk_period/2;
- end process;
+ clk_process: process
+ begin
+ clk <= '0';
+ wait for clk_period/2;
+ clk <= '1';
+ wait for clk_period/2;
+ end process;
- stim_process: process
- variable ra, rb, rt, behave_rt: std_ulogic_vector(63 downto 0);
- variable si: std_ulogic_vector(15 downto 0);
- begin
- wait for clk_period;
+ stim_process: process
+ variable ra, rb, rt, behave_rt: std_ulogic_vector(63 downto 0);
+ variable si: std_ulogic_vector(15 downto 0);
+ begin
+ wait for clk_period;
- m1.valid <= '1';
- m1.insn_type <= OP_MUL_L64;
- m1.write_reg <= "10001";
- m1.data1 <= '0' & x"0000000000001000";
- m1.data2 <= '0' & x"0000000000001111";
- m1.rc <= '0';
+ m1.valid <= '1';
+ m1.insn_type <= OP_MUL_L64;
+ m1.write_reg <= "10001";
+ m1.data1 <= '0' & x"0000000000001000";
+ m1.data2 <= '0' & x"0000000000001111";
+ m1.rc <= '0';
- wait for clk_period;
- assert m2.valid = '0';
+ wait for clk_period;
+ assert m2.valid = '0';
- m1.valid <= '0';
+ m1.valid <= '0';
- wait for clk_period;
- assert m2.valid = '0';
+ wait for clk_period;
+ assert m2.valid = '0';
- wait for clk_period;
- assert m2.valid = '0';
+ wait for clk_period;
+ assert m2.valid = '0';
- wait for clk_period;
- assert m2.valid = '1';
- assert m2.write_reg_enable = '1';
- assert m2.write_reg_nr = "10001";
- assert m2.write_reg_data = x"0000000001111000";
- assert m2.write_cr_enable = '0';
+ wait for clk_period;
+ assert m2.valid = '1';
+ assert m2.write_reg_enable = '1';
+ assert m2.write_reg_nr = "10001";
+ assert m2.write_reg_data = x"0000000001111000";
+ assert m2.write_cr_enable = '0';
- wait for clk_period;
- assert m2.valid = '0';
+ wait for clk_period;
+ assert m2.valid = '0';
- m1.valid <= '1';
- m1.rc <= '1';
+ m1.valid <= '1';
+ m1.rc <= '1';
- wait for clk_period;
- assert m2.valid = '0';
+ wait for clk_period;
+ assert m2.valid = '0';
- m1.valid <= '0';
+ m1.valid <= '0';
- wait for clk_period * (pipeline_depth-1);
- assert m2.valid = '1';
- assert m2.write_reg_enable = '1';
- assert m2.write_reg_nr = "10001";
- assert m2.write_reg_data = x"0000000001111000";
- assert m2.write_cr_enable = '1';
- assert m2.write_cr_data = x"40000000";
+ wait for clk_period * (pipeline_depth-1);
+ assert m2.valid = '1';
+ assert m2.write_reg_enable = '1';
+ assert m2.write_reg_nr = "10001";
+ assert m2.write_reg_data = x"0000000001111000";
+ assert m2.write_cr_enable = '1';
+ assert m2.write_cr_data = x"40000000";
- -- test mulld
- mulld_loop : for i in 0 to 1000 loop
- ra := pseudorand(ra'length);
- rb := pseudorand(rb'length);
+ -- test mulld
+ mulld_loop : for i in 0 to 1000 loop
+ ra := pseudorand(ra'length);
+ rb := pseudorand(rb'length);
- behave_rt := ppc_mulld(ra, rb);
+ behave_rt := ppc_mulld(ra, rb);
- m1.data1 <= '0' & ra;
- m1.data2 <= '0' & rb;
- m1.valid <= '1';
- m1.insn_type <= OP_MUL_L64;
+ m1.data1 <= '0' & ra;
+ m1.data2 <= '0' & rb;
+ m1.valid <= '1';
+ m1.insn_type <= OP_MUL_L64;
- wait for clk_period;
+ wait for clk_period;
- m1.valid <= '0';
+ m1.valid <= '0';
- wait for clk_period * (pipeline_depth-1);
+ wait for clk_period * (pipeline_depth-1);
- assert m2.valid = '1';
+ assert m2.valid = '1';
- assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
- report "bad mulld expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
- end loop;
+ assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
+ report "bad mulld expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
+ end loop;
- -- test mulhdu
- mulhdu_loop : for i in 0 to 1000 loop
- ra := pseudorand(ra'length);
- rb := pseudorand(rb'length);
+ -- test mulhdu
+ mulhdu_loop : for i in 0 to 1000 loop
+ ra := pseudorand(ra'length);
+ rb := pseudorand(rb'length);
- behave_rt := ppc_mulhdu(ra, rb);
+ behave_rt := ppc_mulhdu(ra, rb);
- m1.data1 <= '0' & ra;
- m1.data2 <= '0' & rb;
- m1.valid <= '1';
- m1.insn_type <= OP_MUL_H64;
+ m1.data1 <= '0' & ra;
+ m1.data2 <= '0' & rb;
+ m1.valid <= '1';
+ m1.insn_type <= OP_MUL_H64;
- wait for clk_period;
+ wait for clk_period;
- m1.valid <= '0';
+ m1.valid <= '0';
- wait for clk_period * (pipeline_depth-1);
+ wait for clk_period * (pipeline_depth-1);
- assert m2.valid = '1';
+ assert m2.valid = '1';
- assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
- report "bad mulhdu expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
- end loop;
+ assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
+ report "bad mulhdu expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
+ end loop;
- -- test mulhd
- mulhd_loop : for i in 0 to 1000 loop
- ra := pseudorand(ra'length);
- rb := pseudorand(rb'length);
+ -- test mulhd
+ mulhd_loop : for i in 0 to 1000 loop
+ ra := pseudorand(ra'length);
+ rb := pseudorand(rb'length);
- behave_rt := ppc_mulhd(ra, rb);
+ behave_rt := ppc_mulhd(ra, rb);
- m1.data1 <= ra(63) & ra;
- m1.data2 <= rb(63) & rb;
- m1.valid <= '1';
- m1.insn_type <= OP_MUL_H64;
+ m1.data1 <= ra(63) & ra;
+ m1.data2 <= rb(63) & rb;
+ m1.valid <= '1';
+ m1.insn_type <= OP_MUL_H64;
- wait for clk_period;
+ wait for clk_period;
- m1.valid <= '0';
+ m1.valid <= '0';
- wait for clk_period * (pipeline_depth-1);
+ wait for clk_period * (pipeline_depth-1);
- assert m2.valid = '1';
+ assert m2.valid = '1';
- assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
- report "bad mulhd expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
- end loop;
+ assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
+ report "bad mulhd expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
+ end loop;
- -- test mullw
- mullw_loop : for i in 0 to 1000 loop
- ra := pseudorand(ra'length);
- rb := pseudorand(rb'length);
+ -- test mullw
+ mullw_loop : for i in 0 to 1000 loop
+ ra := pseudorand(ra'length);
+ rb := pseudorand(rb'length);
- behave_rt := ppc_mullw(ra, rb);
+ behave_rt := ppc_mullw(ra, rb);
- m1.data1 <= (others => ra(31));
- m1.data1(31 downto 0) <= ra(31 downto 0);
- m1.data2 <= (others => rb(31));
- m1.data2(31 downto 0) <= rb(31 downto 0);
- m1.valid <= '1';
- m1.insn_type <= OP_MUL_L64;
+ m1.data1 <= (others => ra(31));
+ m1.data1(31 downto 0) <= ra(31 downto 0);
+ m1.data2 <= (others => rb(31));
+ m1.data2(31 downto 0) <= rb(31 downto 0);
+ m1.valid <= '1';
+ m1.insn_type <= OP_MUL_L64;
- wait for clk_period;
+ wait for clk_period;
- m1.valid <= '0';
+ m1.valid <= '0';
- wait for clk_period * (pipeline_depth-1);
+ wait for clk_period * (pipeline_depth-1);
- assert m2.valid = '1';
+ assert m2.valid = '1';
- assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
- report "bad mullw expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
- end loop;
+ assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
+ report "bad mullw expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
+ end loop;
- -- test mulhw
- mulhw_loop : for i in 0 to 1000 loop
- ra := pseudorand(ra'length);
- rb := pseudorand(rb'length);
+ -- test mulhw
+ mulhw_loop : for i in 0 to 1000 loop
+ ra := pseudorand(ra'length);
+ rb := pseudorand(rb'length);
- behave_rt := ppc_mulhw(ra, rb);
+ behave_rt := ppc_mulhw(ra, rb);
- m1.data1 <= (others => ra(31));
- m1.data1(31 downto 0) <= ra(31 downto 0);
- m1.data2 <= (others => rb(31));
- m1.data2(31 downto 0) <= rb(31 downto 0);
- m1.valid <= '1';
- m1.insn_type <= OP_MUL_H32;
+ m1.data1 <= (others => ra(31));
+ m1.data1(31 downto 0) <= ra(31 downto 0);
+ m1.data2 <= (others => rb(31));
+ m1.data2(31 downto 0) <= rb(31 downto 0);
+ m1.valid <= '1';
+ m1.insn_type <= OP_MUL_H32;
- wait for clk_period;
+ wait for clk_period;
- m1.valid <= '0';
+ m1.valid <= '0';
- wait for clk_period * (pipeline_depth-1);
+ wait for clk_period * (pipeline_depth-1);
- assert m2.valid = '1';
+ assert m2.valid = '1';
- assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
- report "bad mulhw expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
- end loop;
+ assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
+ report "bad mulhw expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
+ end loop;
- -- test mulhwu
- mulhwu_loop : for i in 0 to 1000 loop
- ra := pseudorand(ra'length);
- rb := pseudorand(rb'length);
+ -- test mulhwu
+ mulhwu_loop : for i in 0 to 1000 loop
+ ra := pseudorand(ra'length);
+ rb := pseudorand(rb'length);
- behave_rt := ppc_mulhwu(ra, rb);
+ behave_rt := ppc_mulhwu(ra, rb);
- m1.data1 <= (others => '0');
- m1.data1(31 downto 0) <= ra(31 downto 0);
- m1.data2 <= (others => '0');
- m1.data2(31 downto 0) <= rb(31 downto 0);
- m1.valid <= '1';
- m1.insn_type <= OP_MUL_H32;
+ m1.data1 <= (others => '0');
+ m1.data1(31 downto 0) <= ra(31 downto 0);
+ m1.data2 <= (others => '0');
+ m1.data2(31 downto 0) <= rb(31 downto 0);
+ m1.valid <= '1';
+ m1.insn_type <= OP_MUL_H32;
- wait for clk_period;
+ wait for clk_period;
- m1.valid <= '0';
+ m1.valid <= '0';
- wait for clk_period * (pipeline_depth-1);
+ wait for clk_period * (pipeline_depth-1);
- assert m2.valid = '1';
+ assert m2.valid = '1';
- assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
- report "bad mulhwu expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
- end loop;
+ assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
+ report "bad mulhwu expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
+ end loop;
- -- test mulli
- mulli_loop : for i in 0 to 1000 loop
- ra := pseudorand(ra'length);
- si := pseudorand(si'length);
+ -- test mulli
+ mulli_loop : for i in 0 to 1000 loop
+ ra := pseudorand(ra'length);
+ si := pseudorand(si'length);
- behave_rt := ppc_mulli(ra, si);
+ behave_rt := ppc_mulli(ra, si);
- m1.data1 <= ra(63) & ra;
- m1.data2 <= (others => si(15));
- m1.data2(15 downto 0) <= si;
- m1.valid <= '1';
- m1.insn_type <= OP_MUL_L64;
+ m1.data1 <= ra(63) & ra;
+ m1.data2 <= (others => si(15));
+ m1.data2(15 downto 0) <= si;
+ m1.valid <= '1';
+ m1.insn_type <= OP_MUL_L64;
- wait for clk_period;
+ wait for clk_period;
- m1.valid <= '0';
+ m1.valid <= '0';
- wait for clk_period * (pipeline_depth-1);
+ wait for clk_period * (pipeline_depth-1);
- assert m2.valid = '1';
+ assert m2.valid = '1';
- assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
- report "bad mulli expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
- end loop;
+ assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
+ report "bad mulli expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
+ end loop;
- assert false report "end of test" severity failure;
- wait;
- end process;
+ assert false report "end of test" severity failure;
+ wait;
+ end process;
end behave;