error no estático en Precision RTL

2

Estoy escribiendo un código VHDL para un entero a flotador convertidor usando variables. Lo he simulado y los resultados coinciden con las expectativas. Sin embargo, cuando busco compilar y sintetizar utilizando Precision RTL de Mentor Graphics, encuentro el siguiente error:

  

El ancho del sector en la expresión de selección de la parte variable no es estático. Si este es un caso genuino, use expresiones más simples en su lugar.

Este error se refiere a la siguiente línea de código:

sig_float_out(WIDTH*2-5 downto 0) <= int_input(first_one_at downto 0) & int_input(WIDTH-1 downto first_one_at+1);

Me parece que mi expresión es localmente estática y no debería tener problemas para sintetizar, ya que solo estoy buscando intercambiar contenido alrededor de una variable predeterminada.

Si este no es el caso, se agradecerán algunas aclaraciones y opciones de modificación.

El código completo para referencia:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity lab4 is
    port(
        int_input    : in  std_logic_vector(3 downto 0);
        float_output : out std_logic_vector(7 downto 0);
        underflow    : out std_logic
    );
end lab4;

architecture int_to_float of lab4 is
    constant WIDTH   : integer := 4;
    signal sig_float_out : std_logic_vector(WIDTH*2 - 1 downto 0);
    signal check  : integer;
begin
    process(int_input)
        variable first_one_at  : integer;
        variable bool_flag   : boolean;
        variable input_2comp : std_logic_vector(WIDTH - 1 downto 0);

begin
    first_one_at := 0;
    bool_flag  := false;
    underflow <= '1';

    if (int_input = "0000") then
        sig_float_out <= (others => '0');
        underflow    <= '0';
    elsif (int_input(WIDTH - 1) = '0') then
        for i in WIDTH - 1 downto 0 loop
            if (int_input(i) = '1') then
                if (bool_flag = false) then
                     first_one_at := i;
                      bool_flag := true;
                end if;
            end if;
        end loop;

        sig_float_out(WIDTH*2-1) <= int_input(WIDTH -1);
        sig_float_out(WIDTH*2-2 downto WIDTH*2-4) <= std_logic_vector(to_unsigned(first_one_at + 1 + 3, 3));
        sig_float_out(WIDTH*2-5 downto 0) <= int_input(first_one_at downto 0) & int_input(WIDTH-1 downto first_one_at+1);

    else
        input_2comp := std_logic_vector(unsigned(not(int_input))+1);
        for i in WIDTH - 1 downto 0 loop
            if (input_2comp(i) = '1') then
                if (bool_flag = false) then
                            first_one_at := i;
                            bool_flag := true;
                end if;
            end if;
        end loop;
        sig_float_out(WIDTH*2-1) <= int_input(WIDTH -1);
        sig_float_out(WIDTH*2-2 downto WIDTH*2-4) <= std_logic_vector(to_unsigned(first_one_at + 1 + 3, 3));
        sig_float_out(WIDTH*2-5 downto 0) <= input_2comp(first_one_at downto 0) & input_2comp(WIDTH-1 downto first_one_at+1);
    end if;

        check<=first_one_at;
end process;
float_output <= sig_float_out;

end int_to_float;   
    
pregunta alekt

1 respuesta

3

No puede hacer cortes de variables en síntesis, porque la expresión no tiene rango ni tamaño conocidos. Incluso si se permite en subexpresiones, es difícil asegurar que todas las subexpresiones juntas cumplan con las restricciones de LHS para cada entrada posible.

Y otra pregunta sería: ¿Cuál es el hardware resultante para esa construcción? ¿Una ROM muy grande?

Necesitas convertir tu código a

  • un multiplexor o
  • máscara + operaciones de cambio
respondido por el Paebbels

Lea otras preguntas en las etiquetas