在赋值变量x:= x + y时,详细说明会冻结

时间:2017-02-20 00:13:55

标签: vhdl quartus

我正在尝试为学术项目创建一个展位乘数,并且我遇到了最奇怪的错误。不确定这是回溯到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位版本13.0.1 Build 232 06/12/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;

2 个答案:

答案 0 :(得分:3)

我无法访问任何合成工具,所以我在推测。但是,您正在尝试合成完全组合乘数(我不确定这是否是有意的),这是合理的大小。我对实现它所需的资源(以及由此产生的Fmax)感到不寒而栗,这可能解释了为什么这个工具花了这么长时间。

答案 1 :(得分:0)

我最终找到了问题的答案。由于我不理解的原因,它花了这么长时间的唯一原因是因为结果没有被初始化为任何东西。我尝试在循环开始时添加一个简单的result := x"0000000000000000";,它完成了一个&amp; e在10秒内没有错误。这非常令人沮丧。

如果有人能解释为什么初始化是问题,我会很感激。