微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Vivado VHDL 宽度不匹配 - 我该如何解决?

如何解决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 举报,一经查实,本站将立刻删除。