уточнение зависает при присвоении переменной x:= x + y

Я пытаюсь создать множитель стенда для академического проекта, и у меня возникает странная ошибка. Не уверен, восходит ли это к 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;

person SCodrington    schedule 20.02.2017    source источник
comment
В вашем вопросе нет минимального, полного и поддающегося проверке примера.   -  person    schedule 20.02.2017
comment
Я синтезировал это в веб-версии Quartus 13.1 за 54 минуты на своем ноутбуке i7 2014 года. Логики много: 2082 логических элемента.   -  person Matthew Taylor    schedule 20.02.2017
comment
Есть ли у вас опыт работы с VHDL? Вы пишете код, как если бы это был код для процессора. VHDL (особенно при синтезе) требует другого подхода.   -  person JHBonarius    schedule 23.02.2017


Ответы (2)


У меня нет доступа к каким-либо синтетическим инструментам на работе, поэтому я размышляю. Однако вы пытаетесь синтезировать полностью комбинационный множитель (я не уверен, намеренно это сделано или нет) разумного размера. Я вздрагиваю от ресурсов, необходимых для реализации этого (и получающегося в результате Fmax), что, вероятно, объясняет, почему инструмент занимает так много времени.

person gsm    schedule 20.02.2017
comment
Ваш ответ кажется лучше, чем комментарий, в котором содержится мнение по вопросу, который не представляет собой минимальный, полный и проверяемый пример. Что --other stuff может быть проблемой, это может быть проблема Quartus II (и отсутствие сообщения о нехватке памяти является проблемой). Сам цикл может работать (в моделировании). пример кода не является полным для работы в качестве Booth Multiplier. Вы можете задаться вопросом, достаточно ли часа для ожидания. Ограничений в доказательствах нет. - person ; 20.02.2017
comment
Все справедливые баллы (хотя я не уверен, что пункт о симуляции актуален) - person gsm; 20.02.2017

В итоге я нашел ответ на проблему. Единственная причина, по которой это заняло так много времени, по причинам, которых я не понимаю, заключалась в том, что результат не был инициализирован ничем. Я попытался добавить простой result := x"0000000000000000"; в начале цикла, и он завершил a & e менее чем за 10 секунд без ошибок. Это очень расстраивало.

Если бы кто-нибудь мог объяснить, почему эта инициализация была проблемой, я был бы признателен.

person SCodrington    schedule 20.02.2017
comment
Вы проверили свои результаты синтеза, чтобы убедиться, что все выведено правильно / смоделировали дизайн, чтобы убедиться, что он функционально правильный? Я бы подумал, что это сделает утверждение result := result + toResult; неуместным (вы больше не накапливаете) - person gsm; 21.02.2017
comment
Я только что проверил это; Добавление строки result := x"0000000000000000"; сразу после начала цикла эффективно стирает всю вашу логику (почти ничего не выводится) - person gsm; 21.02.2017
comment
@gsm Я ожидаю, что он поместил инициализацию перед циклом, где она действительна. Это будет работать для подходящей стоимости работы, но некоторый вариант product <= a * b; позволит инструменту синтеза использовать встроенные множители для гораздо более быстрого, меньшего, более простого и более эффективного результата. - person user_1818839; 22.02.2017
comment
Интересно... Честно говоря, не знаю, какого результата я ожидаю. Я бы не подумал, что встроенные аппаратные мультипликаторы можно использовать в комбинированном дизайне? (правда позже проверю) - person gsm; 23.02.2017
comment
Я поместил заявление до начала цикла, мои извинения, плохо сформулированы. Результат ain * Bin - person SCodrington; 23.02.2017
comment
Работа множителей в комбинационном блоке может зависеть от FPGA - для других я бы встроил product <= a * b в процесс с тактовой частотой и ожидал, что он будет работать. - person user_1818839; 23.02.2017