2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
6 use work.decode_types.all;
8 use work.glibc_random.all;
9 use work.ppc_fx_insns.all;
14 architecture behave of multiply_tb is
15 signal clk : std_ulogic;
16 constant clk_period : time := 10 ns;
18 constant pipeline_depth : integer := 4;
20 signal m1 : Execute1ToMultiplyType;
21 signal m2 : MultiplyToExecute1Type;
23 multiply_0: entity work.multiply
24 generic map (PIPELINE_DEPTH => pipeline_depth)
25 port map (clk => clk, m_in => m1, m_out => m2);
30 wait for clk_period/2;
32 wait for clk_period/2;
36 variable ra, rb, rt, behave_rt: std_ulogic_vector(63 downto 0);
37 variable si: std_ulogic_vector(15 downto 0);
42 m1.insn_type <= OP_MUL_L64;
43 m1.data1 <= '0' & x"0000000000001000";
44 m1.data2 <= '0' & x"0000000000001111";
47 assert m2.valid = '0';
52 assert m2.valid = '0';
55 assert m2.valid = '0';
58 assert m2.valid = '1';
59 assert m2.write_reg_data = x"0000000001111000";
62 assert m2.valid = '0';
67 assert m2.valid = '0';
71 wait for clk_period * (pipeline_depth-1);
72 assert m2.valid = '1';
73 assert m2.write_reg_data = x"0000000001111000";
76 mulld_loop : for i in 0 to 1000 loop
77 ra := pseudorand(ra'length);
78 rb := pseudorand(rb'length);
80 behave_rt := ppc_mulld(ra, rb);
85 m1.insn_type <= OP_MUL_L64;
91 wait for clk_period * (pipeline_depth-1);
93 assert m2.valid = '1';
95 assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
96 report "bad mulld expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
100 mulhdu_loop : for i in 0 to 1000 loop
101 ra := pseudorand(ra'length);
102 rb := pseudorand(rb'length);
104 behave_rt := ppc_mulhdu(ra, rb);
106 m1.data1 <= '0' & ra;
107 m1.data2 <= '0' & rb;
109 m1.insn_type <= OP_MUL_H64;
115 wait for clk_period * (pipeline_depth-1);
117 assert m2.valid = '1';
119 assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
120 report "bad mulhdu expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
124 mulhd_loop : for i in 0 to 1000 loop
125 ra := pseudorand(ra'length);
126 rb := pseudorand(rb'length);
128 behave_rt := ppc_mulhd(ra, rb);
130 m1.data1 <= ra(63) & ra;
131 m1.data2 <= rb(63) & rb;
133 m1.insn_type <= OP_MUL_H64;
139 wait for clk_period * (pipeline_depth-1);
141 assert m2.valid = '1';
143 assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
144 report "bad mulhd expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
148 mullw_loop : for i in 0 to 1000 loop
149 ra := pseudorand(ra'length);
150 rb := pseudorand(rb'length);
152 behave_rt := ppc_mullw(ra, rb);
154 m1.data1 <= (others => ra(31));
155 m1.data1(31 downto 0) <= ra(31 downto 0);
156 m1.data2 <= (others => rb(31));
157 m1.data2(31 downto 0) <= rb(31 downto 0);
159 m1.insn_type <= OP_MUL_L64;
165 wait for clk_period * (pipeline_depth-1);
167 assert m2.valid = '1';
169 assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
170 report "bad mullw expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
174 mulhw_loop : for i in 0 to 1000 loop
175 ra := pseudorand(ra'length);
176 rb := pseudorand(rb'length);
178 behave_rt := ppc_mulhw(ra, rb);
180 m1.data1 <= (others => ra(31));
181 m1.data1(31 downto 0) <= ra(31 downto 0);
182 m1.data2 <= (others => rb(31));
183 m1.data2(31 downto 0) <= rb(31 downto 0);
185 m1.insn_type <= OP_MUL_H32;
191 wait for clk_period * (pipeline_depth-1);
193 assert m2.valid = '1';
195 assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
196 report "bad mulhw expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
200 mulhwu_loop : for i in 0 to 1000 loop
201 ra := pseudorand(ra'length);
202 rb := pseudorand(rb'length);
204 behave_rt := ppc_mulhwu(ra, rb);
206 m1.data1 <= (others => '0');
207 m1.data1(31 downto 0) <= ra(31 downto 0);
208 m1.data2 <= (others => '0');
209 m1.data2(31 downto 0) <= rb(31 downto 0);
211 m1.insn_type <= OP_MUL_H32;
217 wait for clk_period * (pipeline_depth-1);
219 assert m2.valid = '1';
221 assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
222 report "bad mulhwu expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
226 mulli_loop : for i in 0 to 1000 loop
227 ra := pseudorand(ra'length);
228 si := pseudorand(si'length);
230 behave_rt := ppc_mulli(ra, si);
232 m1.data1 <= ra(63) & ra;
233 m1.data2 <= (others => si(15));
234 m1.data2(15 downto 0) <= si;
236 m1.insn_type <= OP_MUL_L64;
242 wait for clk_period * (pipeline_depth-1);
244 assert m2.valid = '1';
246 assert to_hstring(behave_rt) = to_hstring(m2.write_reg_data)
247 report "bad mulli expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.write_reg_data);
250 assert false report "end of test" severity failure;