Функция разрешения VHDL-2008 для универсального типа - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь создать компонент, который использует универсальный тип.Внутри этого компонента я хотел бы иметь возможность использовать функции, которые были ранее определены для этих типов.Рассмотрим следующий пример:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

package generic_type_pkg is
    function increment(x: unsigned) return unsigned;

    function increment(x: signed) return signed;

end package;

package body generic_type_pkg is
    function increment(x: unsigned) return unsigned is

    begin
        return x + 1;
    end function increment;

    function increment(x: signed) return signed is

    begin
        return x + 1;
    end function increment;
end;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

library common;
use common.generic_type_pkg.all;

entity generic_type is
    generic(
        type        type_t
    );
    port(
        clk         : in  std_logic;

        din         : in  type_t;
        dout        : out type_t
    );
end;

architecture rtl of generic_type is

begin

    process(clk)
    begin
        if rising_edge(clk) then
            dout <= increment(din);
        end if;
    end process;
end;

Я использую следующий код для создания экземпляра этого компонента:

i_generic_type: entity common.generic_type(rtl)
generic map(
    type_t => unsigned
)
port map(
    clk => clk,
    din => din,
    dout => dout
);

Если я скомпилирую это с помощью questasim, я получу следующую ошибку:

** Ошибка: * / generic_type.vhd (52): (vcom-1600) Нет возможных записей для подпрограммы «инкремент».Видимые подпрограммы: (явный) generic_type_pkg.increment [UNSIGNED return UNSIGNED] в * / generic_type.vhd (6) (явный) generic_type_pkg.increment [SIGNED return SIGNED] в *** / generic_type.vhd (8)

Книга VHDL-2008 Просто новый материал утверждает, что мне нужно предоставить универсальную функцию для сущности.Добавив function increment ( x: type_t) return type_t к шаблонам, я могу устранить ошибку компиляции.Я недоволен этим, потому что это означает, что мне нужно передать каждую функцию, которую я хочу использовать этому компоненту (например, приращение, декремент, мульт, сдвиг, ...).Это быстро станет не поддерживаемым.

Есть ли способ разрешить эти общие функции при компиляции компонента верхнего уровня?

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете сделать это.Когда вы определяете обобщенную функцию, вы можете сказать ей использовать видимую функцию по умолчанию, используя <>

generic (
  type t;
  function increment(x : t) return t is <>
);

Затем, когда вы присваиваете тип t, если вы не задаете явное назначение функции приращения, это займетфункция, которая соответствует сигнатуре.

Я сделал это, чтобы определить универсальную функцию «match_x», где любое значение X в ожидаемом результате совпадает с чем-либо в фактическом результате:

function match_X_generic generic ( type data_t;
                                   function to_string(d : data_t) return string is <> 
)
                         parameter( act, exp    : data_t )
                         return boolean;

function match_x      is new match_X_generic generic map (std_logic_vector);
function match_x      is new match_X_generic generic map (unsigned        );
function match_x      is new match_X_generic generic map (signed          );

Здесь функции to_string автоматически поступают из пакетов std_logic_1164 или numeric_std.Я могу предоставить шестнадцатеричные версии, подключившись к to_hstring:

function match_x_hex  is new match_X_generic generic map (std_logic_vector, to_hstring);
function match_x_hex  is new match_X_generic generic map (unsigned        , to_hstring);
function match_x_hex  is new match_X_generic generic map (signed          , to_hstring);

Так что теперь, пока функция to_string определена и видима, я могу создать эту функцию для любого пользовательского типа:

function match_x is new match_X_generic generic map ( data_t => axis_trans_t        );
...