Я пытаюсь создать множитель стенда для академического проекта, и у меня возникает странная ошибка. Не уверен, восходит ли это к Quartus II или как-то связано с VHDL.
Каждый раз, когда я пытаюсь проанализировать и разработать следующий код, процесс зависает на неопределенный срок (у меня он уже работает в течение часа) на 46% фазы анализа и синтеза, в консоли последняя строка 12127 Elaborating entity "booth_mul" for the top level hierarchy
без каких-либо других конкретных предупреждений. или заметные ошибки (просто обычные (found x design units,...
)
ARCHITECTURE booth_mul OF booth_mul IS
BEGIN
process(Ain, Bin)
variable result, toResult: STD_LOGIC_VECTOR(63 downto 0);
--other variables
begin
--other stuff
for i in 0 to 31 loop
--other stuff
--toResult is the partial product being added to the result
toResult := STD_LOGIC_VECTOR(SHIFT_LEFT(UNSIGNED(toResult), i*2));
result := result + toResult; --A&E Freezes if this line is included!!
end loop;
output <= result;
end process;
END;
Я пытался комментировать различные части этого, и проблема именно в этой строке. Это синтаксическая проблема с VHDL или с самим Quartus II?
с использованием Quartus II 64-Bit Version 13.0.1 Build 232 12.06.2013 SJ Web Edition
Обновление: я предоставил остальную часть своего кода, но не похоже, что это должно быть ошибкой. Дизайн компилируется без ошибок, но только спустя почти три часа. Вот полный дизайн:
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_signed.all;
use ieee.numeric_std.all;
ENTITY booth_mul IS
PORT
(
Ain : IN STD_LOGIC_VECTOR(31 downto 0);
Bin : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
output : OUT STD_LOGIC_VECTOR(63 DOWNTO 0)
);
END booth_mul;
ARCHITECTURE booth_mul OF booth_mul IS
BEGIN
process(Ain, Bin)
variable result, temp, toResult: STD_LOGIC_VECTOR(63 downto 0);
variable toAdd, toSub : STD_LOGIC_VECTOR(31 downto 0);
begin
toAdd := Ain;
toSub := (0 - Ain);
for i in 0 to 31 loop
if i = 0 then
if Bin(0) <= '1' then
toResult(31 downto 0):= toSub;
end if;
else
if (Bin(i) <= '1' and Bin(i-1) <='0') then
toResult(31 downto 0):= toSub;
elsif (Bin(i) <= '0' and Bin(i-1) <='1') then
toResult(31 downto 0):= toAdd;
end if;
end if;
--
-- --Sign Extension
if toResult(31) <= '1' then
toResult(63 downto 32) := x"11111111";
else
toResult(63 downto 32) := x"00000000";
end if;
toResult := STD_LOGIC_VECTOR(SHIFT_LEFT(UNSIGNED(toResult), i*2));
result := result + toResult; --A&E Freezes HERE!!
end loop;
output <= result;
end process;
END;