常量表达式在赋值时需要宽度不匹配。不可合成的 VHDL 代码行

问题描述 投票:0回答:1

我正在尝试实现一个浮点加法器/减法器。我已经实现了可以工作的代码。当我运行模拟时,它按预期工作。

问题是,当我尝试在 Vivado 中综合它时,出现以下错误:“常量表达式在赋值中需要宽度不匹配”和“目标有 279 位,源有 86 位”,一行显示:

my_p_nt_a <= to_unsigned(0, to_integer(abs_exp_diff)) & my_p & to_unsigned(0, 2**NE - 1- to_integer(abs_exp_diff));

这对应于尾数的对齐方式。

更多信息:

signal my_p_nt_a:      unsigned(NF + 2**NE-1 downto 0);
signal abs_exp_diff:   unsigned(NE downto 0);

NE 是指数的位数。

我不知道如何解决。我尝试了不同的方法,但在合成时我不断遇到问题。

floating-point vhdl
1个回答
0
投票

该错误消息的含义是,在 Vivado 综合中,您无法将操作数扩展为多个 0,其中该数字取决于 abs_exp_diff 处的值。仅当 abs_exp_diff 是常量时,此方法才有效。 我预计大多数综合工具都无法做到这一点。

您应该使用此解决方案:

entity test_shift is
end entity test_shift;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
architecture struct of test_shift is
    constant NF : natural := 10; -- example value
    constant NE : natural := 12; -- example value
    signal abs_exp_diff : unsigned(NE downto 0);
    signal my_p         : unsigned(NF-1 downto 0);
    signal my_p_nt_a    : unsigned(NF+2**NE-1 downto 0);
begin
    process(my_p, abs_exp_diff)
        variable my_p_nt_a_v : unsigned(my_p_nt_a'range);
    begin
        my_p_nt_a_v(my_p'range) := my_p;
        my_p_nt_a <= shift_left(my_p_nt_a_v, 2*NE-1-to_integer(abs_exp_diff));
    end process;
end architecture;
© www.soinside.com 2019 - 2024. All rights reserved.