VHDL: la adición real conduce a un 'error de comprobación enlazada'

1

Después de una pausa de un año, volví a aprender VHDL. Estoy trabajando en los ejercicios del libro de Peter Ashenden Beginner's Guide to VHDL y estoy atascado en el ejercicio 11 del capítulo 3.

El objetivo es escribir un módulo, que realizará operaciones aritméticas básicas en dos números real . Aquí está mi módulo:

-- floating point ALUish thing

entity FPALU is
    port ( x, y : in real;
           f1, f0 : in bit;
           z : out real );
end entity FPALU;

architecture behav of FPALU is
begin
    fpalu_behavioral : process(x, y, f1, f0) --is
        variable result : real := 0.0;
    begin
        if f1 = '0' and f0 = '0' then
            result := x + y;
        elsif f1 = '0' and f0 = '1' then
            result := x - y;
        elsif f1 = '1' and f0 = '0' then
            result := x * y;
        elsif f1 = '1' and f0 = '1' then
            result := x / y;
        -- else null;
        end if;
        z <= result;
    end process fpalu_behavioral;
end architecture behav;

Y su banco de pruebas:

-- test bench for floating point operations

entity FPALU_test_bench is
end entity FPALU_test_bench;

architecture test_FPALU of FPALU_test_bench is

    signal x, y, z : real;
    signal f0, f1 : bit;

begin
    dut : entity work.FPALU(behav)
        port map ( x, y, f1, f0, z );

    stimulus : process is
    begin
        x <= 3.4; y <= 5.8; f1 <= '0'; f0 <= '0'; wait for 20 ns;
        x <= 3.4; y <= 5.8; f1 <= '0'; f0 <= '1'; wait for 20 ns;
        x <= 3.4; y <= 5.8; f1 <= '1'; f0 <= '0'; wait for 20 ns;
        x <= 3.4; y <= 5.8; f1 <= '1'; f0 <= '1'; wait for 20 ns;
        wait;
    end process stimulus;

end architecture test_FPALU;

Este código analizará y elaborará bien, pero una vez que intente ejecutar el banco de pruebas, obtengo este error:

ghdl -r FPALU_test_bench --vcd=FPALU.vcd
./fpalu_test_bench:error: bound check failure at FPALU.vhdl:15
./fpalu_test_bench:error: simulation failed

La línea 15 es result := x + y; . Esta pregunta parece ser similar, pero dado que los paquetes aún no se han introducido en el libro, asumo que debería ser posible prescindir de ellos. Además, agregué dos números real de manera similar en otro módulo y funcionó bien. Entonces, ¿por qué no se ejecuta esta simulación? Supongo que es un "problema de desbordamiento" de lo que he encontrado aquí y en Google, pero no hay una respuesta definitiva.

    
pregunta georgjz

1 respuesta

1

Lo siento por mi respuesta tardía, me atrapé en otras cosas una vez más. Logré actualizar mi código de la manera que @ user8352 sugirió para que se ejecute, así que aquí están las versiones de trabajo:

entity floatALU is
    port ( x, y : in real;
           f1, f0 : in bit;
           z : out real );
end entity floatALU;

-- behavrioal body
architecture behav of floatALU is
begin
    calculate : process ( x, y, f1, f0 ) is
    begin
        -- I combine if and case statements on purpose here
        if f1 = '0' then
            case f0 is
                when '0' => z <= x + y;
                when '1' => z <= x - y;
            end case;
        else
            case f0 is
                when '0' => z <= x * y;
                when '1' => z <= x / y;
            end case;
        end if;
    end process calculate;
end architecture behav;

Y el banco de pruebas:

entity floatALU is
    port ( x, y : in real;
           f1, f0 : in bit;
           z : out real );
end entity floatALU;

-- behavrioal body
architecture behav of floatALU is
begin
    calculate : process ( x, y, f1, f0 ) is
    begin
        -- I combine if and case statements on purpose here
        if f1 = '0' then
            case f0 is
                when '0' => z <= x + y;
                when '1' => z <= x - y;
            end case;
        else
            case f0 is
                when '0' => z <= x * y;
                when '1' => z <= x / y;
            end case;
        end if;
    end process calculate;
end architecture behav;

¡Gracias a todos por su ayuda!

    
respondido por el georgjz

Lea otras preguntas en las etiquetas