Organized VUnit testbenches into test cases.
authorLars Asplund <lars.anders.asplund@gmail.com>
Tue, 8 Jun 2021 20:32:57 +0000 (22:32 +0200)
committerLars Asplund <lars.anders.asplund@gmail.com>
Wed, 9 Jun 2021 16:00:53 +0000 (18:00 +0200)
Several of the testbenches have stimuli code divided into sections preceded with a header comment explaining
what is being tested. These sections have been made into VUnit test cases. The default behavior of VUnit is
to run each test case in a separate simulation which comes with a number of benefits:

* A failing test case doesn't prevent other test cases to be executed
* Test cases are independent. A test case cannot fail as a side-effect to a problem with another test case
* Test execution can be more parallelized and the overall test execution time reduced

Signed-off-by: Lars Asplund <lars.anders.asplund@gmail.com>
countzero_tb.vhdl
divider_tb.vhdl
multiply_tb.vhdl
rotator_tb.vhdl

index 671cda36bbef31849b7f1fe13a5ab27bc266610d..c51d4a7c0a71adf8717790fff5c6a25375e743a1 100644 (file)
@@ -49,75 +49,77 @@ begin
 
         test_runner_setup(runner, runner_cfg);
 
-        -- 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 := rnd.RandSlv(64);
-            r(63) := '1';
-            for i in 0 to 63 loop
-                rs <= r;
+        while test_suite loop
+            if run("Test with input = 0") then
+                rs <= (others => '0');
                 is_32bit <= '0';
+                count_right <= '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';
+                assert result = x"0000000000000040"
+                    report "bad cntlzd 0 = " & to_hstring(result);
+                count_right <= '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 := rnd.RandSlv(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);
+                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;
-                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;
+                assert result = x"0000000000000020"
+                    report "bad cnttzw 0 = " & to_hstring(result);
+
+            elsif run("Test cntlzd/w") then
+                count_right <= '0';
+                for j in 0 to 100 loop
+                    r := rnd.RandSlv(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;
+
+            elsif run("Test cnttzd/w") then
+                count_right <= '1';
+                for j in 0 to 100 loop
+                    r := rnd.RandSlv(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;
+            end if;
         end loop;
 
         test_runner_cleanup(runner);
index e41d80f9f2c720ade27018f184412eb1926571ec..4fee8f7fc13c9379521500355b70befa5f20427f 100644 (file)
@@ -49,513 +49,485 @@ begin
 
         test_runner_setup(runner, runner_cfg);
 
-        rst <= '1';
-        wait for clk_period;
-        rst <= '0';
-
-        d1.valid <= '1';
-        d1.dividend <= x"0000000010001000";
-        d1.divisor  <= x"0000000000001111";
-        d1.is_signed <= '0';
-        d1.is_32bit <= '0';
-        d1.is_extended <= '0';
-        d1.is_modulus <= '0';
-        d1.neg_result <= '0';
-
-        wait for clk_period;
-        assert d2.valid = '0';
-
-        d1.valid <= '0';
-
-        for j in 0 to 66 loop
+        while test_suite loop
+            rst <= '1';
             wait for clk_period;
-            if d2.valid = '1' then
-                exit;
-            end if;
-        end loop;
+            rst <= '0';
 
-        assert d2.valid = '1';
-        assert d2.write_reg_data = x"000000000000f001" report "result " & to_hstring(d2.write_reg_data);
+            d1.is_signed <= '0';
+            d1.neg_result <= '0';
+            d1.is_extended <= '0';
+            d1.is_32bit <= '0';
+            d1.is_modulus <= '0';
+            d1.valid <= '0';
 
-        wait for clk_period;
-        assert d2.valid = '0' report "valid";
+            if run("Test interface") then
+                d1.valid <= '1';
+                d1.dividend <= x"0000000010001000";
+                d1.divisor  <= x"0000000000001111";
 
-        d1.valid <= '1';
+                wait for clk_period;
+                assert d2.valid = '0';
 
-        wait for clk_period;
-        assert d2.valid = '0' report "valid";
+                d1.valid <= '0';
 
-        d1.valid <= '0';
+                for j in 0 to 66 loop
+                    wait for clk_period;
+                    if d2.valid = '1' then
+                        exit;
+                    end if;
+                end loop;
 
-        for j in 0 to 66 loop
-            wait for clk_period;
-            if d2.valid = '1' then
-                exit;
-            end if;
-        end loop;
+                assert d2.valid = '1';
+                assert d2.write_reg_data = x"000000000000f001" report "result " & to_hstring(d2.write_reg_data);
 
-        assert d2.valid = '1';
-        assert d2.write_reg_data = x"000000000000f001" report "result " & to_hstring(d2.write_reg_data);
+                wait for clk_period;
+                assert d2.valid = '0' report "valid";
 
-        wait for clk_period;
-        assert d2.valid = '0';
+                d1.valid <= '1';
 
-        -- test divd
-        report "test divd";
-        divd_loop : for dlength in 1 to 8 loop
-            for vlength in 1 to dlength loop
-                for i in 0 to 100 loop
-                    ra := std_ulogic_vector(resize(signed(rnd.RandSlv(dlength * 8)), 64));
-                    rb := std_ulogic_vector(resize(signed(rnd.RandSlv(vlength * 8)), 64));
+                wait for clk_period;
+                assert d2.valid = '0' report "valid";
 
-                    d1.dividend <= ra when ra(63) = '0' else std_ulogic_vector(- signed(ra));
-                    d1.divisor <= rb when rb(63) = '0' else std_ulogic_vector(- signed(rb));
-                    d1.is_signed <= '1';
-                    d1.neg_result <= ra(63) xor rb(63);
-                    d1.valid <= '1';
+                d1.valid <= '0';
 
+                for j in 0 to 66 loop
                     wait for clk_period;
-
-                    d1.valid <= '0';
-                    for j in 0 to 66 loop
-                        wait for clk_period;
-                        if d2.valid = '1' then
-                            exit;
-                        end if;
-                    end loop;
-                    assert d2.valid = '1';
-
-                    behave_rt := (others => '0');
-                    if rb /= x"0000000000000000" and (ra /= x"8000000000000000" or rb /= x"ffffffffffffffff") then
-                        behave_rt := ppc_divd(ra, rb);
+                    if d2.valid = '1' then
+                        exit;
                     end if;
-                    assert to_hstring(behave_rt) = to_hstring(d2.write_reg_data)
-                        report "bad divd expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
                 end loop;
-            end loop;
-        end loop;
 
-        -- test divdu
-        report "test divdu";
-        divdu_loop : for dlength in 1 to 8 loop
-            for vlength in 1 to dlength loop
-                for i in 0 to 100 loop
-                    ra := std_ulogic_vector(resize(unsigned(rnd.RandSlv(dlength * 8)), 64));
-                    rb := std_ulogic_vector(resize(unsigned(rnd.RandSlv(vlength * 8)), 64));
-
-                    d1.dividend <= ra;
-                    d1.divisor <= rb;
-                    d1.is_signed <= '0';
-                    d1.neg_result <= '0';
-                    d1.valid <= '1';
-
-                    wait for clk_period;
-
-                    d1.valid <= '0';
-                    for j in 0 to 66 loop
-                        wait for clk_period;
-                        if d2.valid = '1' then
-                            exit;
-                        end if;
+                assert d2.valid = '1';
+                assert d2.write_reg_data = x"000000000000f001" report "result " & to_hstring(d2.write_reg_data);
+
+                wait for clk_period;
+                assert d2.valid = '0';
+
+            elsif run("Test divd") then
+                divd_loop : for dlength in 1 to 8 loop
+                    for vlength in 1 to dlength loop
+                        for i in 0 to 100 loop
+                            ra := std_ulogic_vector(resize(signed(rnd.RandSlv(dlength * 8)), 64));
+                            rb := std_ulogic_vector(resize(signed(rnd.RandSlv(vlength * 8)), 64));
+
+                            d1.dividend <= ra when ra(63) = '0' else std_ulogic_vector(- signed(ra));
+                            d1.divisor <= rb when rb(63) = '0' else std_ulogic_vector(- signed(rb));
+                            d1.is_signed <= '1';
+                            d1.neg_result <= ra(63) xor rb(63);
+                            d1.valid <= '1';
+
+                            wait for clk_period;
+
+                            d1.valid <= '0';
+                            for j in 0 to 66 loop
+                                wait for clk_period;
+                                if d2.valid = '1' then
+                                    exit;
+                                end if;
+                            end loop;
+                            assert d2.valid = '1';
+
+                            behave_rt := (others => '0');
+                            if rb /= x"0000000000000000" and (ra /= x"8000000000000000" or rb /= x"ffffffffffffffff") then
+                                behave_rt := ppc_divd(ra, rb);
+                            end if;
+                            assert to_hstring(behave_rt) = to_hstring(d2.write_reg_data)
+                                report "bad divd expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
+                        end loop;
                     end loop;
-                    assert d2.valid = '1';
-
-                    behave_rt := (others => '0');
-                    if rb /= x"0000000000000000" then
-                        behave_rt := ppc_divdu(ra, rb);
-                    end if;
-                    assert to_hstring(behave_rt) = to_hstring(d2.write_reg_data)
-                        report "bad divdu expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
                 end loop;
-            end loop;
-        end loop;
-
-        -- test divde
-        report "test divde";
-        divde_loop : for vlength in 1 to 8 loop
-            for dlength in 1 to vlength loop
-                for i in 0 to 100 loop
-                    ra := std_ulogic_vector(resize(signed(rnd.RandSlv(dlength * 8)), 64));
-                    rb := std_ulogic_vector(resize(signed(rnd.RandSlv(vlength * 8)), 64));
-
-                    d1.dividend <= ra when ra(63) = '0' else std_ulogic_vector(- signed(ra));
-                    d1.divisor <= rb when rb(63) = '0' else std_ulogic_vector(- signed(rb));
-                    d1.is_signed <= '1';
-                    d1.neg_result <= ra(63) xor rb(63);
-                    d1.is_extended <= '1';
-                    d1.valid <= '1';
-
-                    wait for clk_period;
 
-                    d1.valid <= '0';
-                    for j in 0 to 66 loop
-                        wait for clk_period;
-                        if d2.valid = '1' then
-                            exit;
-                        end if;
+            elsif run("Test divdu") then
+                divdu_loop : for dlength in 1 to 8 loop
+                    for vlength in 1 to dlength loop
+                        for i in 0 to 100 loop
+                            ra := std_ulogic_vector(resize(unsigned(rnd.RandSlv(dlength * 8)), 64));
+                            rb := std_ulogic_vector(resize(unsigned(rnd.RandSlv(vlength * 8)), 64));
+
+                            d1.dividend <= ra;
+                            d1.divisor <= rb;
+                            d1.valid <= '1';
+
+                            wait for clk_period;
+
+                            d1.valid <= '0';
+                            for j in 0 to 66 loop
+                                wait for clk_period;
+                                if d2.valid = '1' then
+                                    exit;
+                                end if;
+                            end loop;
+                            assert d2.valid = '1';
+
+                            behave_rt := (others => '0');
+                            if rb /= x"0000000000000000" then
+                                behave_rt := ppc_divdu(ra, rb);
+                            end if;
+                            assert to_hstring(behave_rt) = to_hstring(d2.write_reg_data)
+                                report "bad divdu expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
+                        end loop;
                     end loop;
-                    assert d2.valid = '1';
-
-                    behave_rt := (others => '0');
-                    if rb /= x"0000000000000000" then
-                        d128 := ra & x"0000000000000000";
-                        q128 := std_ulogic_vector(signed(d128) / signed(rb));
-                        if q128(127 downto 63) = x"0000000000000000" & '0' or
-                            q128(127 downto 63) = x"ffffffffffffffff" & '1' then
-                            behave_rt := q128(63 downto 0);
-                        end if;
-                    end if;
-                    assert to_hstring(behave_rt) = to_hstring(d2.write_reg_data)
-                        report "bad divde expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data) & " for ra = " & to_hstring(ra) & " rb = " & to_hstring(rb);
                 end loop;
-            end loop;
-        end loop;
-
-        -- test divdeu
-        report "test divdeu";
-        divdeu_loop : for vlength in 1 to 8 loop
-            for dlength in 1 to vlength loop
-                for i in 0 to 100 loop
-                    ra := std_ulogic_vector(resize(unsigned(rnd.RandSlv(dlength * 8)), 64));
-                    rb := std_ulogic_vector(resize(unsigned(rnd.RandSlv(vlength * 8)), 64));
-
-                    d1.dividend <= ra;
-                    d1.divisor <= rb;
-                    d1.is_signed <= '0';
-                    d1.neg_result <= '0';
-                    d1.is_extended <= '1';
-                    d1.valid <= '1';
-
-                    wait for clk_period;
 
-                    d1.valid <= '0';
-                    for j in 0 to 66 loop
-                        wait for clk_period;
-                        if d2.valid = '1' then
-                            exit;
-                        end if;
+            elsif run("Test divde") then
+                divde_loop : for vlength in 1 to 8 loop
+                    for dlength in 1 to vlength loop
+                        for i in 0 to 100 loop
+                            ra := std_ulogic_vector(resize(signed(rnd.RandSlv(dlength * 8)), 64));
+                            rb := std_ulogic_vector(resize(signed(rnd.RandSlv(vlength * 8)), 64));
+
+                            d1.dividend <= ra when ra(63) = '0' else std_ulogic_vector(- signed(ra));
+                            d1.divisor <= rb when rb(63) = '0' else std_ulogic_vector(- signed(rb));
+                            d1.is_signed <= '1';
+                            d1.neg_result <= ra(63) xor rb(63);
+                            d1.is_extended <= '1';
+                            d1.valid <= '1';
+
+                            wait for clk_period;
+
+                            d1.valid <= '0';
+                            for j in 0 to 66 loop
+                                wait for clk_period;
+                                if d2.valid = '1' then
+                                    exit;
+                                end if;
+                            end loop;
+                            assert d2.valid = '1';
+
+                            behave_rt := (others => '0');
+                            if rb /= x"0000000000000000" then
+                                d128 := ra & x"0000000000000000";
+                                q128 := std_ulogic_vector(signed(d128) / signed(rb));
+                                if q128(127 downto 63) = x"0000000000000000" & '0' or
+                                    q128(127 downto 63) = x"ffffffffffffffff" & '1' then
+                                    behave_rt := q128(63 downto 0);
+                                end if;
+                            end if;
+                            assert to_hstring(behave_rt) = to_hstring(d2.write_reg_data)
+                                report "bad divde expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data) & " for ra = " & to_hstring(ra) & " rb = " & to_hstring(rb);
+                        end loop;
                     end loop;
-                    assert d2.valid = '1';
-
-                    behave_rt := (others => '0');
-                    if unsigned(rb) > unsigned(ra) then
-                        d128 := ra & x"0000000000000000";
-                        q128 := std_ulogic_vector(unsigned(d128) / unsigned(rb));
-                        behave_rt := q128(63 downto 0);
-                    end if;
-                    assert to_hstring(behave_rt) = to_hstring(d2.write_reg_data)
-                        report "bad divdeu expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data) & " for ra = " & to_hstring(ra) & " rb = " & to_hstring(rb);
                 end loop;
-            end loop;
-        end loop;
-
-        -- test divw
-        report "test divw";
-        divw_loop : for dlength in 1 to 4 loop
-            for vlength in 1 to dlength loop
-                for i in 0 to 100 loop
-                    ra := std_ulogic_vector(resize(signed(rnd.RandSlv(dlength * 8)), 64));
-                    rb := std_ulogic_vector(resize(signed(rnd.RandSlv(vlength * 8)), 64));
-
-                    d1.dividend <= ra when ra(63) = '0' else std_ulogic_vector(- signed(ra));
-                    d1.divisor <= rb when rb(63) = '0' else std_ulogic_vector(- signed(rb));
-                    d1.is_signed <= '1';
-                    d1.neg_result <= ra(63) xor rb(63);
-                    d1.is_extended <= '0';
-                    d1.is_32bit <= '1';
-                    d1.valid <= '1';
-
-                    wait for clk_period;
 
-                    d1.valid <= '0';
-                    for j in 0 to 66 loop
-                        wait for clk_period;
-                        if d2.valid = '1' then
-                            exit;
-                        end if;
+            elsif run("Test divdeu") then
+                divdeu_loop : for vlength in 1 to 8 loop
+                    for dlength in 1 to vlength loop
+                        for i in 0 to 100 loop
+                            ra := std_ulogic_vector(resize(unsigned(rnd.RandSlv(dlength * 8)), 64));
+                            rb := std_ulogic_vector(resize(unsigned(rnd.RandSlv(vlength * 8)), 64));
+
+                            d1.dividend <= ra;
+                            d1.divisor <= rb;
+                            d1.is_extended <= '1';
+                            d1.valid <= '1';
+
+                            wait for clk_period;
+
+                            d1.valid <= '0';
+                            for j in 0 to 66 loop
+                                wait for clk_period;
+                                if d2.valid = '1' then
+                                    exit;
+                                end if;
+                            end loop;
+                            assert d2.valid = '1';
+
+                            behave_rt := (others => '0');
+                            if unsigned(rb) > unsigned(ra) then
+                                d128 := ra & x"0000000000000000";
+                                q128 := std_ulogic_vector(unsigned(d128) / unsigned(rb));
+                                behave_rt := q128(63 downto 0);
+                            end if;
+                            assert to_hstring(behave_rt) = to_hstring(d2.write_reg_data)
+                                report "bad divdeu expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data) & " for ra = " & to_hstring(ra) & " rb = " & to_hstring(rb);
+                        end loop;
                     end loop;
-                    assert d2.valid = '1';
-
-                    behave_rt := (others => '0');
-                    if rb /= x"0000000000000000" and (ra /= x"ffffffff80000000" or rb /= x"ffffffffffffffff") then
-                        behave_rt := ppc_divw(ra, rb);
-                    end if;
-                    assert behave_rt = d2.write_reg_data
-                        report "bad divw expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
                 end loop;
-            end loop;
-        end loop;
-
-        -- test divwu
-        report "test divwu";
-        divwu_loop : for dlength in 1 to 4 loop
-            for vlength in 1 to dlength loop
-                for i in 0 to 100 loop
-                    ra := std_ulogic_vector(resize(unsigned(rnd.RandSlv(dlength * 8)), 64));
-                    rb := std_ulogic_vector(resize(unsigned(rnd.RandSlv(vlength * 8)), 64));
-
-                    d1.dividend <= ra;
-                    d1.divisor <= rb;
-                    d1.is_signed <= '0';
-                    d1.neg_result <= '0';
-                    d1.is_extended <= '0';
-                    d1.is_32bit <= '1';
-                    d1.valid <= '1';
 
-                    wait for clk_period;
-
-                    d1.valid <= '0';
-                    for j in 0 to 66 loop
-                        wait for clk_period;
-                        if d2.valid = '1' then
-                            exit;
-                        end if;
+            elsif run("Test divw") then
+                divw_loop : for dlength in 1 to 4 loop
+                    for vlength in 1 to dlength loop
+                        for i in 0 to 100 loop
+                            ra := std_ulogic_vector(resize(signed(rnd.RandSlv(dlength * 8)), 64));
+                            rb := std_ulogic_vector(resize(signed(rnd.RandSlv(vlength * 8)), 64));
+
+                            d1.dividend <= ra when ra(63) = '0' else std_ulogic_vector(- signed(ra));
+                            d1.divisor <= rb when rb(63) = '0' else std_ulogic_vector(- signed(rb));
+                            d1.is_signed <= '1';
+                            d1.neg_result <= ra(63) xor rb(63);
+                            d1.is_32bit <= '1';
+                            d1.valid <= '1';
+
+                            wait for clk_period;
+
+                            d1.valid <= '0';
+                            for j in 0 to 66 loop
+                                wait for clk_period;
+                                if d2.valid = '1' then
+                                    exit;
+                                end if;
+                            end loop;
+                            assert d2.valid = '1';
+
+                            behave_rt := (others => '0');
+                            if rb /= x"0000000000000000" and (ra /= x"ffffffff80000000" or rb /= x"ffffffffffffffff") then
+                                behave_rt := ppc_divw(ra, rb);
+                            end if;
+                            assert behave_rt = d2.write_reg_data
+                                report "bad divw expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
+                        end loop;
                     end loop;
-                    assert d2.valid = '1';
-
-                    behave_rt := (others => '0');
-                    if rb /= x"0000000000000000" then
-                        behave_rt := ppc_divwu(ra, rb);
-                    end if;
-                    assert behave_rt = d2.write_reg_data
-                        report "bad divwu expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
                 end loop;
-            end loop;
-        end loop;
 
-        -- test divwe
-        report "test divwe";
-        divwe_loop : for vlength in 1 to 4 loop
-            for dlength in 1 to vlength loop
-                for i in 0 to 100 loop
-                    ra := std_ulogic_vector(resize(signed(rnd.RandSlv(dlength * 8)), 32)) & x"00000000";
-                    rb := std_ulogic_vector(resize(signed(rnd.RandSlv(vlength * 8)), 64));
-
-                    d1.dividend <= ra when ra(63) = '0' else std_ulogic_vector(- signed(ra));
-                    d1.divisor <= rb when rb(63) = '0' else std_ulogic_vector(- signed(rb));
-                    d1.is_signed <= '1';
-                    d1.neg_result <= ra(63) xor rb(63);
-                    d1.is_extended <= '0';
-                    d1.is_32bit <= '1';
-                    d1.valid <= '1';
-
-                    wait for clk_period;
-
-                    d1.valid <= '0';
-                    for j in 0 to 66 loop
-                        wait for clk_period;
-                        if d2.valid = '1' then
-                            exit;
-                        end if;
+            elsif run("Test divwu") then
+                divwu_loop : for dlength in 1 to 4 loop
+                    for vlength in 1 to dlength loop
+                        for i in 0 to 100 loop
+                            ra := std_ulogic_vector(resize(unsigned(rnd.RandSlv(dlength * 8)), 64));
+                            rb := std_ulogic_vector(resize(unsigned(rnd.RandSlv(vlength * 8)), 64));
+
+                            d1.dividend <= ra;
+                            d1.divisor <= rb;
+                            d1.is_32bit <= '1';
+                            d1.valid <= '1';
+
+                            wait for clk_period;
+
+                            d1.valid <= '0';
+                            for j in 0 to 66 loop
+                                wait for clk_period;
+                                if d2.valid = '1' then
+                                    exit;
+                                end if;
+                            end loop;
+                            assert d2.valid = '1';
+
+                            behave_rt := (others => '0');
+                            if rb /= x"0000000000000000" then
+                                behave_rt := ppc_divwu(ra, rb);
+                            end if;
+                            assert behave_rt = d2.write_reg_data
+                                report "bad divwu expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
+                        end loop;
                     end loop;
-                    assert d2.valid = '1';
-
-                    behave_rt := (others => '0');
-                    if rb /= x"0000000000000000" then
-                        q64 := std_ulogic_vector(signed(ra) / signed(rb));
-                        if q64(63 downto 31) = x"00000000" & '0' or
-                            q64(63 downto 31) = x"ffffffff" & '1' then
-                            behave_rt := x"00000000" & q64(31 downto 0);
-                        end if;
-                        assert behave_rt = d2.write_reg_data
-                            report "bad divwe expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data) & " for ra = " & to_hstring(ra) & " rb = " & to_hstring(rb);
-                    end if;
                 end loop;
-            end loop;
-        end loop;
 
-        -- test divweu
-        report "test divweu";
-        divweu_loop : for vlength in 1 to 4 loop
-            for dlength in 1 to vlength loop
-                for i in 0 to 100 loop
-                    ra := std_ulogic_vector(resize(unsigned(rnd.RandSlv(dlength * 8)), 32)) & x"00000000";
-                    rb := std_ulogic_vector(resize(unsigned(rnd.RandSlv(vlength * 8)), 64));
-
-                    d1.dividend <= ra;
-                    d1.divisor <= rb;
-                    d1.is_signed <= '0';
-                    d1.neg_result <= '0';
-                    d1.is_extended <= '0';
-                    d1.is_32bit <= '1';
-                    d1.valid <= '1';
-
-                    wait for clk_period;
-
-                    d1.valid <= '0';
-                    for j in 0 to 66 loop
-                        wait for clk_period;
-                        if d2.valid = '1' then
-                            exit;
-                        end if;
+            elsif run("Test divwe") then
+                divwe_loop : for vlength in 1 to 4 loop
+                    for dlength in 1 to vlength loop
+                        for i in 0 to 100 loop
+                            ra := std_ulogic_vector(resize(signed(rnd.RandSlv(dlength * 8)), 32)) & x"00000000";
+                            rb := std_ulogic_vector(resize(signed(rnd.RandSlv(vlength * 8)), 64));
+
+                            d1.dividend <= ra when ra(63) = '0' else std_ulogic_vector(- signed(ra));
+                            d1.divisor <= rb when rb(63) = '0' else std_ulogic_vector(- signed(rb));
+                            d1.is_signed <= '1';
+                            d1.neg_result <= ra(63) xor rb(63);
+                            d1.is_32bit <= '1';
+                            d1.valid <= '1';
+
+                            wait for clk_period;
+
+                            d1.valid <= '0';
+                            for j in 0 to 66 loop
+                                wait for clk_period;
+                                if d2.valid = '1' then
+                                    exit;
+                                end if;
+                            end loop;
+                            assert d2.valid = '1';
+
+                            behave_rt := (others => '0');
+                            if rb /= x"0000000000000000" then
+                                q64 := std_ulogic_vector(signed(ra) / signed(rb));
+                                if q64(63 downto 31) = x"00000000" & '0' or
+                                    q64(63 downto 31) = x"ffffffff" & '1' then
+                                    behave_rt := x"00000000" & q64(31 downto 0);
+                                end if;
+                                assert behave_rt = d2.write_reg_data
+                                    report "bad divwe expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data) & " for ra = " & to_hstring(ra) & " rb = " & to_hstring(rb);
+                            end if;
+                        end loop;
                     end loop;
-                    assert d2.valid = '1';
-
-                    behave_rt := (others => '0');
-                    if unsigned(rb(31 downto 0)) > unsigned(ra(63 downto 32)) then
-                        behave_rt := std_ulogic_vector(unsigned(ra) / unsigned(rb));
-                    end if;
-                    assert behave_rt = d2.write_reg_data
-                        report "bad divweu expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data) & " for ra = " & to_hstring(ra) & " rb = " & to_hstring(rb);
                 end loop;
-            end loop;
-        end loop;
-
-        -- test modsd
-        report "test modsd";
-        modsd_loop : for dlength in 1 to 8 loop
-            for vlength in 1 to dlength loop
-                for i in 0 to 100 loop
-                    ra := std_ulogic_vector(resize(signed(rnd.RandSlv(dlength * 8)), 64));
-                    rb := std_ulogic_vector(resize(signed(rnd.RandSlv(vlength * 8)), 64));
-
-                    d1.dividend <= ra when ra(63) = '0' else std_ulogic_vector(- signed(ra));
-                    d1.divisor <= rb when rb(63) = '0' else std_ulogic_vector(- signed(rb));
-                    d1.is_signed <= '1';
-                    d1.neg_result <= ra(63);
-                    d1.is_extended <= '0';
-                    d1.is_32bit <= '0';
-                    d1.is_modulus <= '1';
-                    d1.valid <= '1';
 
-                    wait for clk_period;
-
-                    d1.valid <= '0';
-                    for j in 0 to 66 loop
-                        wait for clk_period;
-                        if d2.valid = '1' then
-                            exit;
-                        end if;
+            elsif run("Test divweu") then
+                divweu_loop : for vlength in 1 to 4 loop
+                    for dlength in 1 to vlength loop
+                        for i in 0 to 100 loop
+                            ra := std_ulogic_vector(resize(unsigned(rnd.RandSlv(dlength * 8)), 32)) & x"00000000";
+                            rb := std_ulogic_vector(resize(unsigned(rnd.RandSlv(vlength * 8)), 64));
+
+                            d1.dividend <= ra;
+                            d1.divisor <= rb;
+                            d1.is_32bit <= '1';
+                            d1.valid <= '1';
+
+                            wait for clk_period;
+
+                            d1.valid <= '0';
+                            for j in 0 to 66 loop
+                                wait for clk_period;
+                                if d2.valid = '1' then
+                                    exit;
+                                end if;
+                            end loop;
+                            assert d2.valid = '1';
+
+                            behave_rt := (others => '0');
+                            if unsigned(rb(31 downto 0)) > unsigned(ra(63 downto 32)) then
+                                behave_rt := std_ulogic_vector(unsigned(ra) / unsigned(rb));
+                            end if;
+                            assert behave_rt = d2.write_reg_data
+                                report "bad divweu expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data) & " for ra = " & to_hstring(ra) & " rb = " & to_hstring(rb);
+                        end loop;
                     end loop;
-                    assert d2.valid = '1';
-
-                    behave_rt := (others => '0');
-                    if rb /= x"0000000000000000" then
-                        behave_rt := std_ulogic_vector(signed(ra) rem signed(rb));
-                    end if;
-                    assert behave_rt = d2.write_reg_data
-                        report "bad modsd expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
                 end loop;
-            end loop;
-        end loop;
-
-        -- test modud
-        report "test modud";
-        modud_loop : for dlength in 1 to 8 loop
-            for vlength in 1 to dlength loop
-                for i in 0 to 100 loop
-                    ra := std_ulogic_vector(resize(unsigned(rnd.RandSlv(dlength * 8)), 64));
-                    rb := std_ulogic_vector(resize(unsigned(rnd.RandSlv(vlength * 8)), 64));
-
-                    d1.dividend <= ra;
-                    d1.divisor <= rb;
-                    d1.is_signed <= '0';
-                    d1.neg_result <= '0';
-                    d1.is_extended <= '0';
-                    d1.is_32bit <= '0';
-                    d1.is_modulus <= '1';
-                    d1.valid <= '1';
-
-                    wait for clk_period;
 
-                    d1.valid <= '0';
-                    for j in 0 to 66 loop
-                        wait for clk_period;
-                        if d2.valid = '1' then
-                            exit;
-                        end if;
+            elsif run("Test modsd") then
+                modsd_loop : for dlength in 1 to 8 loop
+                    for vlength in 1 to dlength loop
+                        for i in 0 to 100 loop
+                            ra := std_ulogic_vector(resize(signed(rnd.RandSlv(dlength * 8)), 64));
+                            rb := std_ulogic_vector(resize(signed(rnd.RandSlv(vlength * 8)), 64));
+
+                            d1.dividend <= ra when ra(63) = '0' else std_ulogic_vector(- signed(ra));
+                            d1.divisor <= rb when rb(63) = '0' else std_ulogic_vector(- signed(rb));
+                            d1.is_signed <= '1';
+                            d1.neg_result <= ra(63);
+                            d1.is_modulus <= '1';
+                            d1.valid <= '1';
+
+                            wait for clk_period;
+
+                            d1.valid <= '0';
+                            for j in 0 to 66 loop
+                                wait for clk_period;
+                                if d2.valid = '1' then
+                                    exit;
+                                end if;
+                            end loop;
+                            assert d2.valid = '1';
+
+                            behave_rt := (others => '0');
+                            if rb /= x"0000000000000000" then
+                                behave_rt := std_ulogic_vector(signed(ra) rem signed(rb));
+                            end if;
+                            assert behave_rt = d2.write_reg_data
+                                report "bad modsd expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
+                        end loop;
                     end loop;
-                    assert d2.valid = '1';
-
-                    behave_rt := (others => '0');
-                    if rb /= x"0000000000000000" then
-                        behave_rt := std_ulogic_vector(unsigned(ra) rem unsigned(rb));
-                    end if;
-                    assert behave_rt = d2.write_reg_data
-                        report "bad modud expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
                 end loop;
-            end loop;
-        end loop;
-
-        -- test modsw
-        report "test modsw";
-        modsw_loop : for dlength in 1 to 4 loop
-            for vlength in 1 to dlength loop
-                for i in 0 to 100 loop
-                    ra := std_ulogic_vector(resize(signed(rnd.RandSlv(dlength * 8)), 64));
-                    rb := std_ulogic_vector(resize(signed(rnd.RandSlv(vlength * 8)), 64));
-
-                    d1.dividend <= ra when ra(63) = '0' else std_ulogic_vector(- signed(ra));
-                    d1.divisor <= rb when rb(63) = '0' else std_ulogic_vector(- signed(rb));
-                    d1.is_signed <= '1';
-                    d1.neg_result <= ra(63);
-                    d1.is_extended <= '0';
-                    d1.is_32bit <= '1';
-                    d1.is_modulus <= '1';
-                    d1.valid <= '1';
-
-                    wait for clk_period;
 
-                    d1.valid <= '0';
-                    for j in 0 to 66 loop
-                        wait for clk_period;
-                        if d2.valid = '1' then
-                            exit;
-                        end if;
+            elsif run("Test modud") then
+                modud_loop : for dlength in 1 to 8 loop
+                    for vlength in 1 to dlength loop
+                        for i in 0 to 100 loop
+                            ra := std_ulogic_vector(resize(unsigned(rnd.RandSlv(dlength * 8)), 64));
+                            rb := std_ulogic_vector(resize(unsigned(rnd.RandSlv(vlength * 8)), 64));
+
+                            d1.dividend <= ra;
+                            d1.divisor <= rb;
+                            d1.is_modulus <= '1';
+                            d1.valid <= '1';
+
+                            wait for clk_period;
+
+                            d1.valid <= '0';
+                            for j in 0 to 66 loop
+                                wait for clk_period;
+                                if d2.valid = '1' then
+                                    exit;
+                                end if;
+                            end loop;
+                            assert d2.valid = '1';
+
+                            behave_rt := (others => '0');
+                            if rb /= x"0000000000000000" then
+                                behave_rt := std_ulogic_vector(unsigned(ra) rem unsigned(rb));
+                            end if;
+                            assert behave_rt = d2.write_reg_data
+                                report "bad modud expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
+                        end loop;
                     end loop;
-                    assert d2.valid = '1';
-
-                    behave_rt := (others => '0');
-                    if rb /= x"0000000000000000" then
-                        rem32 := std_ulogic_vector(signed(ra(31 downto 0)) rem signed(rb(31 downto 0)));
-                        if rem32(31) = '0' then
-                            behave_rt := x"00000000" & rem32;
-                        else
-                            behave_rt := x"ffffffff" & rem32;
-                        end if;
-                    end if;
-                    assert behave_rt = d2.write_reg_data
-                        report "bad modsw expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
                 end loop;
-            end loop;
-        end loop;
-
-        -- test moduw
-        report "test moduw";
-        moduw_loop : for dlength in 1 to 4 loop
-            for vlength in 1 to dlength loop
-                for i in 0 to 100 loop
-                    ra := std_ulogic_vector(resize(unsigned(rnd.RandSlv(dlength * 8)), 64));
-                    rb := std_ulogic_vector(resize(unsigned(rnd.RandSlv(vlength * 8)), 64));
-
-                    d1.dividend <= ra;
-                    d1.divisor <= rb;
-                    d1.is_signed <= '0';
-                    d1.neg_result <= '0';
-                    d1.is_extended <= '0';
-                    d1.is_32bit <= '1';
-                    d1.is_modulus <= '1';
-                    d1.valid <= '1';
-
-                    wait for clk_period;
 
-                    d1.valid <= '0';
-                    for j in 0 to 66 loop
-                        wait for clk_period;
-                        if d2.valid = '1' then
-                            exit;
-                        end if;
+            elsif run("Test modsw") then
+                modsw_loop : for dlength in 1 to 4 loop
+                    for vlength in 1 to dlength loop
+                        for i in 0 to 100 loop
+                            ra := std_ulogic_vector(resize(signed(rnd.RandSlv(dlength * 8)), 64));
+                            rb := std_ulogic_vector(resize(signed(rnd.RandSlv(vlength * 8)), 64));
+
+                            d1.dividend <= ra when ra(63) = '0' else std_ulogic_vector(- signed(ra));
+                            d1.divisor <= rb when rb(63) = '0' else std_ulogic_vector(- signed(rb));
+                            d1.is_signed <= '1';
+                            d1.neg_result <= ra(63);
+                            d1.is_32bit <= '1';
+                            d1.is_modulus <= '1';
+                            d1.valid <= '1';
+
+                            wait for clk_period;
+
+                            d1.valid <= '0';
+                            for j in 0 to 66 loop
+                                wait for clk_period;
+                                if d2.valid = '1' then
+                                    exit;
+                                end if;
+                            end loop;
+                            assert d2.valid = '1';
+
+                            behave_rt := (others => '0');
+                            if rb /= x"0000000000000000" then
+                                rem32 := std_ulogic_vector(signed(ra(31 downto 0)) rem signed(rb(31 downto 0)));
+                                if rem32(31) = '0' then
+                                    behave_rt := x"00000000" & rem32;
+                                else
+                                    behave_rt := x"ffffffff" & rem32;
+                                end if;
+                            end if;
+                            assert behave_rt = d2.write_reg_data
+                                report "bad modsw expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
+                        end loop;
                     end loop;
-                    assert d2.valid = '1';
+                end loop;
 
-                    behave_rt := (others => '0');
-                    if rb /= x"0000000000000000" then
-                        behave_rt := x"00000000" & std_ulogic_vector(unsigned(ra(31 downto 0)) rem unsigned(rb(31 downto 0)));
-                    end if;
-                    assert behave_rt(31 downto 0) = d2.write_reg_data(31 downto 0)
-                        report "bad moduw expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
+            elsif run("Test moduw") then
+                moduw_loop : for dlength in 1 to 4 loop
+                    for vlength in 1 to dlength loop
+                        for i in 0 to 100 loop
+                            ra := std_ulogic_vector(resize(unsigned(rnd.RandSlv(dlength * 8)), 64));
+                            rb := std_ulogic_vector(resize(unsigned(rnd.RandSlv(vlength * 8)), 64));
+
+                            d1.dividend <= ra;
+                            d1.divisor <= rb;
+                            d1.is_32bit <= '1';
+                            d1.is_modulus <= '1';
+                            d1.valid <= '1';
+
+                            wait for clk_period;
+
+                            d1.valid <= '0';
+                            for j in 0 to 66 loop
+                                wait for clk_period;
+                                if d2.valid = '1' then
+                                    exit;
+                                end if;
+                            end loop;
+                            assert d2.valid = '1';
+
+                            behave_rt := (others => '0');
+                            if rb /= x"0000000000000000" then
+                                behave_rt := x"00000000" & std_ulogic_vector(unsigned(ra(31 downto 0)) rem unsigned(rb(31 downto 0)));
+                            end if;
+                            assert behave_rt(31 downto 0) = d2.write_reg_data(31 downto 0)
+                                report "bad moduw expected " & to_hstring(behave_rt) & " got " & to_hstring(d2.write_reg_data);
+                        end loop;
+                    end loop;
                 end loop;
-            end loop;
+            end if;
         end loop;
 
         test_runner_cleanup(runner);
index 7458c332ecac621c7c04db904abebcfd69eb450f..57a93866aceb62fee12c332014cf16dc62d1f5ec 100644 (file)
@@ -58,228 +58,232 @@ begin
 
         test_runner_setup(runner, runner_cfg);
 
-        wait for clk_period;
+        while test_suite loop
+            if run("Test interface") then
+                wait for clk_period;
 
-        m1.valid <= '1';
-        m1.data1 <= x"0000000000001000";
-        m1.data2 <= x"0000000000001111";
+                m1.valid <= '1';
+                m1.data1 <= x"0000000000001000";
+                m1.data2 <= x"0000000000001111";
 
-        wait for clk_period;
-        assert m2.valid = '0';
+                wait for clk_period;
+                assert m2.valid = '0';
 
-        m1.valid <= '0';
+                m1.valid <= '0';
 
-        wait for clk_period;
-        assert m2.valid = '0';
+                wait for clk_period;
+                assert m2.valid = '0';
 
-        wait for clk_period;
-        assert m2.valid = '0';
+                wait for clk_period;
+                assert m2.valid = '0';
 
-        wait for clk_period;
-        assert m2.valid = '1';
-        assert m2.result = x"00000000000000000000000001111000";
+                wait for clk_period;
+                assert m2.valid = '1';
+                assert m2.result = x"00000000000000000000000001111000";
 
-        wait for clk_period;
-        assert m2.valid = '0';
+                wait for clk_period;
+                assert m2.valid = '0';
 
-        m1.valid <= '1';
+                m1.valid <= '1';
 
-        wait for clk_period;
-        assert m2.valid = '0';
+                wait for clk_period;
+                assert m2.valid = '0';
 
-        m1.valid <= '0';
+                m1.valid <= '0';
 
-        wait for clk_period * (pipeline_depth-1);
-        assert m2.valid = '1';
-        assert m2.result = x"00000000000000000000000001111000";
+                wait for clk_period * (pipeline_depth-1);
+                assert m2.valid = '1';
+                assert m2.result = x"00000000000000000000000001111000";
 
-        -- test mulld
-        mulld_loop : for i in 0 to 1000 loop
-            ra := rnd.RandSlv(ra'length);
-            rb := rnd.RandSlv(rb'length);
+            elsif run("Test mulld") then
+                mulld_loop : for i in 0 to 1000 loop
+                    ra := rnd.RandSlv(ra'length);
+                    rb := rnd.RandSlv(rb'length);
 
-            behave_rt := ppc_mulld(ra, rb);
+                    behave_rt := ppc_mulld(ra, rb);
 
-            m1.data1 <= absval(ra);
-            m1.data2 <= absval(rb);
-            sign := ra(63) xor rb(63);
-            m1.not_result <= sign;
-            m1.addend <= (others => sign);
-            m1.valid <= '1';
+                    m1.data1 <= absval(ra);
+                    m1.data2 <= absval(rb);
+                    sign := ra(63) xor rb(63);
+                    m1.not_result <= sign;
+                    m1.addend <= (others => sign);
+                    m1.valid <= '1';
 
-            wait for clk_period;
+                    wait for clk_period;
 
-            m1.valid <= '0';
+                    m1.valid <= '0';
 
-            wait for clk_period * (pipeline_depth-1);
+                    wait for clk_period * (pipeline_depth-1);
 
-            assert m2.valid = '1';
+                    assert m2.valid = '1';
 
-            assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 0))
-                report "bad mulld expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(63 downto 0));
-        end loop;
+                    assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 0))
+                        report "bad mulld expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(63 downto 0));
+                end loop;
 
-        -- test mulhdu
-        mulhdu_loop : for i in 0 to 1000 loop
-            ra := rnd.RandSlv(ra'length);
-            rb := rnd.RandSlv(rb'length);
+            elsif run("Test mulhdu") then
+                mulhdu_loop : for i in 0 to 1000 loop
+                    ra := rnd.RandSlv(ra'length);
+                    rb := rnd.RandSlv(rb'length);
 
-            behave_rt := ppc_mulhdu(ra, rb);
+                    behave_rt := ppc_mulhdu(ra, rb);
 
-            m1.data1 <= ra;
-            m1.data2 <= rb;
-            m1.not_result <= '0';
-            m1.addend <= (others => '0');
-            m1.valid <= '1';
+                    m1.data1 <= ra;
+                    m1.data2 <= rb;
+                    m1.not_result <= '0';
+                    m1.addend <= (others => '0');
+                    m1.valid <= '1';
 
-            wait for clk_period;
+                    wait for clk_period;
 
-            m1.valid <= '0';
+                    m1.valid <= '0';
 
-            wait for clk_period * (pipeline_depth-1);
+                    wait for clk_period * (pipeline_depth-1);
 
-            assert m2.valid = '1';
+                    assert m2.valid = '1';
 
-            assert to_hstring(behave_rt) = to_hstring(m2.result(127 downto 64))
-                report "bad mulhdu expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(127 downto 64));
-        end loop;
+                    assert to_hstring(behave_rt) = to_hstring(m2.result(127 downto 64))
+                        report "bad mulhdu expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(127 downto 64));
+                end loop;
 
-        -- test mulhd
-        mulhd_loop : for i in 0 to 1000 loop
-            ra := rnd.RandSlv(ra'length);
-            rb := rnd.RandSlv(rb'length);
+            elsif run("Test mulhd") then
+                mulhd_loop : for i in 0 to 1000 loop
+                    ra := rnd.RandSlv(ra'length);
+                    rb := rnd.RandSlv(rb'length);
 
-            behave_rt := ppc_mulhd(ra, rb);
+                    behave_rt := ppc_mulhd(ra, rb);
 
-            m1.data1 <= absval(ra);
-            m1.data2 <= absval(rb);
-            sign := ra(63) xor rb(63);
-            m1.not_result <= sign;
-            m1.addend <= (others => sign);
-            m1.valid <= '1';
+                    m1.data1 <= absval(ra);
+                    m1.data2 <= absval(rb);
+                    sign := ra(63) xor rb(63);
+                    m1.not_result <= sign;
+                    m1.addend <= (others => sign);
+                    m1.valid <= '1';
 
-            wait for clk_period;
+                    wait for clk_period;
 
-            m1.valid <= '0';
+                    m1.valid <= '0';
 
-            wait for clk_period * (pipeline_depth-1);
+                    wait for clk_period * (pipeline_depth-1);
 
-            assert m2.valid = '1';
+                    assert m2.valid = '1';
 
-            assert to_hstring(behave_rt) = to_hstring(m2.result(127 downto 64))
-                report "bad mulhd expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(127 downto 64));
-        end loop;
+                    assert to_hstring(behave_rt) = to_hstring(m2.result(127 downto 64))
+                        report "bad mulhd expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(127 downto 64));
+                end loop;
 
-        -- test mullw
-        mullw_loop : for i in 0 to 1000 loop
-            ra := rnd.RandSlv(ra'length);
-            rb := rnd.RandSlv(rb'length);
+            elsif run("Test mullw") then
+                mullw_loop : for i in 0 to 1000 loop
+                    ra := rnd.RandSlv(ra'length);
+                    rb := rnd.RandSlv(rb'length);
 
-            behave_rt := ppc_mullw(ra, rb);
+                    behave_rt := ppc_mullw(ra, rb);
 
-            m1.data1 <= (others => '0');
-            m1.data1(31 downto 0) <= absval(ra(31 downto 0));
-            m1.data2 <= (others => '0');
-            m1.data2(31 downto 0) <= absval(rb(31 downto 0));
-            sign := ra(31) xor rb(31);
-            m1.not_result <= sign;
-            m1.addend <= (others => sign);
-            m1.valid <= '1';
+                    m1.data1 <= (others => '0');
+                    m1.data1(31 downto 0) <= absval(ra(31 downto 0));
+                    m1.data2 <= (others => '0');
+                    m1.data2(31 downto 0) <= absval(rb(31 downto 0));
+                    sign := ra(31) xor rb(31);
+                    m1.not_result <= sign;
+                    m1.addend <= (others => sign);
+                    m1.valid <= '1';
 
-            wait for clk_period;
+                    wait for clk_period;
 
-            m1.valid <= '0';
+                    m1.valid <= '0';
 
-            wait for clk_period * (pipeline_depth-1);
+                    wait for clk_period * (pipeline_depth-1);
 
-            assert m2.valid = '1';
+                    assert m2.valid = '1';
 
-            assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 0))
-                report "bad mullw expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(63 downto 0));
-        end loop;
+                    assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 0))
+                        report "bad mullw expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(63 downto 0));
+                end loop;
 
-        -- test mulhw
-        mulhw_loop : for i in 0 to 1000 loop
-            ra := rnd.RandSlv(ra'length);
-            rb := rnd.RandSlv(rb'length);
+            elsif run("Test mulhw") then
+                mulhw_loop : for i in 0 to 1000 loop
+                    ra := rnd.RandSlv(ra'length);
+                    rb := rnd.RandSlv(rb'length);
 
-            behave_rt := ppc_mulhw(ra, rb);
+                    behave_rt := ppc_mulhw(ra, rb);
 
-            m1.data1 <= (others => '0');
-            m1.data1(31 downto 0) <= absval(ra(31 downto 0));
-            m1.data2 <= (others => '0');
-            m1.data2(31 downto 0) <= absval(rb(31 downto 0));
-            sign := ra(31) xor rb(31);
-            m1.not_result <= sign;
-            m1.addend <= (others => sign);
-            m1.valid <= '1';
+                    m1.data1 <= (others => '0');
+                    m1.data1(31 downto 0) <= absval(ra(31 downto 0));
+                    m1.data2 <= (others => '0');
+                    m1.data2(31 downto 0) <= absval(rb(31 downto 0));
+                    sign := ra(31) xor rb(31);
+                    m1.not_result <= sign;
+                    m1.addend <= (others => sign);
+                    m1.valid <= '1';
 
-            wait for clk_period;
+                    wait for clk_period;
 
-            m1.valid <= '0';
+                    m1.valid <= '0';
 
-            wait for clk_period * (pipeline_depth-1);
+                    wait for clk_period * (pipeline_depth-1);
 
-            assert m2.valid = '1';
+                    assert m2.valid = '1';
 
-            assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 32) & m2.result(63 downto 32))
-                report "bad mulhw expected " & to_hstring(behave_rt) & " got " &
-                to_hstring(m2.result(63 downto 32) & m2.result(63 downto 32));
-        end loop;
+                    assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 32) & m2.result(63 downto 32))
+                        report "bad mulhw expected " & to_hstring(behave_rt) & " got " &
+                        to_hstring(m2.result(63 downto 32) & m2.result(63 downto 32));
+                end loop;
 
-        -- test mulhwu
-        mulhwu_loop : for i in 0 to 1000 loop
-            ra := rnd.RandSlv(ra'length);
-            rb := rnd.RandSlv(rb'length);
+            elsif run("Test mulhwu") then
+                mulhwu_loop : for i in 0 to 1000 loop
+                    ra := rnd.RandSlv(ra'length);
+                    rb := rnd.RandSlv(rb'length);
 
-            behave_rt := ppc_mulhwu(ra, rb);
+                    behave_rt := ppc_mulhwu(ra, rb);
 
-            m1.data1 <= (others => '0');
-            m1.data1(31 downto 0) <= ra(31 downto 0);
-            m1.data2 <= (others => '0');
-            m1.data2(31 downto 0) <= rb(31 downto 0);
-            m1.not_result <= '0';
-            m1.addend <= (others => '0');
-            m1.valid <= '1';
+                    m1.data1 <= (others => '0');
+                    m1.data1(31 downto 0) <= ra(31 downto 0);
+                    m1.data2 <= (others => '0');
+                    m1.data2(31 downto 0) <= rb(31 downto 0);
+                    m1.not_result <= '0';
+                    m1.addend <= (others => '0');
+                    m1.valid <= '1';
 
-            wait for clk_period;
+                    wait for clk_period;
 
-            m1.valid <= '0';
+                    m1.valid <= '0';
 
-            wait for clk_period * (pipeline_depth-1);
+                    wait for clk_period * (pipeline_depth-1);
 
-            assert m2.valid = '1';
+                    assert m2.valid = '1';
 
-            assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 32) & m2.result(63 downto 32))
-                report "bad mulhwu expected " & to_hstring(behave_rt) & " got " &
-                to_hstring(m2.result(63 downto 32) & m2.result(63 downto 32));
-        end loop;
+                    assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 32) & m2.result(63 downto 32))
+                        report "bad mulhwu expected " & to_hstring(behave_rt) & " got " &
+                        to_hstring(m2.result(63 downto 32) & m2.result(63 downto 32));
+                end loop;
 
-        -- test mulli
-        mulli_loop : for i in 0 to 1000 loop
-            ra := rnd.RandSlv(ra'length);
-            si := rnd.RandSlv(si'length);
+            elsif run("Test mulli") then
+                mulli_loop : for i in 0 to 1000 loop
+                    ra := rnd.RandSlv(ra'length);
+                    si := rnd.RandSlv(si'length);
 
-            behave_rt := ppc_mulli(ra, si);
+                    behave_rt := ppc_mulli(ra, si);
 
-            m1.data1 <= absval(ra);
-            m1.data2 <= (others => '0');
-            m1.data2(15 downto 0) <= absval(si);
-            sign := ra(63) xor si(15);
-            m1.not_result <= sign;
-            m1.addend <= (others => sign);
-            m1.valid <= '1';
+                    m1.data1 <= absval(ra);
+                    m1.data2 <= (others => '0');
+                    m1.data2(15 downto 0) <= absval(si);
+                    sign := ra(63) xor si(15);
+                    m1.not_result <= sign;
+                    m1.addend <= (others => sign);
+                    m1.valid <= '1';
 
-            wait for clk_period;
+                    wait for clk_period;
 
-            m1.valid <= '0';
+                    m1.valid <= '0';
 
-            wait for clk_period * (pipeline_depth-1);
+                    wait for clk_period * (pipeline_depth-1);
 
-            assert m2.valid = '1';
+                    assert m2.valid = '1';
 
-            assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 0))
-                report "bad mulli expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(63 downto 0));
+                    assert to_hstring(behave_rt) = to_hstring(m2.result(63 downto 0))
+                        report "bad mulli expected " & to_hstring(behave_rt) & " got " & to_hstring(m2.result(63 downto 0));
+                end loop;
+            end if;
         end loop;
 
         test_runner_cleanup(runner);
index 2849ccfdf7e03dd235ff6bf9000b0e8e838a859d..781027fda356940b039ccf2fc854a01b97d1bf39 100644 (file)
@@ -53,255 +53,244 @@ begin
 
         test_runner_setup(runner, runner_cfg);
 
-        -- rlwinm, rlwnm
-        report "test rlw[i]nm";
-        ra <= (others => '0');
-        is_32bit <= '1';
-        right_shift <= '0';
-        arith <= '0';
-        clear_left <= '1';
-        clear_right <= '1';
-        extsw <= '0';
-        rlwnm_loop : for i in 0 to 1000 loop
-            rs <= rnd.RandSlv(64);
-            shift <= rnd.RandSlv(7);
-            insn <= x"00000" & '0' & rnd.RandSlv(10) & '0';
-            wait for clk_period;
-            behave_ra := ppc_rlwinm(rs, shift(4 downto 0), insn_mb32(insn), insn_me32(insn));
-            assert behave_ra = result
-                report "bad rlwnm expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
-        end loop;
+        while test_suite loop
+            if run("Test rlw[i]nm") then
+                ra <= (others => '0');
+                is_32bit <= '1';
+                right_shift <= '0';
+                arith <= '0';
+                clear_left <= '1';
+                clear_right <= '1';
+                extsw <= '0';
+                rlwnm_loop : for i in 0 to 1000 loop
+                    rs <= rnd.RandSlv(64);
+                    shift <= rnd.RandSlv(7);
+                    insn <= x"00000" & '0' & rnd.RandSlv(10) & '0';
+                    wait for clk_period;
+                    behave_ra := ppc_rlwinm(rs, shift(4 downto 0), insn_mb32(insn), insn_me32(insn));
+                    assert behave_ra = result
+                        report "bad rlwnm expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
+                end loop;
 
-        -- rlwimi
-        report "test rlwimi";
-        is_32bit <= '1';
-        right_shift <= '0';
-        arith <= '0';
-        clear_left <= '1';
-        clear_right <= '1';
-        rlwimi_loop : for i in 0 to 1000 loop
-            rs <= rnd.RandSlv(64);
-            ra <= rnd.RandSlv(64);
-            shift <= "00" & rnd.RandSlv(5);
-            insn <= x"00000" & '0' & rnd.RandSlv(10) & '0';
-            wait for clk_period;
-            behave_ra := ppc_rlwimi(ra, rs, shift(4 downto 0), insn_mb32(insn), insn_me32(insn));
-            assert behave_ra = result
-                report "bad rlwimi expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
-        end loop;
+            elsif run("Test rlwimi") then
+                is_32bit <= '1';
+                right_shift <= '0';
+                arith <= '0';
+                clear_left <= '1';
+                clear_right <= '1';
+                rlwimi_loop : for i in 0 to 1000 loop
+                    rs <= rnd.RandSlv(64);
+                    ra <= rnd.RandSlv(64);
+                    shift <= "00" & rnd.RandSlv(5);
+                    insn <= x"00000" & '0' & rnd.RandSlv(10) & '0';
+                    wait for clk_period;
+                    behave_ra := ppc_rlwimi(ra, rs, shift(4 downto 0), insn_mb32(insn), insn_me32(insn));
+                    assert behave_ra = result
+                        report "bad rlwimi expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
+                end loop;
 
-        -- rldicl, rldcl
-        report "test rld[i]cl";
-        ra <= (others => '0');
-        is_32bit <= '0';
-        right_shift <= '0';
-        arith <= '0';
-        clear_left <= '1';
-        clear_right <= '0';
-        rldicl_loop : for i in 0 to 1000 loop
-            rs <= rnd.RandSlv(64);
-            shift <= rnd.RandSlv(7);
-            insn <= x"00000" & '0' & rnd.RandSlv(10) & '0';
-            wait for clk_period;
-            behave_ra := ppc_rldicl(rs, shift(5 downto 0), insn_mb(insn));
-            assert behave_ra = result
-                report "bad rldicl expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
-        end loop;
+            elsif run("Test rld[i]cl") then
+                ra <= (others => '0');
+                is_32bit <= '0';
+                right_shift <= '0';
+                arith <= '0';
+                clear_left <= '1';
+                clear_right <= '0';
+                rldicl_loop : for i in 0 to 1000 loop
+                    rs <= rnd.RandSlv(64);
+                    shift <= rnd.RandSlv(7);
+                    insn <= x"00000" & '0' & rnd.RandSlv(10) & '0';
+                    wait for clk_period;
+                    behave_ra := ppc_rldicl(rs, shift(5 downto 0), insn_mb(insn));
+                    assert behave_ra = result
+                        report "bad rldicl expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
+                end loop;
 
-        -- rldicr, rldcr
-        report "test rld[i]cr";
-        ra <= (others => '0');
-        is_32bit <= '0';
-        right_shift <= '0';
-        arith <= '0';
-        clear_left <= '0';
-        clear_right <= '1';
-        rldicr_loop : for i in 0 to 1000 loop
-            rs <= rnd.RandSlv(64);
-            shift <= rnd.RandSlv(7);
-            insn <= x"00000" & '0' & rnd.RandSlv(10) & '0';
-            wait for clk_period;
-            behave_ra := ppc_rldicr(rs, shift(5 downto 0), insn_me(insn));
-            --report "rs = " & to_hstring(rs);
-            --report "ra = " & to_hstring(ra);
-            --report "shift = " & to_hstring(shift);
-            --report "insn me = " & to_hstring(insn_me(insn));
-            --report "result = " & to_hstring(result);
-            assert behave_ra = result
-                report "bad rldicr expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
-        end loop;
+            elsif run("Test rld[i]cr") then
+                ra <= (others => '0');
+                is_32bit <= '0';
+                right_shift <= '0';
+                arith <= '0';
+                clear_left <= '0';
+                clear_right <= '1';
+                rldicr_loop : for i in 0 to 1000 loop
+                    rs <= rnd.RandSlv(64);
+                    shift <= rnd.RandSlv(7);
+                    insn <= x"00000" & '0' & rnd.RandSlv(10) & '0';
+                    wait for clk_period;
+                    behave_ra := ppc_rldicr(rs, shift(5 downto 0), insn_me(insn));
+                    --report "rs = " & to_hstring(rs);
+                    --report "ra = " & to_hstring(ra);
+                    --report "shift = " & to_hstring(shift);
+                    --report "insn me = " & to_hstring(insn_me(insn));
+                    --report "result = " & to_hstring(result);
+                    assert behave_ra = result
+                        report "bad rldicr expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
+                end loop;
 
-        -- rldic
-        report "test rldic";
-        ra <= (others => '0');
-        is_32bit <= '0';
-        right_shift <= '0';
-        arith <= '0';
-        clear_left <= '1';
-        clear_right <= '1';
-        rldic_loop : for i in 0 to 1000 loop
-            rs <= rnd.RandSlv(64);
-            shift <= '0' & rnd.RandSlv(6);
-            insn <= x"00000" & '0' & rnd.RandSlv(10) & '0';
-            wait for clk_period;
-            behave_ra := ppc_rldic(rs, shift(5 downto 0), insn_mb(insn));
-            assert behave_ra = result
-                report "bad rldic expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
-        end loop;
+            elsif run("Test rldic") then
+                ra <= (others => '0');
+                is_32bit <= '0';
+                right_shift <= '0';
+                arith <= '0';
+                clear_left <= '1';
+                clear_right <= '1';
+                rldic_loop : for i in 0 to 1000 loop
+                    rs <= rnd.RandSlv(64);
+                    shift <= '0' & rnd.RandSlv(6);
+                    insn <= x"00000" & '0' & rnd.RandSlv(10) & '0';
+                    wait for clk_period;
+                    behave_ra := ppc_rldic(rs, shift(5 downto 0), insn_mb(insn));
+                    assert behave_ra = result
+                        report "bad rldic expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
+                end loop;
 
-        -- rldimi
-        report "test rldimi";
-        is_32bit <= '0';
-        right_shift <= '0';
-        arith <= '0';
-        clear_left <= '1';
-        clear_right <= '1';
-        rldimi_loop : for i in 0 to 1000 loop
-            rs <= rnd.RandSlv(64);
-            ra <= rnd.RandSlv(64);
-            shift <= '0' & rnd.RandSlv(6);
-            insn <= x"00000" & '0' & rnd.RandSlv(10) & '0';
-            wait for clk_period;
-            behave_ra := ppc_rldimi(ra, rs, shift(5 downto 0), insn_mb(insn));
-            assert behave_ra = result
-                report "bad rldimi expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
-        end loop;
+            elsif run("Test rldimi") then
+                is_32bit <= '0';
+                right_shift <= '0';
+                arith <= '0';
+                clear_left <= '1';
+                clear_right <= '1';
+                rldimi_loop : for i in 0 to 1000 loop
+                    rs <= rnd.RandSlv(64);
+                    ra <= rnd.RandSlv(64);
+                    shift <= '0' & rnd.RandSlv(6);
+                    insn <= x"00000" & '0' & rnd.RandSlv(10) & '0';
+                    wait for clk_period;
+                    behave_ra := ppc_rldimi(ra, rs, shift(5 downto 0), insn_mb(insn));
+                    assert behave_ra = result
+                        report "bad rldimi expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
+                end loop;
 
-        -- slw
-        report "test slw";
-        ra <= (others => '0');
-        is_32bit <= '1';
-        right_shift <= '0';
-        arith <= '0';
-        clear_left <= '0';
-        clear_right <= '0';
-        slw_loop : for i in 0 to 1000 loop
-            rs <= rnd.RandSlv(64);
-            shift <= rnd.RandSlv(7);
-            wait for clk_period;
-            behave_ra := ppc_slw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
-            assert behave_ra = result
-                report "bad slw expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
-        end loop;
+            elsif run("Test slw") then
+                ra <= (others => '0');
+                is_32bit <= '1';
+                right_shift <= '0';
+                arith <= '0';
+                clear_left <= '0';
+                clear_right <= '0';
+                slw_loop : for i in 0 to 1000 loop
+                    rs <= rnd.RandSlv(64);
+                    shift <= rnd.RandSlv(7);
+                    wait for clk_period;
+                    behave_ra := ppc_slw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
+                    assert behave_ra = result
+                        report "bad slw expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
+                end loop;
 
-        -- sld
-        report "test sld";
-        ra <= (others => '0');
-        is_32bit <= '0';
-        right_shift <= '0';
-        arith <= '0';
-        clear_left <= '0';
-        clear_right <= '0';
-        sld_loop : for i in 0 to 1000 loop
-            rs <= rnd.RandSlv(64);
-            shift <= rnd.RandSlv(7);
-            wait for clk_period;
-            behave_ra := ppc_sld(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
-            assert behave_ra = result
-                report "bad sld expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
-        end loop;
+            elsif run("Test sld") then
+                ra <= (others => '0');
+                is_32bit <= '0';
+                right_shift <= '0';
+                arith <= '0';
+                clear_left <= '0';
+                clear_right <= '0';
+                sld_loop : for i in 0 to 1000 loop
+                    rs <= rnd.RandSlv(64);
+                    shift <= rnd.RandSlv(7);
+                    wait for clk_period;
+                    behave_ra := ppc_sld(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
+                    assert behave_ra = result
+                        report "bad sld expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
+                end loop;
 
-        -- srw
-        report "test srw";
-        ra <= (others => '0');
-        is_32bit <= '1';
-        right_shift <= '1';
-        arith <= '0';
-        clear_left <= '0';
-        clear_right <= '0';
-        srw_loop : for i in 0 to 1000 loop
-            rs <= rnd.RandSlv(64);
-            shift <= rnd.RandSlv(7);
-            wait for clk_period;
-            behave_ra := ppc_srw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
-            assert behave_ra = result
-                report "bad srw expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
-        end loop;
+            elsif run("Test srw") then
+                ra <= (others => '0');
+                is_32bit <= '1';
+                right_shift <= '1';
+                arith <= '0';
+                clear_left <= '0';
+                clear_right <= '0';
+                srw_loop : for i in 0 to 1000 loop
+                    rs <= rnd.RandSlv(64);
+                    shift <= rnd.RandSlv(7);
+                    wait for clk_period;
+                    behave_ra := ppc_srw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
+                    assert behave_ra = result
+                        report "bad srw expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
+                end loop;
 
-        -- srd
-        report "test srd";
-        ra <= (others => '0');
-        is_32bit <= '0';
-        right_shift <= '1';
-        arith <= '0';
-        clear_left <= '0';
-        clear_right <= '0';
-        srd_loop : for i in 0 to 1000 loop
-            rs <= rnd.RandSlv(64);
-            shift <= rnd.RandSlv(7);
-            wait for clk_period;
-            behave_ra := ppc_srd(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
-            assert behave_ra = result
-                report "bad srd expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
-        end loop;
+            elsif run("Test srd") then
+                ra <= (others => '0');
+                is_32bit <= '0';
+                right_shift <= '1';
+                arith <= '0';
+                clear_left <= '0';
+                clear_right <= '0';
+                srd_loop : for i in 0 to 1000 loop
+                    rs <= rnd.RandSlv(64);
+                    shift <= rnd.RandSlv(7);
+                    wait for clk_period;
+                    behave_ra := ppc_srd(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
+                    assert behave_ra = result
+                        report "bad srd expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
+                end loop;
 
-        -- sraw[i]
-        report "test sraw[i]";
-        ra <= (others => '0');
-        is_32bit <= '1';
-        right_shift <= '1';
-        arith <= '1';
-        clear_left <= '0';
-        clear_right <= '0';
-        sraw_loop : for i in 0 to 1000 loop
-            rs <= rnd.RandSlv(64);
-            shift <= '0' & rnd.RandSlv(6);
-            wait for clk_period;
-            behave_ca_ra := ppc_sraw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
-            --report "rs = " & to_hstring(rs);
-            --report "ra = " & to_hstring(ra);
-            --report "shift = " & to_hstring(shift);
-            --report "result = " & to_hstring(carry_out & result);
-            assert behave_ca_ra(63 downto 0) = result and behave_ca_ra(64) = carry_out
-                report "bad sraw expected " & to_hstring(behave_ca_ra) & " got " & to_hstring(carry_out & result);
-        end loop;
+            elsif run("Test sraw[i]") then
+                ra <= (others => '0');
+                is_32bit <= '1';
+                right_shift <= '1';
+                arith <= '1';
+                clear_left <= '0';
+                clear_right <= '0';
+                sraw_loop : for i in 0 to 1000 loop
+                    rs <= rnd.RandSlv(64);
+                    shift <= '0' & rnd.RandSlv(6);
+                    wait for clk_period;
+                    behave_ca_ra := ppc_sraw(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
+                    --report "rs = " & to_hstring(rs);
+                    --report "ra = " & to_hstring(ra);
+                    --report "shift = " & to_hstring(shift);
+                    --report "result = " & to_hstring(carry_out & result);
+                    assert behave_ca_ra(63 downto 0) = result and behave_ca_ra(64) = carry_out
+                        report "bad sraw expected " & to_hstring(behave_ca_ra) & " got " & to_hstring(carry_out & result);
+                end loop;
 
-        -- srad[i]
-        report "test srad[i]";
-        ra <= (others => '0');
-        is_32bit <= '0';
-        right_shift <= '1';
-        arith <= '1';
-        clear_left <= '0';
-        clear_right <= '0';
-        srad_loop : for i in 0 to 1000 loop
-            rs <= rnd.RandSlv(64);
-            shift <= rnd.RandSlv(7);
-            wait for clk_period;
-            behave_ca_ra := ppc_srad(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
-            --report "rs = " & to_hstring(rs);
-            --report "ra = " & to_hstring(ra);
-            --report "shift = " & to_hstring(shift);
-            --report "result = " & to_hstring(carry_out & result);
-            assert behave_ca_ra(63 downto 0) = result and behave_ca_ra(64) = carry_out
-                report "bad srad expected " & to_hstring(behave_ca_ra) & " got " & to_hstring(carry_out & result);
-        end loop;
+            elsif run("Test srad[i]") then
+                ra <= (others => '0');
+                is_32bit <= '0';
+                right_shift <= '1';
+                arith <= '1';
+                clear_left <= '0';
+                clear_right <= '0';
+                srad_loop : for i in 0 to 1000 loop
+                    rs <= rnd.RandSlv(64);
+                    shift <= rnd.RandSlv(7);
+                    wait for clk_period;
+                    behave_ca_ra := ppc_srad(rs, std_ulogic_vector(resize(unsigned(shift), 64)));
+                    --report "rs = " & to_hstring(rs);
+                    --report "ra = " & to_hstring(ra);
+                    --report "shift = " & to_hstring(shift);
+                    --report "result = " & to_hstring(carry_out & result);
+                    assert behave_ca_ra(63 downto 0) = result and behave_ca_ra(64) = carry_out
+                        report "bad srad expected " & to_hstring(behave_ca_ra) & " got " & to_hstring(carry_out & result);
+                end loop;
 
-        -- extswsli
-        report "test extswsli";
-        ra <= (others => '0');
-        is_32bit <= '0';
-        right_shift <= '0';
-        arith <= '0';
-        clear_left <= '0';
-        clear_right <= '0';
-        extsw <= '1';
-        extswsli_loop : for i in 0 to 1000 loop
-            rs <= rnd.RandSlv(64);
-            shift <= '0' & rnd.RandSlv(6);
-            wait for clk_period;
-            behave_ra := rs;
-            behave_ra(63 downto 32) := (others => rs(31));
-            behave_ra := std_ulogic_vector(shift_left(unsigned(behave_ra),
-                                                      to_integer(unsigned(shift))));
-            --report "rs = " & to_hstring(rs);
-            --report "ra = " & to_hstring(ra);
-            --report "shift = " & to_hstring(shift);
-            --report "result = " & to_hstring(carry_out & result);
-            assert behave_ra = result
-                report "bad extswsli expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
+            elsif run("Test extswsli") then
+                ra <= (others => '0');
+                is_32bit <= '0';
+                right_shift <= '0';
+                arith <= '0';
+                clear_left <= '0';
+                clear_right <= '0';
+                extsw <= '1';
+                extswsli_loop : for i in 0 to 1000 loop
+                    rs <= rnd.RandSlv(64);
+                    shift <= '0' & rnd.RandSlv(6);
+                    wait for clk_period;
+                    behave_ra := rs;
+                    behave_ra(63 downto 32) := (others => rs(31));
+                    behave_ra := std_ulogic_vector(shift_left(unsigned(behave_ra),
+                                                              to_integer(unsigned(shift))));
+                    --report "rs = " & to_hstring(rs);
+                    --report "ra = " & to_hstring(ra);
+                    --report "shift = " & to_hstring(shift);
+                    --report "result = " & to_hstring(carry_out & result);
+                    assert behave_ra = result
+                        report "bad extswsli expected " & to_hstring(behave_ra) & " got " & to_hstring(result);
+                end loop;
+            end if;
         end loop;
-
         test_runner_cleanup(runner);
     end process;
 end behave;