【问题标题】:elaboration freezes when assigning variable x:= x + y分配变量 x:= x + y 时,细化冻结
【发布时间】:2017-02-20 22:10:19
【问题描述】:

我正在尝试为一个学术项目创建一个展位乘数,但我遇到了最奇怪的错误。不确定这是否可以追溯到 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;

【问题讨论】:

  • 您的问题没有提供Minimal, Complete, and Verifiable example
  • 我在 2014 i7 笔记本电脑上用 Quartus 13.1 网络版在 54 分钟内合成了这个。这是很多逻辑:2082 个逻辑元素。
  • 您有任何 VHDL 经验吗?您正在编写代码,就好像它是 CPU 代码一样。 VHDL(尤其是在综合时)需要不同的方法。

标签: vhdl quartus


【解决方案1】:

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

【讨论】:

  • 您的回答作为评论似乎更好,为不提供Minimal, Complete, and Verifiable example 的问题提供意见。 --other stuff 可能存在问题,它可能是 Quartus II 问题(并且不报告内存不足是一个问题)。循环本身能够运行(在模拟中)。示例代码不是作为 Booth Multiplier 执行的完整代码。您可能想知道一个小时是否足够等待。没有证据表明限制。
  • 所有公平点(虽然我不确定关于模拟的点是否相关)
【解决方案2】:

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

如果有人能解释为什么初始化是问题所在,我将不胜感激。

【讨论】:

  • 您是否检查了综合结果以确保一切都被正确推断/模拟设计以确保其功能正确?我本以为这样做会使声明 result := result + toResult; 无关紧要(您不再累积)
  • 我刚刚检查了这个;在循环开始后立即添加 result := x"0000000000000000"; 行有效地擦除了所有逻辑(几乎没有推断出任何内容)
  • @gsm 我希望他将初始化放在循环之前,它是有效的。它会“工作”以获得合适的“工作”值,但product &lt;= a * b; 的某些变体将允许合成工具利用内置乘法器获得更快、更小、更简单、更有效的结果。
  • 有趣...老实说,我不确定我期望的结果是什么。我不会想到内置的硬件 mults 可以用于组合设计? (我稍后会检查)
  • 我把声明放在循环开始之前,我很抱歉,措辞不佳。结果是ain * Bin
猜你喜欢
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 2023-02-13
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
相关资源
最近更新 更多