Как я могу написать псевдоним в VHDL (post-87; т.е. 93, 2008) для вызова функции? - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть вызов функции для упрощения преобразования сигнала, который в противном случае повторялся бы по всему исходному коду.

Теперь, в качестве дальнейшей оптимизации, я хочу сделать довольно сложные вызовы функций (с двумя параметрами, которые в основном являютсято же самое) удобочитаемее и легче писать с использованием псевдонима.

Стандарты VHDL после 87 года допускают псевдонимы для объектов, не относящихся к данным, например, вызовов подпрограмм.В поисках решения я узнал, что функции требуют подписи как части объявления псевдонима.Однако я не смог найти документацию, которая помогла мне объявить псевдоним для моей функции, которая работает с Synopsys VCS.

function discard_elem (
  signal discard_vector : in std_ulogic_vector(63 downto 0);
  signal id             : in std_ulogic_vector(5 downto 0))
  return std_ulogic is
begin
  return discard_vector(to_integer(unsigned(id)));
end discard_elem;

alias discard_current_elem is 
  discard_elem(discard_vector_i, interface_i.id) [ return std_ulogic ];

VCS сообщает о следующей ошибке, а затем завершается с ошибкой сегментации:

Error-[ANL-ALIAS-BADSIGNAT] Bad signature in alias declaration
                                                                          ^
  No subprogram or enumeration literal matches the signature of the alias 
  declaration DISCARD_ELEM.
  Please verify that the signature matches the parameter and result type 
  profile of exactly one of the subprograms or enumeration literals.

Неверное определение псевдонима или это проблема с инструментом?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Псевдонимы - это просто переименование одной и той же функции с одинаковыми параметрами (опубликовано @Matthew Taylor).Вы не можете изменить сигнатуру, поэтому псевдоним должен вызываться с теми же параметрами, что и исходная функция.

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

signal discard_vector_i : std_ulogic_vector(63 downto 0);
signal interface_id     : some_record_type;

impure function discard_current_elem return std_ulogc is 
begin
  return discard_elem(discard_vector_i, interface_i.id); -- scope used to access these parameters
end function;
0 голосов
/ 17 декабря 2018

Я думаю, что вы путаете псевдоним с макросом (в Verilog и других языках).Вы не можете включить в псевдоним facts (аргументы функции).Итак, вы можете сделать это:

alias discard_current_elem is discard_elem[std_ulogic_vector, std_ulogic_vector return std_ulogic];

, но я не думаю, что это то, на что вы надеялись.

https://www.edaplayground.com/x/5QS_

...