2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
7 use work.glibc_random.all;
8 use work.ppc_fx_insns.all;
9 use work.insn_helpers.all;
14 architecture behave of rotator_tb is
15 constant clk_period: time := 10 ns;
16 signal ra, rs: std_ulogic_vector(63 downto 0);
17 signal shift: std_ulogic_vector(6 downto 0) := (others => '0');
18 signal insn: std_ulogic_vector(31 downto 0) := (others => '0');
19 signal is_32bit, right_shift, arith, clear_left, clear_right: std_ulogic := '0';
20 signal result: std_ulogic_vector(63 downto 0);
21 signal carry_out: std_ulogic;
22 signal extsw: std_ulogic;
25 rotator_0: entity work.rotator
32 right_shift => right_shift,
34 clear_left => clear_left,
35 clear_right => clear_right,
38 carry_out => carry_out
42 variable behave_ra: std_ulogic_vector(63 downto 0);
43 variable behave_ca_ra: std_ulogic_vector(64 downto 0);
46 report "test rlw[i]nm";
47 ra <= (others => '0');
54 rlwnm_loop : for i in 0 to 1000 loop
56 shift <= pseudorand(7);
57 insn <= x"00000" & '0' & pseudorand(10) & '0';
59 behave_ra := ppc_rlwinm(rs, shift(4 downto 0), insn_mb32(insn), insn_me32(insn));
60 assert behave_ra = result
61 report "bad rlwnm expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
71 rlwimi_loop : for i in 0 to 1000 loop
74 shift <= "00" & pseudorand(5);
75 insn <= x"00000" & '0' & pseudorand(10) & '0';
77 behave_ra := ppc_rlwimi(ra, rs, shift(4 downto 0), insn_mb32(insn), insn_me32(insn));
78 assert behave_ra = result
79 report "bad rlwimi expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
83 report "test rld[i]cl";
84 ra <= (others => '0');
90 rldicl_loop : for i in 0 to 1000 loop
92 shift <= pseudorand(7);
93 insn <= x"00000" & '0' & pseudorand(10) & '0';
95 behave_ra := ppc_rldicl(rs, shift(5 downto 0), insn_mb(insn));
96 assert behave_ra = result
97 report "bad rldicl expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
101 report "test rld[i]cr";
102 ra <= (others => '0');
108 rldicr_loop : for i in 0 to 1000 loop
109 rs <= pseudorand(64);
110 shift <= pseudorand(7);
111 insn <= x"00000" & '0' & pseudorand(10) & '0';
113 behave_ra := ppc_rldicr(rs, shift(5 downto 0), insn_me(insn));
114 --report "rs = " & to_hstring(rs);
115 --report "ra = " & to_hstring(ra);
116 --report "shift = " & to_hstring(shift);
117 --report "insn me = " & to_hstring(insn_me(insn));
118 --report "result = " & to_hstring(result);
119 assert behave_ra = result
120 report "bad rldicr expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
125 ra <= (others => '0');
131 rldic_loop : for i in 0 to 1000 loop
132 rs <= pseudorand(64);
133 shift <= '0' & pseudorand(6);
134 insn <= x"00000" & '0' & pseudorand(10) & '0';
136 behave_ra := ppc_rldic(rs, shift(5 downto 0), insn_mb(insn));
137 assert behave_ra = result
138 report "bad rldic expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
142 report "test rldimi";
148 rldimi_loop : for i in 0 to 1000 loop
149 rs <= pseudorand(64);
150 ra <= pseudorand(64);
151 shift <= '0' & pseudorand(6);
152 insn <= x"00000" & '0' & pseudorand(10) & '0';
154 behave_ra := ppc_rldimi(ra, rs, shift(5 downto 0), insn_mb(insn));
155 assert behave_ra = result
156 report "bad rldimi expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
161 ra <= (others => '0');
167 slw_loop : for i in 0 to 1000 loop
168 rs <= pseudorand(64);
169 shift <= pseudorand(7);
171 behave_ra := ppc_slw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
172 assert behave_ra = result
173 report "bad slw expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
178 ra <= (others => '0');
184 sld_loop : for i in 0 to 1000 loop
185 rs <= pseudorand(64);
186 shift <= pseudorand(7);
188 behave_ra := ppc_sld(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
189 assert behave_ra = result
190 report "bad sld expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
195 ra <= (others => '0');
201 srw_loop : for i in 0 to 1000 loop
202 rs <= pseudorand(64);
203 shift <= pseudorand(7);
205 behave_ra := ppc_srw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
206 assert behave_ra = result
207 report "bad srw expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
212 ra <= (others => '0');
218 srd_loop : for i in 0 to 1000 loop
219 rs <= pseudorand(64);
220 shift <= pseudorand(7);
222 behave_ra := ppc_srd(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
223 assert behave_ra = result
224 report "bad srd expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
228 report "test sraw[i]";
229 ra <= (others => '0');
235 sraw_loop : for i in 0 to 1000 loop
236 rs <= pseudorand(64);
237 shift <= '0' & pseudorand(6);
239 behave_ca_ra := ppc_sraw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
240 --report "rs = " & to_hstring(rs);
241 --report "ra = " & to_hstring(ra);
242 --report "shift = " & to_hstring(shift);
243 --report "result = " & to_hstring(carry_out & result);
244 assert behave_ca_ra(63 downto 0) = result and behave_ca_ra(64) = carry_out
245 report "bad sraw expected " & to_hstring(behave_ca_ra) & " got " & to_hstring(carry_out & result);
249 report "test srad[i]";
250 ra <= (others => '0');
256 srad_loop : for i in 0 to 1000 loop
257 rs <= pseudorand(64);
258 shift <= pseudorand(7);
260 behave_ca_ra := ppc_srad(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
261 --report "rs = " & to_hstring(rs);
262 --report "ra = " & to_hstring(ra);
263 --report "shift = " & to_hstring(shift);
264 --report "result = " & to_hstring(carry_out & result);
265 assert behave_ca_ra(63 downto 0) = result and behave_ca_ra(64) = carry_out
266 report "bad srad expected " & to_hstring(behave_ca_ra) & " got " & to_hstring(carry_out & result);
270 report "test extswsli";
271 ra <= (others => '0');
278 extswsli_loop : for i in 0 to 1000 loop
279 rs <= pseudorand(64);
280 shift <= '0' & pseudorand(6);
283 behave_ra(63 downto 32) := (others => rs(31));
284 behave_ra := std_ulogic_vector(shift_left(unsigned(behave_ra),
285 to_integer(unsigned(shift))));
286 --report "rs = " & to_hstring(rs);
287 --report "ra = " & to_hstring(ra);
288 --report "shift = " & to_hstring(shift);
289 --report "result = " & to_hstring(carry_out & result);
290 assert behave_ra = result
291 report "bad extswsli expected " & to_hstring(behave_ra) & " got " & to_hstring(result);