如何解决Vivado VHDL 宽度不匹配 - 我该如何解决?
请考虑这个非常简单的最小可重现代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity test is
generic ( LENGTH : integer range 1 to 16 := 5 );
Port ( x : in STD_LOGIC;
y : out STD_LOGIC_VECTOR(15 downto 0)
);
end test;
architecture Behavioral of test is
signal a : std_logic_vector (15 downto 0);
signal b : std_logic_vector (LENGTH - 1 downto 0);
signal i : integer range 0 to LENGTH-1 := 1;
begin
y <= a;
process
begin
if i = LENGTH then
i <= 1;
else
a <= a(15 downto i + 1) & b(i downto 0);
end if;
i <= i + 1;
end process;
end Behavioral;
我需要将 b
的一些元素加入 a
,这取决于 i
。通过在 Vivado 上运行 RTL,它会说:
[Synth 8-690] width mismatch in assignment; target has 16 bits,source has 20 bits
我真的不明白为什么。无论如何,总范围将是 15 - (i + 1) + (i - 0) = 15 ... 0
并且适合 output
的 16 位 -- 20 位的交易是什么?
如果我使用普通常量而不是 i
,我应该说问题会消失(显然),但我仍然不明白发生了什么。
解决方法
对于运行时变量 I(根据问题)...
您可以使用 I 的值生成掩码,并计算 (A and MASKA) or (B and MASKB)
,而不是大 CASE。这相当于综合工具在没有损坏的情况下生成的多路复用器。
对于通用 I(在评论中移动球门柱是不公平的!)
这种方法会生成不必要的硬件,任何有能力的综合工具都会对其进行优化。
(此代码当然还有其他问题;我假设您删除了时钟,使 MCVE 概念有点过分。您应该保留有效的可综合代码)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。