Несоответствие ширины VHDL 2008

#vhdl #xilinx #vivado

#vhdl #xilinx #vivado

Вопрос:

Я сталкиваюсь с проблемой несоответствия ширины при использовании трехмерного массива с использованием VHDL. Ошибка :

 [Synth 8-549] port width mismatch for port 'KERNEL_OUT[0]': port width = 16, actual width = 32 ["C:/project_2/src/top.vhd":29]


  

Как мы можем видеть, строка # 30 на самом деле состоит из 32 бит, и компонент имеет неограниченный порт. Таким образом, вместо того, чтобы брать длину из подключенного порта, он использует значение из ранее созданного экземпляра компонента.

Я сделал из этого очень минимальный дизайн. Я использую Vivado 2018.2, есть большая вероятность, что это может быть проблема с инструментом. Но было бы очень полезно, если бы кто-нибудь мог сказать мне, делаю ли я что-то не так.

top.vhd

 
library ieee;
use ieee.std_logic_1164.all;

use work.style_pack.all;

-------------------------------------------------------------------------------
-- Entity
-------------------------------------------------------------------------------
entity top is
  port(
    dummy : in std_logic
    );

end entity top;

architecture arch_top of top is
  signal KernelInt1 : StdVectorArrayTp(0 to 4)(15 downto 0);
  signal KernelInt2 : StdVectorArrayTp(0 to 4)(31 downto 0);
begin
  --
  INST_pixel_to_matrix_1 : entity work.pixel_to_matrix
    port map (
      KERNEL_OUT => KernelInt1
      );
  --
  INST_pixel_to_matrix_2 : entity work.pixel_to_matrix
    port map (
      KERNEL_OUT => KernelInt2
      );
end architecture arch_top;
  

pixel_to_matrix.vhd

 library ieee;
use ieee.std_logic_1164.all;

 
-----------------------
-- ENTITY DEFINITION --
-----------------------
entity pixel_to_matrix is
  port (
    KERNEL_OUT : out StdVectorArrayTp
    );
end pixel_to_matrix;


architecture arch_pixel_to_matrix of pixel_to_matrix is
begin

end architecture arch_pixel_to_matrix;
  

style_pack.vhd

 
library IEEE;
use IEEE.std_logic_1164.all;


package style_pack is

  type StdVectorArrayTp is array (integer range <>) of std_logic_vector;

end style_pack;

package body style_pack is


end style_pack;
  

Я опубликовал тот же вопрос в https://forums.xilinx.com/t5/Synthesis/VHDL-2008-width-mismatch-on-multiple-instantiations/td-p/1164467

где я загрузил код с проектом Vivado https://forums.xilinx.com/xlnx/attachments/xlnx/SYNTHBD/36597/2/project_1.zip

Редактировать :

Проект с 3D-массивом StdVectorArrayTp https://forums.xilinx.com/xlnx/attachments/xlnx/SYNTHBD/36602/1/project_2.zip

Комментарии:

1. У Vivado было много исправлений vhdl2008 в vivado 2019, особенно 2019.2. Вы пробовали более современную версию? (Может быть, 2020.1?)

2. Пробовал в Vivado 2019.1. На самом деле мы вернулись к версии 2019.1 из-за некоторых проблем с IP-адресами поставщиков. Я просто добавил некоторые обобщения в pixel_to_matrix и не использовал их, Vivado не выдал ошибку.

3. Тогда @user1155120 выглядит как ошибка инструмента. Но почему приведенный здесь код не является минимально воспроизводимым примером ?

4. Похоже, что конкретная версия Vivado не может достичь достаточной глубины, чтобы обеспечить ограничение подтипа из фактического. Код в zip-файле будет проанализирован, доработан и смоделирован с использованием последней версии ghdl, он выглядит допустимым. UG901 в различных версиях Vivado не дает представления, что указывает на то, что вы будете зависеть от исправления ошибки.

5. @user1155120 Я добавил несколько фиктивных дженериков, тогда проблем не было. Я думал о глубоких массивах. Я отредактирую вопрос, чтобы включить 3D-массив.