123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- library ieee;
- use ieee.std_logic_1164.all;
- use ieee.numeric_std.all;
- library work;
- use work.common.all;
- use work.glibc_random.all;
- entity countzero_tb is
- end countzero_tb;
- architecture behave of countzero_tb is
- constant clk_period: time := 10 ns;
- signal rs: std_ulogic_vector(63 downto 0);
- signal is_32bit, count_right: std_ulogic := '0';
- signal result: std_ulogic_vector(63 downto 0);
- signal randno: std_ulogic_vector(63 downto 0);
- signal clk: std_ulogic;
- begin
- zerocounter_0: entity work.zero_counter
- port map (
- clk => clk,
- rs => rs,
- result => result,
- count_right => count_right,
- is_32bit => is_32bit
- );
- clk_process: process
- begin
- clk <= '0';
- wait for clk_period/2;
- clk <= '1';
- wait for clk_period/2;
- end process;
- stim_process: process
- variable r: std_ulogic_vector(63 downto 0);
- begin
- -- test with input = 0
- report "test zero input";
- rs <= (others => '0');
- is_32bit <= '0';
- count_right <= '0';
- wait for clk_period;
- assert result = x"0000000000000040"
- report "bad cntlzd 0 = " & to_hstring(result);
- count_right <= '1';
- wait for clk_period;
- assert result = x"0000000000000040"
- report "bad cnttzd 0 = " & to_hstring(result);
- is_32bit <= '1';
- count_right <= '0';
- wait for clk_period;
- assert result = x"0000000000000020"
- report "bad cntlzw 0 = " & to_hstring(result);
- count_right <= '1';
- wait for clk_period;
- assert result = x"0000000000000020"
- report "bad cnttzw 0 = " & to_hstring(result);
- report "test cntlzd/w";
- count_right <= '0';
- for j in 0 to 100 loop
- r := pseudorand(64);
- r(63) := '1';
- for i in 0 to 63 loop
- rs <= r;
- is_32bit <= '0';
- wait for clk_period;
- assert to_integer(unsigned(result)) = i
- report "bad cntlzd " & to_hstring(rs) & " -> " & to_hstring(result);
- rs <= r(31 downto 0) & r(63 downto 32);
- is_32bit <= '1';
- wait for clk_period;
- if i < 32 then
- assert to_integer(unsigned(result)) = i
- report "bad cntlzw " & to_hstring(rs) & " -> " & to_hstring(result);
- else
- assert to_integer(unsigned(result)) = 32
- report "bad cntlzw " & to_hstring(rs) & " -> " & to_hstring(result);
- end if;
- r := '0' & r(63 downto 1);
- end loop;
- end loop;
- report "test cnttzd/w";
- count_right <= '1';
- for j in 0 to 100 loop
- r := pseudorand(64);
- r(0) := '1';
- for i in 0 to 63 loop
- rs <= r;
- is_32bit <= '0';
- wait for clk_period;
- assert to_integer(unsigned(result)) = i
- report "bad cnttzd " & to_hstring(rs) & " -> " & to_hstring(result);
- is_32bit <= '1';
- wait for clk_period;
- if i < 32 then
- assert to_integer(unsigned(result)) = i
- report "bad cnttzw " & to_hstring(rs) & " -> " & to_hstring(result);
- else
- assert to_integer(unsigned(result)) = 32
- report "bad cnttzw " & to_hstring(rs) & " -> " & to_hstring(result);
- end if;
- r := r(62 downto 0) & '0';
- end loop;
- end loop;
- std.env.finish;
- end process;
- end behave;
|