我正在尝试为学术项目创建一个展位乘数,并且我遇到了最奇怪的错误。不确定这是回溯到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;
答案 0 :(得分:3)
我无法访问任何合成工具,所以我在推测。但是,您正在尝试合成完全组合乘数(我不确定这是否是有意的),这是合理的大小。我对实现它所需的资源(以及由此产生的Fmax)感到不寒而栗,这可能解释了为什么这个工具花了这么长时间。
答案 1 :(得分:0)
我最终找到了问题的答案。由于我不理解的原因,它花了这么长时间的唯一原因是因为结果没有被初始化为任何东西。我尝试在循环开始时添加一个简单的result := x"0000000000000000";
,它完成了一个&amp; e在10秒内没有错误。这非常令人沮丧。
如果有人能解释为什么初始化是问题,我会很感激。