Devido a um problema no software Quartus® II, a síntese quartus II pode gerar esse erro ao tentar avaliar uma expressão indexado em VHDL que está fora do intervalo dentro de uma expressão if dentro de um loop.
Você pode ver este erro quando todas as seguintes condições são atendidas:
- Uma instrução se está dentro de um loop para
- A instrução if é uma comparação de duas expressões inteiras usando , >= ou =
- A variável loop ocorre nas expressões avaliadas pela instrução if
- A expressão avaliada pela instrução if é limitada a , -, e *
Aqui está um exemplo de quando este erro ocorrerá:
entity test is
port
(
i1_data_in : in std_logic_vector(3 downto 0);
i_div_pos : in std_logic_vector(7 downto 0);
o_data_out : out std_logic_vector(7 downto 0)
);
END entity test;
architecture rtl of test is
signal idx : integer;
signal lim : NATURAL range 0 to 5;
idx <= to_integer(unsigned(i_div_pos));
lim <= 3;
process(i1_data_in, idx)
variable temp : std_logic_vector(o_data_out\'range);
begin
temp := (others => \'0\');
u1 : for i in 0 to 7 loop
if i <= 3 - lim then
temp(i) := i1_data_in(i);
else
temp(i) := i_div_pos (i);
end if;
end loop;
o_data_out <= temp;
end process;
end rtl;
Um patch está disponível para corrigir este problema para o software Quartus II versão 11.0 SP1. Baixe e instale o Patch 1.40 no link abaixo. Após instalar o patch, ative a correção criando ou editando o arquivo quartus.ini no diretório do projeto para incluir a seguinte linha:
vrfx_optimize_if_dead_code=on
- Baixe o patch 1.0 SP1 versão 1.40 para Windows (.exe)
- Baixe o patch 1.0 SP1 versão 1.40 para Linux (.tar)
- Baixe o Readme para o software Quartus II versão 11.0 SP1 patch 1.40 (.txt)
Se você encontrar este erro ao usar uma versão diferente do software Quartus II, faça uma solicitação de serviço usando o mySupport.