|  |  |  | @ -12,252 +12,252 @@ entity multiply_tb is | 
		
	
		
			
				|  |  |  |  | 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; | 
		
	
	
		
			
				
					|  |  |  | 
 |