Ошибка неподдерживаемого атрибута

Я написал функцию VHDL vectorize() для преобразования массива std_logic_vector (тип slv_1d_array_type в моем коде) в std_logic_vector.

Vivado 2018.2 генерирует эту ошибку [Synth 8-5882] found unsupported attribute ["test_top.vhd":41] в приведенном ниже примере. Я настроил Vivado на использование VHDL-2008.

Как я могу заставить эти атрибуты 'length работать, чтобы избежать передачи размера массива?

-- Libraries
------------

library ieee;
use ieee.std_logic_1164.all;

------------------------------------------------------------------------------------------------------------------------
-- Entity
------------------------------------------------------------------------------------------------------------------------

entity test_top is
    generic(
        DATA_WIDTH : positive := 32
    );

    port(
        O_DATA    : out std_logic_vector(DATA_WIDTH - 1 downto 0)
    );
end entity test_top;

------------------------------------------------------------------------------------------------------------------------
-- Architecture
------------------------------------------------------------------------------------------------------------------------

architecture rtl of test_top is

    --------------------------------------------------------------------------------------------------------------------
    -- Types definition
    --------------------------------------------------------------------------------------------------------------------

    type slv_1d_array_type is array (natural range <>) of std_logic_vector; -- One-dimensional std_logic_vector array type.

    --------------------------------------------------------------------------------------------------------------------
    -- Functions declaration
    --------------------------------------------------------------------------------------------------------------------

    function vectorize(constant SLV_1D_ARRAY : in slv_1d_array_type) return std_logic_vector is
        variable vector_v : std_logic_vector(SLV_1D_ARRAY'length * SLV_1D_ARRAY'element'length - 1 downto 0);
    begin
        for i in SLV_1D_ARRAY'range loop
            vector_v(SLV_1D_ARRAY'element'length * (i + 1) - 1 downto SLV_1D_ARRAY'element'length * i) := SLV_1D_ARRAY(i);
        end loop;

        return vector_v;
    end function vectorize;

    --------------------------------------------------------------------------------------------------------------------
    -- Signals declaration
    --------------------------------------------------------------------------------------------------------------------

    signal data_r : slv_1d_array_type(0 to DATA_WIDTH / 8 - 1)(7 downto 0) := (others => (others => '0'));

begin

    O_DATA <= vectorize(data_r);

end architecture rtl;

person wgg_71    schedule 26.07.2018    source источник
comment
Вы пробовали без квалификатора constant?   -  person Renaud Pacalet    schedule 26.07.2018
comment
@RenaudPacalet Та же ошибка с классификатором constant или без него.   -  person wgg_71    schedule 26.07.2018
comment
Я не знаю, что в VHDL есть атрибут 'element. Вместо этого попробуйте что-то вроде SLV_1D_ARRAY(SLV_1D_ARRAY'low)'length.   -  person Juergen    schedule 26.07.2018
comment
@Juergen Спасибо, Vivado принимает вашу работу. 'element — это новый атрибут VHDL-2008, который возвращает тип элемента. Согласно золотому справочному руководству Doulos VHDL: A'ELEMENT Элемент подтипа A   -  person wgg_71    schedule 26.07.2018
comment
Есть атрибут 'element :). Но вы должны попробовать обходной путь от @Juergen   -  person Paebbels    schedule 28.07.2018
comment
Vivado 2018.1 полностью не работает с VHDL-2008. Даже в Vivado 2018.2 есть серьезные проблемы с обработкой частично ограниченных типов — вы используете один из них.   -  person Paebbels    schedule 28.07.2018


Ответы (1)


Согласно UG901 в главе 6 "< em>Поддержка языка VHDL-2008", атрибут 'element не упоминается. Так что официально не поддерживается.

Эта тема с форумов Xilinx говорится, что он плохо поддерживается и был удален, начиная с Vivado 2016.3.

Однако приведенный выше пример кода принимается ModelSim 10.6c.

Обходной путь, предоставленный @Juergen, работает, как и ожидалось, с Vivado 2018.2. Вот обновленная версия примера, включая обходной путь:

-- Libraries
------------

library ieee;
use ieee.std_logic_1164.all;

------------------------------------------------------------------------------------------------------------------------
-- Entity
------------------------------------------------------------------------------------------------------------------------

entity test_top is
    generic(
        DATA_WIDTH : positive := 32
    );

    port(
        O_DATA    : out std_logic_vector(DATA_WIDTH - 1 downto 0)
    );
end entity test_top;

------------------------------------------------------------------------------------------------------------------------
-- Architecture
------------------------------------------------------------------------------------------------------------------------

architecture rtl of test_top is

    --------------------------------------------------------------------------------------------------------------------
    -- Types definition
    --------------------------------------------------------------------------------------------------------------------

    type slv_1d_array_type is array (natural range <>) of std_logic_vector; -- One-dimensional std_logic_vector array type.

    --------------------------------------------------------------------------------------------------------------------
    -- Functions declaration
    --------------------------------------------------------------------------------------------------------------------

    function vectorize(constant SLV_1D_ARRAY : in slv_1d_array_type) return std_logic_vector is
        variable vector_v : std_logic_vector(SLV_1D_ARRAY'length * SLV_1D_ARRAY(SLV_1D_ARRAY'low)'length - 1 downto 0);
    begin
        for i in SLV_1D_ARRAY'range loop
            vector_v(SLV_1D_ARRAY(SLV_1D_ARRAY'low)'length * (i + 1) - 1 downto SLV_1D_ARRAY(SLV_1D_ARRAY'low)'length * i) := SLV_1D_ARRAY(i);
        end loop;

        return vector_v;
    end function vectorize;

    --------------------------------------------------------------------------------------------------------------------
    -- Signals declaration
    --------------------------------------------------------------------------------------------------------------------

    signal data_r : slv_1d_array_type(0 to DATA_WIDTH / 8 - 1)(7 downto 0) := (others => (others => '0'));

begin

    O_DATA <= vectorize(data_r);

end architecture rtl;
person wgg_71    schedule 26.07.2018