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 := Execute1ToMultiplyInit;
21 signal m2 : MultiplyToExecute1Type;
23 function absval(x: std_ulogic_vector) return std_ulogic_vector is
25 if x(x'left) = '1' then
26 return std_ulogic_vector(- signed(x));
33 multiply_0: entity work.multiply
34 generic map (PIPELINE_DEPTH => pipeline_depth)
35 port map (clk => clk, m_in => m1, m_out => m2);
40 wait for clk_period/2;
42 wait for clk_period/2;
46 variable ra, rb, rt, behave_rt: std_ulogic_vector(63 downto 0);
47 variable si: std_ulogic_vector(15 downto 0);
52 m1.data1 <= x"0000000000001000";
53 m1.data2 <= x"0000000000001111";
56 assert m2.valid = '0';
61 assert m2.valid = '0';
64 assert m2.valid = '0';
67 assert m2.valid = '1';
68 assert m2.result = x"00000000000000000000000001111000";
71 assert m2.valid = '0';
76 assert m2.valid = '0';
80 wait for clk_period * (pipeline_depth-1);
81 assert m2.valid = '1';
82 assert m2.result = x"00000000000000000000000001111000";
85 mulld_loop : for i in 0 to 1000 loop
86 ra := pseudorand(ra'length);
87 rb := pseudorand(rb'length);
89 behave_rt := ppc_mulld(ra, rb);
91 m1.data1 <= absval(ra);
92 m1.data2 <= absval(rb);
93 m1.neg_result <= ra(63) xor rb(63);
100 wait for clk_period * (pipeline_depth-1);
102 assert m2.valid = '1';
104 assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 0))
105 report "bad mulld expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(63 downto 0));
109 mulhdu_loop : for i in 0 to 1000 loop
110 ra := pseudorand(ra'length);
111 rb := pseudorand(rb'length);
113 behave_rt := ppc_mulhdu(ra, rb);
117 m1.neg_result <= '0';
124 wait for clk_period * (pipeline_depth-1);
126 assert m2.valid = '1';
128 assert to_hstring(behave_rt) = to_hstring(m2.result(127 downto 64))
129 report "bad mulhdu expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(127 downto 64));
133 mulhd_loop : for i in 0 to 1000 loop
134 ra := pseudorand(ra'length);
135 rb := pseudorand(rb'length);
137 behave_rt := ppc_mulhd(ra, rb);
139 m1.data1 <= absval(ra);
140 m1.data2 <= absval(rb);
141 m1.neg_result <= ra(63) xor rb(63);
148 wait for clk_period * (pipeline_depth-1);
150 assert m2.valid = '1';
152 assert to_hstring(behave_rt) = to_hstring(m2.result(127 downto 64))
153 report "bad mulhd expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(127 downto 64));
157 mullw_loop : for i in 0 to 1000 loop
158 ra := pseudorand(ra'length);
159 rb := pseudorand(rb'length);
161 behave_rt := ppc_mullw(ra, rb);
163 m1.data1 <= (others => '0');
164 m1.data1(31 downto 0) <= absval(ra(31 downto 0));
165 m1.data2 <= (others => '0');
166 m1.data2(31 downto 0) <= absval(rb(31 downto 0));
167 m1.neg_result <= ra(31) xor rb(31);
174 wait for clk_period * (pipeline_depth-1);
176 assert m2.valid = '1';
178 assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 0))
179 report "bad mullw expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(63 downto 0));
183 mulhw_loop : for i in 0 to 1000 loop
184 ra := pseudorand(ra'length);
185 rb := pseudorand(rb'length);
187 behave_rt := ppc_mulhw(ra, rb);
189 m1.data1 <= (others => '0');
190 m1.data1(31 downto 0) <= absval(ra(31 downto 0));
191 m1.data2 <= (others => '0');
192 m1.data2(31 downto 0) <= absval(rb(31 downto 0));
193 m1.neg_result <= ra(31) xor rb(31);
200 wait for clk_period * (pipeline_depth-1);
202 assert m2.valid = '1';
204 assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 32) & m2.result(63 downto 32))
205 report "bad mulhw expected " & to_hstring(behave_rt) & " got " &
206 to_hstring(m2.result(63 downto 32) & m2.result(63 downto 32));
210 mulhwu_loop : for i in 0 to 1000 loop
211 ra := pseudorand(ra'length);
212 rb := pseudorand(rb'length);
214 behave_rt := ppc_mulhwu(ra, rb);
216 m1.data1 <= (others => '0');
217 m1.data1(31 downto 0) <= ra(31 downto 0);
218 m1.data2 <= (others => '0');
219 m1.data2(31 downto 0) <= rb(31 downto 0);
220 m1.neg_result <= '0';
227 wait for clk_period * (pipeline_depth-1);
229 assert m2.valid = '1';
231 assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 32) & m2.result(63 downto 32))
232 report "bad mulhwu expected " & to_hstring(behave_rt) & " got " &
233 to_hstring(m2.result(63 downto 32) & m2.result(63 downto 32));
237 mulli_loop : for i in 0 to 1000 loop
238 ra := pseudorand(ra'length);
239 si := pseudorand(si'length);
241 behave_rt := ppc_mulli(ra, si);
243 m1.data1 <= absval(ra);
244 m1.data2 <= (others => '0');
245 m1.data2(15 downto 0) <= absval(si);
246 m1.neg_result <= ra(63) xor si(15);
253 wait for clk_period * (pipeline_depth-1);
255 assert m2.valid = '1';
257 assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 0))
258 report "bad mulli expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(63 downto 0));