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;
24 rotator_0: entity work.rotator
31 right_shift => right_shift,
33 clear_left => clear_left,
34 clear_right => clear_right,
36 carry_out => carry_out
40 variable behave_ra: std_ulogic_vector(63 downto 0);
41 variable behave_ca_ra: std_ulogic_vector(64 downto 0);
44 report "test rlw[i]nm";
45 ra <= (others => '0');
51 rlwnm_loop : for i in 0 to 1000 loop
53 shift <= pseudorand(7);
54 insn <= x"00000" & '0' & pseudorand(10) & '0';
56 behave_ra := ppc_rlwinm(rs, shift(4 downto 0), insn_mb32(insn), insn_me32(insn));
57 assert behave_ra = result
58 report "bad rlwnm expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
68 rlwimi_loop : for i in 0 to 1000 loop
71 shift <= "00" & pseudorand(5);
72 insn <= x"00000" & '0' & pseudorand(10) & '0';
74 behave_ra := ppc_rlwimi(ra, rs, shift(4 downto 0), insn_mb32(insn), insn_me32(insn));
75 assert behave_ra = result
76 report "bad rlwimi expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
80 report "test rld[i]cl";
81 ra <= (others => '0');
87 rldicl_loop : for i in 0 to 1000 loop
89 shift <= pseudorand(7);
90 insn <= x"00000" & '0' & pseudorand(10) & '0';
92 behave_ra := ppc_rldicl(rs, shift(5 downto 0), insn_mb(insn));
93 assert behave_ra = result
94 report "bad rldicl expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
98 report "test rld[i]cr";
99 ra <= (others => '0');
105 rldicr_loop : for i in 0 to 1000 loop
106 rs <= pseudorand(64);
107 shift <= pseudorand(7);
108 insn <= x"00000" & '0' & pseudorand(10) & '0';
110 behave_ra := ppc_rldicr(rs, shift(5 downto 0), insn_me(insn));
111 --report "rs = " & to_hstring(rs);
112 --report "ra = " & to_hstring(ra);
113 --report "shift = " & to_hstring(shift);
114 --report "insn me = " & to_hstring(insn_me(insn));
115 --report "result = " & to_hstring(result);
116 assert behave_ra = result
117 report "bad rldicr expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
122 ra <= (others => '0');
128 rldic_loop : for i in 0 to 1000 loop
129 rs <= pseudorand(64);
130 shift <= '0' & pseudorand(6);
131 insn <= x"00000" & '0' & pseudorand(10) & '0';
133 behave_ra := ppc_rldic(rs, shift(5 downto 0), insn_mb(insn));
134 assert behave_ra = result
135 report "bad rldic expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
139 report "test rldimi";
145 rldimi_loop : for i in 0 to 1000 loop
146 rs <= pseudorand(64);
147 ra <= pseudorand(64);
148 shift <= '0' & pseudorand(6);
149 insn <= x"00000" & '0' & pseudorand(10) & '0';
151 behave_ra := ppc_rldimi(ra, rs, shift(5 downto 0), insn_mb(insn));
152 assert behave_ra = result
153 report "bad rldimi expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
158 ra <= (others => '0');
164 slw_loop : for i in 0 to 1000 loop
165 rs <= pseudorand(64);
166 shift <= pseudorand(7);
168 behave_ra := ppc_slw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
169 assert behave_ra = result
170 report "bad slw expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
175 ra <= (others => '0');
181 sld_loop : for i in 0 to 1000 loop
182 rs <= pseudorand(64);
183 shift <= pseudorand(7);
185 behave_ra := ppc_sld(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
186 assert behave_ra = result
187 report "bad sld expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
192 ra <= (others => '0');
198 srw_loop : for i in 0 to 1000 loop
199 rs <= pseudorand(64);
200 shift <= pseudorand(7);
202 behave_ra := ppc_srw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
203 assert behave_ra = result
204 report "bad srw expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
209 ra <= (others => '0');
215 srd_loop : for i in 0 to 1000 loop
216 rs <= pseudorand(64);
217 shift <= pseudorand(7);
219 behave_ra := ppc_srd(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
220 assert behave_ra = result
221 report "bad srd expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
225 report "test sraw[i]";
226 ra <= (others => '0');
232 sraw_loop : for i in 0 to 1000 loop
233 rs <= pseudorand(64);
234 shift <= '0' & pseudorand(6);
236 behave_ca_ra := ppc_sraw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
237 --report "rs = " & to_hstring(rs);
238 --report "ra = " & to_hstring(ra);
239 --report "shift = " & to_hstring(shift);
240 --report "result = " & to_hstring(carry_out & result);
241 assert behave_ca_ra(63 downto 0) = result and behave_ca_ra(64) = carry_out
242 report "bad sraw expected " & to_hstring(behave_ca_ra) & " got " & to_hstring(carry_out & result);
246 report "test srad[i]";
247 ra <= (others => '0');
253 srad_loop : for i in 0 to 1000 loop
254 rs <= pseudorand(64);
255 shift <= pseudorand(7);
257 behave_ca_ra := ppc_srad(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
258 --report "rs = " & to_hstring(rs);
259 --report "ra = " & to_hstring(ra);
260 --report "shift = " & to_hstring(shift);
261 --report "result = " & to_hstring(carry_out & result);
262 assert behave_ca_ra(63 downto 0) = result and behave_ca_ra(64) = carry_out
263 report "bad srad expected " & to_hstring(behave_ca_ra) & " got " & to_hstring(carry_out & result);
266 assert false report "end of test" severity failure;