Opdracht - testbench ALU

Om de juiste werking van de ALU te verifiëren, wordt er opnieuw gebruikt gemaakt van een testbench. Het is een goed idee om tijdens het ontwikkelen van de ALU meteen de functionaliteit te testen. Hiervoor kunnen er heel gericht bepaalde instructies ingesteld worden. Om bijvoorbeeld 12 + 3 te doen weet je dat inputs de volgende moeten zijn:

  • X wordt 12
  • Y wordt 3
  • de instructie voor de optelling is
    • zx is ‘0’
    • nx is ‘0’
    • zy is ‘0’
    • ny is ‘0’
    • f is ‘1’
    • no is ‘0’
    PSTIM: process
    begin
        X <= x"C";
        Y <= x"3";
        zx <= '0';
        zy <= '0';
        nx <= '0';
        ny <= '0';
        f <= '1';
        no <= '0';

        wait;
    end process;

Op deze manier kan je stapsgewijs de testbench opbouwen. Geef hierbij extra aandacht aan de randgevallen. Als jouw implementatie 12 + 3 correct kan berekenen, is de kans groot dat 13 + 3 ook wel zal lukken. De randgevallen zijn het echter wel waard om expliciet te testen. Kan jouw ALU 0xFFFF + 0xFFFF correct berekenen? Of -1 - 1?

Wanneer je denkt alle implementaties gedaan te hebben, kan je een grotere testbench los laten op jouw design. Een voorbeeld hiervan kan je hier downloaden. Deze testbench is, zoals je misschien al vermoedde, gegenereerd. Voor de verbetering van de opdracht wordt een soortgelijke testbench gebruikt.

...
        X <= x"329a";
        Y <= x"ae51";
        zx <= '0';
        zy <= '1';
        nx <= '0';
        ny <= '1';
        f <= '0';
        no <= '1';
        wait for 1 ns;
        if (Z /= x"cd65") then
            report "Error in outcome (not x)" severity note;
            v_incorrect_z := v_incorrect_z + 1;
        else
            v_correct_z := v_correct_z + 1;
        end if;
        if (zr /= '0') then
            report "Error in zero flag (not x)" severity note;
            v_incorrect_zr := v_incorrect_zr + 1;
        else
            v_correct_zr := v_correct_zr + 1;
        end if;
        if (ng /= '1') then
            report "Error in negative flag (not x)" severity note;
            v_incorrect_ng := v_incorrect_ng + 1;
        else
            v_correct_ng := v_correct_ng + 1;
        end if;
        wait for 1 ns;
...

Deze aangeleverde testbench controleert bovendien of de uitgang gelijk is aan de “juiste” uitgang. Hiervoor moet het resultaat kloppen, maar ook de zero en negative flags.

Na 1ns wordt elk van de 3 uitgangen vergeleken. Indien een waarde niet overeenkomt met de verwachte uitgang, wordt hiervan een melding gemaakt in de console.

Tellers

De testbench heeft 6 tellers die bijgehouden worden. Deze tellen het aantal juiste en foute operaties voor de uitgang en de 2 flags.

Op het einde van de testbench worden deze tellers in de console geprint om een overzicht te krijgen.

Voorbeeld van de rapportering

Voor de verbetering van deze taak wordt een soortgelijke testbench gebruikt. Er wordt enkel gekeken naar de rapportering.